ApplicationDidEnterBackground和UIWebview

时间:2011-06-17 18:32:01

标签: uiwebview stringbyevaluatingjavascr

我的应用程序存在问题。 我正在构建一个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,

巴特

2 个答案:

答案 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消息的问题。希望这也可以帮到你。