毫无例外,我见过的使用didReceiveRemoteNotification:fetchCompletionHander:
的每个代码示例都是这样的:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
{
do something
completionHandler(UIBackgroundFetchResult.NewData)
}
现在,后台推送的主要目的是让应用程序在后台获取数据,因此do something
将是异步的。
此方法的文档说明: “[参考完成处理程序]下载操作完成时执行的块。”
但如果do something
是异步的,则立即调用completionHandler,而不是在操作完成时调用。因此,所有代码示例都与文档不一致。
我一直在一些项目中使用像这样的后台推送/下载,因为它是在没有问题的情况下引入的。但是对于iOS9,我发现来自do Something
的NSURLConnection的任何调用都没有执行(如果在应用程序移动到后台后很快就会发送推送,但如果它在后台运行几分钟则不会发送)< / p>
我想知道这是否与调用completionHander或其他什么有关。我打算做一些实验来测试一下,但同时也想知道其他人是否看到过这种iOS9行为的变化?
[请不要轻率无益的评论关于NSURLConnection在iOS 9中被弃用,不推荐并不意味着不可用,并且它不应该意味着不再工作]
答案 0 :(得分:0)
通常情况下,您需要在&#34;做某事&#34;然后,您将通过NSURLSession实现后台会话。你创造和&#34;恢复&#34;下载任务然后iOS将在完成后再次唤醒您的应用程序(通过代理的didFinishDownloading)。此时,您有更多时间处理响应或将其存储在磁盘上的某个位置,以便稍后在应用程序处于活动状态时进行处理。
您只有大约30秒的时间来调用完成处理程序。如果您不想使用NSURLSession并想要使用NSURLConnection,那么在通过NSURLConnection进行异步调用返回之后,您可以尝试不调用完成处理程序。但同样,如果它需要太长时间,那么iOS无论如何都会杀死你的进程。
我希望这不是没有用的。
我有一个不同的问题,我使用的是NSURLSession,它在iOS8中工作正常,但在iOS9中,它几乎在启动下载请求后立即调用applicationWillTerminate。一旦发生这种情况,应用程序就是DOA,直到再次手动启动。