【问题标题】:AFNetworking error 53 during attempted background fetch尝试后台获取期间出现 AFNetworking 错误 53
【发布时间】:2019-04-17 05:47:47
【问题描述】:

在更新我的应用程序以支持后台应用程序刷新时,我遇到了 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 '(null)' (0) [31.9163 s]:错误域=NSPOSIXErrorDomain Code=53 "软件导致连接中止" UserInfo={NSErrorFailingURLStringKey=https://www.example.com/orders, _kCFStreamErrorDomainKey=1,NSErrorPeerAddressKey={长度=16,容量=16,字节= 0x100201bb3e80187c0000000000000000},_kCFStreamErrorCodeKey=53, NSErrorFailingURLKey=https://www.example.com/orders}

【问题讨论】:

  • 你的应用支持fetch后台模式吗?
  • @mag_zbc 是的,后台获取功能已打开,即使 performFetchWithCompletionHandler 正在被调用。

标签: ios afnetworking afnetworking-2 ios12 afhttprequestoperation


【解决方案1】:

以 0.1 秒延迟启动 fetch 作为后台任务解决了这个问题:

-(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;
                           }
        ];
    });
}

【讨论】:

  • 每当我在下载过程之间按下主页按钮时都会收到此错误。
  • 查看原始帖子 - [OrdersService performFetch] 以异步方式实现,一旦从网络请求,但在处理任何响应之前,它将返回。这意味着您的新数据完成处理程序可能在网络完成之前运行,导致您的应用程序被重新挂起,然后中止开放网络调用 - 添加延迟可能会让网络运行时间更长 - 但理想情况下你d 在成功或失败块运行后调用完成处理程序。希望这会有所帮助。
【解决方案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

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 2016-11-23
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 2012-06-24
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多