我已经启用了后台模式和远程通知任务,以便在应用程序接收到推送通知时,在后台下载一个小文件(100kb)。 我使用了配置下载会话的方式:
NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
[backgroundConfiguration setAllowsCellularAccess:YES];
self.backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
并使用以下方法激活它
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[hostComponents URL]];
[request setAllowsCellularAccess:YES];
NSMutableData *bodyMutableData = [NSMutableData data];
[bodyMutableData appendData:[params dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[bodyMutableData copy]];
_downloadTask = [self.backgroundSession downloadTaskWithRequest:request];
[self.downloadTask resume];
现在,只有当我连接到Wifi或蜂窝网络时,一切都能正常运作。但是,如果我用数据线将iPhone连接到xCode,然后断开iPhone并在蜂窝网络上接收推送通知,代码会停止在[self.downloadTask resume];
这行而不调用URL。
处理这些操作的类是一个NSURLSessionDataDelegate、NSURLSessionDownloadDelegate和NSURLSessionTaskDelegate,因此实现了:
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
我已经尝试在[self.downloadTask resume]
之后插入一个立即显示的UILocalNotification
来进行调试,但是它会在5分钟后被调用,并说self.downloadTask.state
处于“暂停”状态。
这种奇怪的行为是由什么引起的?