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]完成处理程序!