ApplicationDidEnterBackground和UIWebview
我遇到了应用程序的问题。 我正在构建一个WebApp的应用程序。 因此,该应用程序在服务器上运行,并与UIWebview进行交互。ApplicationDidEnterBackground和UIWebview
所以让我解释一下我在这里想要达到的目标。 在网页上我有几个JavaScript函数,我与这些功能进行交互trought的stringByEvaluatingJavaScriptFromString 例如: 代码:
[webView stringByEvaluatingJavaScriptFromString:@"tagMe()"];
和服务器将执行此命令并执行以下操作
它设置器的URLPrefix到ServerReply://(),我抓住这个与
- (BOOL)webViewUIWebView *)webView shouldStartLoadWithRequestNSURLRequest *)request navigationTypeUIWebViewNavigationType)navigation Type
因此,如果URL有一个前缀ServerReply://它运行在我的应用程序的功能。
到目前为止一切都很好,但当用户按下HOME按钮或他得到一个电话。该ApplicationDidEnterBackground方法将被调用,我想调用另一个JS功能
代码:
[webView stringByEvaluatingJavaScriptFromString:@"gettingClosed()"];
,然后服务器应该给我带前缀的SaveClientData一个URL://(somestring)
所以该应用程序关闭,这是行不通的.... 我的代码是这样的
代码:
//AppDelegate.m
- (void)applicationDidEnterBackground:(UIApplication *)application {
[webViewController killTrigger];
}
//webViewController. m
-(void)killTrigger{
[webView stringByEvaluatingJavaScriptFromString:@"gettingClosed()"];
}
,这不工作,但如果我这样做 代码:
- (void)applicationDidEnterBackground:(UIApplication *)application {
[webViewController killTrigger];
}
//webViewController. m
-(void)killTrigger{
NSLog(@"killTrigger got called");
}
当我离开应用程序我得到的日志消息...
是有可能这样做[webView的stringByEvaluatingJavaScriptFromString: @“gettingCl osed()”];如果我的应用移动到背景?还是有不同的方法来获得相同的结果......?
TNX提前,
巴特
我也有类似的情况,并有一些奇怪的行为。我还没有解决问题,但我有一些发现。我会与你分享,所以也许你可以在此发展并找到解决方案。
我观察到,通常执行applicationDidEnterBackground调用的JS代码(以及applicationWillResignActive调用的代码)。
为了测试这个,我为所有的JS代码设置了一个全局计数器,我在进入BG之前递增它,并且在后台检查它的状态(检查它我使用了一个肮脏的解决方法,我基本上创建了一个新的名为cntr _#{counter value})的文件,所以我假定JS函数被调用(因为计数器递增)。
但是,在增加计数器之前,我的JS函数还会发送一个XMPP消息。当我嗅探网络流量时,发现XMPP消息在应用恢复后立即发送。现在有两种可能性:或者向BG的转换没有创建XMPP连接的可能性(我认为这不合理),要么XMPP函数异步发生并且其执行被推迟。
更新。
我发现我用于XMPP的JS库实际上是异步的,并且在其队列中调用flush可以解决丢失的XMPP消息的问题。希望这可以帮助你。
我知道这个问题很旧,但我仍想发布一个解决方案。我有一个类似的问题:当我的应用程序进入后台时,我想关闭一个websocket,但是在这可能会通过之前,似乎iOS暂停了该线程。这个问题的解决是注册后台任务:
- (void)applicationDidEnterBackground
{
self.cleanupBackgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.cleanupBackgroundTaskIdentifier];
self.cleanupBackgroundTaskIdentifier = UIBackgroundTaskInvalid;
}];
[self.remoteWebView stringByEvaluatingJavaScriptFromString:@"websocket.close();"];
[self performSelector:@selector(cleanupBackgroundTaskTimeout) withObject:nil afterDelay:10.0];
}
- (void)cleanupBackgroundTaskTimeout
{
[[UIApplication sharedApplication] endBackgroundTask:self.cleanupBackgroundTaskIdentifier];
}
这是告诉我们要继续在后台运行的iOS,然后关闭WebSocket的。然后,我们给websocket足够的时间关闭(在这种情况下为10秒),然后结束后台任务。
请注意,你传递给beginBackgroundTaskWithExpirationHandler:
块是不是在后台执行的代码,调用此方法只是告诉你的应用程序不应该立刻暂停的iOS。
另外,请注意,无法保证您能够获得额外的后台工作时间,并且您必须及时拨打endBackgroundTask:
(通常为10分钟),否则iOS会终止您的应用程序。