AFNetworking ошибка 53 во время попытки фоновой выборки - PullRequest
0 голосов
/ 14 ноября 2018

При обновлении приложения для поддержки фонового обновления я столкнулся с проблемой 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 с]: Ошибка домена = 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 голосов
/ 06 августа 2019

Некоторые из приведенных ниже решений были полезны для решения Lower protocol stack error: 53.

Информационная ветка об AFNetworking GitHub с соответствующими деталями и справочной информацией: Проблема AFNetworking

Прочитайте комментарий в конце для получения подробной информации:

С точки зрения обходных путей, здесь можно сделать три вещи, и может иметь смысл выполнить все три или некоторое подмножество, в зависимости от требований вашего реального приложения.Для остроумия:

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: как сделать фоновый выбор

Кроме того, хороший источник информации о фоновых задачах: форум Apple Dev

0 голосов
/ 15 ноября 2018

Запуск выборки в качестве фоновой задачи с задержкой 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;
                           }
        ];
    });
}
...