ApplicationDidEnterBackground和UIWebview

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会终止您的应用程序。