ios – 奇怪的NSURLSessionDownloadTask行为超过蜂窝(不是wifi)

前端之家收集整理的这篇文章主要介绍了ios – 奇怪的NSURLSessionDownloadTask行为超过蜂窝(不是wifi)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当应用程序收到推送通知时,我已经启用了具有远程通知任务的后台模式,以便在后台下载一个小文件(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(现在显示为’now)的调试行,但在5分钟后调用,并指出self.downloadTask.state被“暂停”

什么是这个奇怪的行为?

解决方法

@H_404_22@ NSURLSessionConfiguration类参考文档在这里:

https://developer.apple.com/Library/ios/documentation/Foundation/Reference/NSURLSessionConfiguration_class/Reference/Reference.html#//apple_ref/occ/instp/NSURLSessionConfiguration/discretionary

说:自由财产:

Discussion@H_502_30@

When this flag is set,transfers are more likely to occur when plugged
into power and on Wi-Fi. This value is false by default.

This property is used only if a session’s configuration object was
originally constructed by calling the backgroundSessionConfiguration:
method,and only for tasks started while the app is in the foreground.
If a task is started while the app is in the background,that task is
treated as though discretionary were true,regardless of the actual
value of this property.@H_502_30@ For sessions created based on other
configurations,this property is ignored.

这似乎意味着如果下载在后台启动,操作系统总是有权决定是否和何时进行下载.在完成这些任务之前,操作系统总是等待WiFi连接.

我的经验支持这个猜想.我发现,当设备处于蜂窝状态时,我可以发送几个下载通知.他们仍然卡住当我将设备切换到wifi时,他们都会通过.

猜你在找的iOS相关文章