在后台状态冻结http请求
Freezing http requests in background state
当应用程序处于后台状态时,应用程序有很多任务,基本上与蓝牙加密狗一起工作,并且 receive/sending 数据到服务器。有时后台状态下的app发送一个query,系统是"freeze in"这个query。启动应用程序后,系统为 "freeze out",我们有
Error Domain=kCFErrorDomainCFNetwork Code=-1001 "The request timed out.
应用目前使用最新的AFNetworking 3.1.0,以及BFTask helper。
了解更多详情。
想象一下,用户出于某种原因使用应用程序,在应用程序进入后台状态(用户按下主页按钮或锁定设备)后,应用程序通常会继续在后台状态下工作。系统或用户可以终止该应用程序。应用程序可以在唤醒时刻进行一些用户交互(通过地理定位服务、地理围栏)后唤醒,应用程序正在重新启动,并向服务器发送查询,检查用户(授权、获取新令牌等)。此时我们可以在日志中看到:
> Request method: POST url: https://******/v1/account/token headers: {
UserName = "***@***.com";
"grant_type" = password;
password = ****
} at time: 2016-08-15 15:30:45 +0000
代码:
if ([request.method isEqualToString:@"GET"]) {
return [manager GET:request.url parameters:request.params progress:nil success:^(NSURLSessionTask *operation, id responseObject) {
} failure:^(NSURLSessionTask *operation, NSError *error) {
processError(operation, error);
}
}];
一段时间后用户启动应用程序,这段代码试图继续执行,但出现超时错误。
error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSUnderlyingError=0x156d8ce10
{Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)"
UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=https://******/v1/account/token, NSErrorFailingURLKey=https://******/v1/account/token, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=The request timed out.}
at time: 2016-08-15 15:46:28 +0000
当用户再次启动应用程序时,时间差大约 16 分钟。
这可以在 http 查询的另一部分
问题是,为什么 iOS 在后台冻结查询,以及如何解决这个问题。
经过一段时间对网络的不同实验,我终于发现了问题。启用 CFNetwork 诊断后,我们可以获得有关应用程序中所有请求的更多信息。并且 CFNetwork 得到的不是 -1001 错误,而是所有错误都标记为 Code=-1005 “null”,但 -1005 错误是 "The network connection was lost"。我不知道为什么 AFNetworking 会出现这个错误,但这是有道理的。当我们连接到 Wi-Fi 或 3G/4G 并且没有互联网连接(仅限本地)时,问题就开始了,此时应用程序正在尝试执行请求,此时 CFNetwork 警报 -1005 错误,但是 AFNetworking return 错误 -1001 代码。这是我的主题问题。
目前,我还没有很好的解决方案,在每个请求尝试 ping 主机之前,如果我们有答案就请求。也许你知道更好的方法?
当应用程序处于后台状态时,应用程序有很多任务,基本上与蓝牙加密狗一起工作,并且 receive/sending 数据到服务器。有时后台状态下的app发送一个query,系统是"freeze in"这个query。启动应用程序后,系统为 "freeze out",我们有
Error Domain=kCFErrorDomainCFNetwork Code=-1001 "The request timed out.
应用目前使用最新的AFNetworking 3.1.0,以及BFTask helper。
了解更多详情。 想象一下,用户出于某种原因使用应用程序,在应用程序进入后台状态(用户按下主页按钮或锁定设备)后,应用程序通常会继续在后台状态下工作。系统或用户可以终止该应用程序。应用程序可以在唤醒时刻进行一些用户交互(通过地理定位服务、地理围栏)后唤醒,应用程序正在重新启动,并向服务器发送查询,检查用户(授权、获取新令牌等)。此时我们可以在日志中看到:
> Request method: POST url: https://******/v1/account/token headers: {
UserName = "***@***.com";
"grant_type" = password;
password = ****
} at time: 2016-08-15 15:30:45 +0000
代码:
if ([request.method isEqualToString:@"GET"]) {
return [manager GET:request.url parameters:request.params progress:nil success:^(NSURLSessionTask *operation, id responseObject) {
} failure:^(NSURLSessionTask *operation, NSError *error) {
processError(operation, error);
}
}];
一段时间后用户启动应用程序,这段代码试图继续执行,但出现超时错误。
error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSUnderlyingError=0x156d8ce10
{Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)"
UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=https://******/v1/account/token, NSErrorFailingURLKey=https://******/v1/account/token, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=The request timed out.}
at time: 2016-08-15 15:46:28 +0000
当用户再次启动应用程序时,时间差大约 16 分钟。 这可以在 http 查询的另一部分
问题是,为什么 iOS 在后台冻结查询,以及如何解决这个问题。
经过一段时间对网络的不同实验,我终于发现了问题。启用 CFNetwork 诊断后,我们可以获得有关应用程序中所有请求的更多信息。并且 CFNetwork 得到的不是 -1001 错误,而是所有错误都标记为 Code=-1005 “null”,但 -1005 错误是 "The network connection was lost"。我不知道为什么 AFNetworking 会出现这个错误,但这是有道理的。当我们连接到 Wi-Fi 或 3G/4G 并且没有互联网连接(仅限本地)时,问题就开始了,此时应用程序正在尝试执行请求,此时 CFNetwork 警报 -1005 错误,但是 AFNetworking return 错误 -1001 代码。这是我的主题问题。
目前,我还没有很好的解决方案,在每个请求尝试 ping 主机之前,如果我们有答案就请求。也许你知道更好的方法?