didReceiveRemoteNotification:fetchCompletionHandler:下载冻结

我们的应用程序利用didReceiveRemoteNotification: fetchCompletionHandler:方法UIApplicationDelegate在收到content-available推送通知时开始下载。

应用程序采取的各个步骤:

[1]接收通知

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { NSLog(@"Remote download push notification received"); [AFHTTPSessionManager_Instance downloadFile:completionHandler]; } 

[2]开始一个新的下载任务

 - (void)downloadFile:(void (^)(UIBackgroundFetchResult))completionHandler { NSURLSessionDownloadTask *task = [AFHTTPSessionManager_Instance downloadTaskWithRequest:request progress:nil destination:nil completionHandler:nil]; [task resume]; NSLog(@"Starting download of %@", request.URL.absoluteString); // Some additional time to start the download dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ NSLog(@"Completion handler!"); completionHandler(UIBackgroundFetchResultNewData); }); 

[3]处理下载

 [self setDownloadTaskDidFinishDownloadingBlock:^NSURL *(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location) { NSLog(@"Download complete!"); // ... Create save path return path; }]; 

这导致这样的日志:

 2015-09-21 15:38:57.145 App[315:20933] Remote download push notification received 2015-09-21 15:38:57.485 App[315:20933] Starting download of http://domain.com/file.mov 2015-09-21 15:38:59.654 App[315:20933] Completion handler! 2015-09-21 15:39:06.315 App[315:20933] Download complete! 

但有时(完全随机)我看到这样的日志:

 2015-09-21 15:38:57.145 App[315:20933] Remote download push notification received 2015-09-21 15:38:57.485 App[315:20933] Starting download of http://domain.com/file.mov 2015-09-21 15:38:59.654 App[315:20933] Completion handler! 

换句话说,下载永远不会完成,它看起来像应用程序冻结其后台会话。 因为当我将应用程序放回前台时,下载将在某个时间点完成。

有没有人见过这种行为?
仅供参考:我启用了正确的function,使用了正确的configuration文件,应用程序有权在后台运行。

更新:在开发后台pipe理器时,我们在AFNetworking 2.0和后台传输中使用了答案/评论

开始下载后,您正在调用完成处理程序! 我很确定你应该在下载开始后2秒内完成下载完成处理程序。 换句话说,你应该调用completionHandler(UIBackgroundFetchResultNewData); 里面self setDownloadTaskDidFinishDownloadingBlock...和corse通过CompletionBlock不知何故。

 [self setDownloadTaskDidFinishDownloadingBlock:^NSURL *(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location) { NSLog(@"Download complete!"); // ... Create save path NSLog(@"Completion handler!"); completionHandler(UIBackgroundFetchResultNewData); return path; }]; 

正确的日志应该是这样的:

2015-09-21 15:38:57.145 App [315:20933]收到远程下载推送通知

2015-09-21 15:38:57.485 App [315:20933]开始下载http://domain.com/file.mov

2015-09-21 15:38:59.654 App [315:20933]下载完成!

2015-09-21 15:39:06.315 App [315:20933]完成处理程序!