尝试后台获取期间出现AFNetworking错误53

时间:2018-11-14 09:47:01

标签: ios afnetworking afnetworking-2 ios12 afhttprequestoperation

在更新应用程序以支持后台应用程序刷新时,我遇到了AFNetworking问题。

我得到NSPOSIXErrorDomain Code=53 "Software caused connection abort"。该问题似乎发生在iOS 12中,其中的后台连接已终止。

AFNetworking 2.6.3用于进行提取。

AppDelegate.m

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [OrdersService performFetch];
    completionHandler(UIBackgroundFetchResultNewData);
}

OrdersService.m

-(void) performFetch {
    [[AFHTTPRequestOperationManager new] GET:@"https://www.example.com/orders"
        parameters:nil
           success:^(AFHTTPRequestOperation *operation, id responseObject) {

           }
           failure:^(AFHTTPRequestOperation *operation, NSError *error) {

           }
    ];
}

控制台输出:

  

[错误] GET'(空)'(0)[31.9163 s]:错误域= NSPOSIXErrorDomain   代码= 53“软件导致连接中止”   UserInfo = {NSErrorFailingURLStringKey = https://www.example.com/orders,   _kCFStreamErrorDomainKey = 1,NSErrorPeerAddressKey = {长度= 16,容量= 16,字节=   0x100201bb3e80187c0000000000000000},_ kCFStreamErrorCodeKey = 53,   NSErrorFailingURLKey = https://www.example.com/orders}

2 个答案:

答案 0 :(得分:4)

以0.1秒的延迟启动作为后台抓取任务解决了该问题:

-(void) performFetch {
    __block UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"GET /orders" expirationHandler:^{
        // EXPIRED
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task, preferably in chunks.
        [[AFHTTPRequestOperationManager new] GET:@"https://www.example.com/orders"
                        parameters:nil
                           success:^(AFHTTPRequestOperation *operation, id responseObject) {
                               // SUCCESS
                               [[UIApplication sharedApplication] endBackgroundTask:bgTask];
                               bgTask = UIBackgroundTaskInvalid;
                           }
                           failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                               // FAILURE
                               [[UIApplication sharedApplication] endBackgroundTask:bgTask];
                               bgTask = UIBackgroundTaskInvalid;
                           }
        ];
    });
}

答案 1 :(得分:2)

下面链接的某些解决方案有助于解决Lower protocol stack error: 53

AFNetworking GitHub上的信息性线程,其中包含相关详细信息和背景信息:AFNetworking issue

请阅读结尾处的评论以获取有见地的详细信息:

  

就变通办法而言,您可以在此处执行三件事,根据实际应用程序的要求,全部或三个子集都可能有意义。发挥作用:

     

A。如果您定期跳入和跳出应用程序(例如,将用户跳出Safari,以便他们可以执行某些身份验证任务,然后希望Safari将用户跳回应用程序),则可以使用UIApplication后台任务,以防止您的应用在这些反弹期间被暂停。

     

这种方法只会让您的应用运行几分钟,但是如果这足以满足普通用户的情况,那就值得这样做。

     

B。您可以自己重试请求。即使您没有遇到这个问题,这通常也是个好主意。瞬态问题很多,可能导致请求失败,而一次重试通常会使您越过该错误,而无需进行进一步的补救工作。

     

这里明显的陷阱是幂等。您可以毫无疑问地重试幂等请求,但是如果您想重试非幂等请求,则需要一些特定于应用程序的狡猾逻辑。

     

C。您可以在进入后台时使会话无效,然后在回到前台时重新创建会话。新会话不会与旧会话共享任何连接,因此不会发生此问题。

     

正如我之前提到的,组合方法可能很有意义。例如,A和C可以很好地协同工作,除非您用完了后台执行时间,否则可以避免会话无效的代价。您可能要执行B,因为它在此问题空间之外有很多好处。

就我而言,它是在iOS12.3设备上发生的

2019-08-05 17:38:50.988880-0700 myApp[2988:1589883] [BoringSSL] nw_protocol_boringssl_error(1584) [C15.1:4][0x10dd6e700] Lower protocol stack error: 53
2019-08-05 17:38:50.990132-0700 myApp[2988:1589883] TIC Read Status [15:0x281d59d40]: 1:53
2019-08-05 17:38:50.995585-0700 myApp[2988:1589883] Task <D62956CC-6C2B-4D5E-B1DA-0A5CA2BB60EF>.<1> HTTP load failed (error code: 53 [1:53])
2019-08-05 17:38:51.000334-0700 myApp[2988:1588479] Task <D62956CC-6C2B-4D5E-B1DA-0A5CA2BB60EF>.<1> finished with error - code: 53

准备将应用程序在后台模式下运行:Apple's doc: How to do background fetch

此外,有关后台任务的良好信息来源:apple dev forum