NSURLSessionTask永不回电无线关闭

问题描述:

当我关闭WiFi连接并在iPhone 6s 10.2模拟器上运行以下代码时,回调永远不会执行。我预计这个回调很快会出现“没有互联网连接”的错误。NSURLSessionTask永不回电无线关闭

NSLog(@"request-start"); 
NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:0]; 
task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    NSLog(@"request-end"); 
}]; 
[task resume]; 

我的问题

我获取数据时,应用程序首次加载。如果wifi关闭,我需要显示一个错误。如果我设置超时时间,它会被遵守 - 但它需要10秒以上,我宁愿不让他们等待。我也尝试使用可达性检测网络状态,但在首次加载应用程序时,网络状态通常为unknown

+0

难道这是因为你使用共享会话的? – matt

+0

“但它需要10秒以上,我宁愿不让他们等待”。我不明白,如果您的连接需要10秒才能收到回复,为什么不设置超时?您需要设置一个超时来处理连接错误和超时。即使“wifi已开启”也不意味着连接将100%工作。您不应该专注于“让人们等待”,而是应该相应地处理错误和用户界面,以便在连接花费比预期更多的时间时向用户显示进度信息。 – 2017-02-20 19:51:19

+0

@matt - 我不确定 - 我尝试了'defaultSessionConfiguration'和'ephemeralSessionConfiguration'并得到了相同的结果 – bendytree

timeoutIntervalForResource

这个属性决定了在此基础上配置会话中的所有任务 资源超时间隔。资源超时 区间控制在放弃之前等待整个资源 传输多长时间(以秒为单位)。资源定时器在启动 请求时启动,并计数,直到请求完成或 达到此超时间隔,以先到者为准。

默认值是7天。

timeoutIntervalForRequest

重要

任何上传或下载由后台会话 是如果原来的请求失败自动重试创建由于 超时任务。要配置上传或下载任务应允许重试或传输的时间长度,应使用 timeoutIntervalForResource属性。

的默认值是60。

所以,没有你们的超时设置,您的连接将7天运行。

通常,NSURLSession后台会话不会使任务失败,如果 线路上出现问题。相反,它会继续寻找 的好时机来运行请求并在当时重试。这继续 ,直到资源超时到期(即,用于创建会话的NSURLSessionConfiguration 对象中的 timeoutIntervalForResource属性中的值)。该 值的当前默认值为一周!

Source

+0

谢谢@Sneak。我没有意识到它是故意设计成“等待重试请求的好时机”。有没有等待重试的好时机提出请求的方法? – bendytree

+0

@bendytree您唯一的选择是:http://*.com/questions/7938650/ios-detect-3g-or-wifi/7938778#7938778,但是,Apple的最佳实践和指南是检查可达性* *之后**您遇到连接错误,显示适当的消息,而不是每个请求。但是,我不知道你的用例是什么,这就是你需要我的朋友。 GL,顺便说一句,你应该设置超时时间,无论如何避免陷入奇怪的东西。 – 2017-02-20 20:35:04

+0

感谢您的帮助。基本上我不希望用户等待完全超时(甚至只是10秒),当显然没有连接时。我想这在iOS上是不可能的。 – bendytree