我的应用程序存在问题。 我正在构建一个webApp的应用程序。 因此,应用程序在服务器上运行,并与UIWebview进行交互。
那么让我解释一下我在这里想要实现的目标。 在网页上我有几个Javascript函数,我与这些函数交互使用了stringByEvaluatingJavaScriptFromString 例: 代码:
[webView stringByEvaluatingJavaScriptFromString:@"tagMe()"];
并且服务器执行此命令并执行以下操作
它将URLPrefix设置为ServerReply://(),我用
来捕获它- (BOOL)webViewUIWebView *)webView shouldStartLoadWithRequestNSURLRequest *)request navigationTypeUIWebViewNavigationType)navigation Type
所以如果URL有Prefix ServerReply://它在我的应用程序中运行一个函数。
到目前为止,一切都很好,但是当用户按下HOME按钮或他接到电话时。将调用ApplicationDidEnterBackground方法,我想调用另一个JS函数
代码:
[webView stringByEvaluatingJavaScriptFromString:@"gettingClosed()"];
然后服务器应该给我一个前缀为SaveClientData://(somestring)的URL
因此应用程序关闭,它不起作用.... 我的代码是这样的
代码:
//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, 巴特答案 0 :(得分:1)
我知道这个问题已经过时了,但我还是想发布一个解决方案。我有一个类似的问题:当我的应用程序进入后台时我想关闭一个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会终止您的申请。
答案 1 :(得分:0)
我有类似的情况并且有一些奇怪的行为。我还没有解决问题,但我有一些发现。我将与您分享,也许您可以在此发展并找到解决方案。
我发现通常会执行applicationDidEnterBackground调用的JS代码(以及applicationWillResignActive调用的代码)。
为了测试这个,我在所有JS代码中设置了一个全局计数器,我在进入BG之前递增它并在后台检查它的状态(为了检查它我使用了一个脏的解决方法,我基本上创建了一个新文件叫做cntr _#{counter value}),所以我假设调用了JS函数(因为计数器递增了)。
但是,在递增计数器之前,我的JS函数也会发送一条XMPP消息。当我嗅探网络流量时,我看到在恢复应用程序后立即发送XMPP消息。现在有两种可能性:转换到BG不可能创建XMPP连接(我认为这是不可信的),XMPP函数异步发生并且其执行被推迟。
<强>更新强>
我发现我用于XMPP的JS库实际上是异步的,并且在其队列上调用刷新解决了丢失的XMPP消息的问题。希望这也可以帮到你。