0

我的应用程序有问题。我正在构建一个属于某种 webApp 的应用程序。所以应用程序在服务器上运行,我通过 UIWebview 与它交互。

所以让我解释一下我在这里想要实现的目标。在网页上我有几个 Javascript 函数,我通过 stringByEvaluatingJavaScriptFromString 示例与这些函数进行交互:代码:

[webView stringByEvaluatingJavaScriptFromString:@"tagMe()"];

服务器执行此命令并执行以下操作

它将 URLPrefix 设置为 ServerReply://() 我用

- (BOOL)webViewUIWebView *)webView shouldStartLoadWithRequestNSURLRequest *)request navigationTypeUIWebViewNavigationType)navigation Type

因此,如果 URL 具有前缀 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 提前,

巴特

4

2 回答 2

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

于 2014-06-27T06:53:42.183 回答
0

我有类似的情况并且有一些奇怪的行为。我还没有解决这个问题,但我有一些发现。我将与您分享,因此也许您可以在此基础上进行开发并找到解决方案。

我观察到通常会执行由 applicationDidEnterBackground 调用的 JS 代码(以及由 applicationWillResignActive 调用的代码)。

为了测试这一点,我为我的所有 JS 代码设置了一个全局计数器,在进入 BG 之前增加它,并在后台检查它的状态(为了检查它,我使用了一个肮脏的解决方法,我基本上创建了一个名为 cntr_# 的新文件{counter value}),所以我假设调用了 JS 函数(因为计数器增加了)。

但是,在递增计数器之前,我的 JS 函数还会发送一条 XMPP 消息。当我嗅探网络流量时,我看到应用程序恢复后立即发送 XMPP 消息。现在有两种可能性:要么过渡到 BG 没有创建 XMPP 连接的可能性(我认为这不合理),要么 XMPP 函数异步发生并且其执行被推迟。

更新。

我发现我用于 XMPP 的 JS 库实际上是异步的,并且在其队列上调用刷新解决了丢失 XMPP 消息的问题。希望这也可以帮助你。

于 2012-01-05T16:01:35.937 回答