冻结后台状态

时间:2016-08-15 16:45:23

标签: ios bluetooth background afnetworking bftask

当应用程序处于后台状态时,应用程序有很多任务,基本上使用蓝牙加密狗,并接收/发送数据到服务器。有时,当处于后台状态的应用程序发送查询时,系统会“冻结”此查询。启动应用程序后,系统“冻结”,我们有

Error Domain=kCFErrorDomainCFNetwork Code=-1001 "The request timed out.

应用程序此时使用最后一个AFNetworking 3.1.0,以及BFTask帮助程序。

了解更多细节。 想象一下,用户出于某种原因使用应用程序,在应用程序将应用程序转到后台状态(用户按下主页按钮或锁定设备)后,应用程序通常会继续在后台状态下工作。系统或用户可以杀死该应用。应用程序可以在唤醒时刻(通过地理定位服务,地理围栏)进行唤醒,应用程序重新启动,并通过检查用户(授权,获取新令牌等)向服务器发送查询。此时我们可以在日志中看到:

> 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会在后台冻结查询,以及如何解决此问题。

1 个答案:

答案 0 :(得分:1)

经过不同的网络实验一段时间后,终于找到了问题。启用CFNetwork诊断后,我们可以获得有关应用程序中所有请求的更多信息。并且CFNetwork没有-1001错误,而是所有错误标记为Code = -1005“null”,但-1005错误是"网络连接丢失"。我不知道为什么AFNetworking得到了这个错误,但这是有道理的。问题从我们连接到Wi-Fi或3G / 4G并且没有互联网连接(仅本地)开始,此时应用尝试做请求,此时CFNetwork提醒-1005错误,但AFNetworking返回错误使用-1001代码。这是我的主题问题。

此时此刻,我没有优雅的解决方案,在每次请求尝试ping主机之前,如果我们有回答请执行此操作。也许你知道更好的方式吗?