SIGSEGV при вызове [NSURLSessionDataDelegate резюме]

Я недавно завершил свой первый проект, используя новую NSURLSession, доступную на iOS 7.

Я создал приложение для изучения всего API NSURLSession, реализуя все виды задач: - Задачи данных - Задачи загрузки - Загруженные задачи

Я также реализовал фоновые загрузки с использованием фоновых сессий. После многих часов отладки и внедрения проб и ошибок я наконец пришел к точке, когда все приложения работают без проблем - для меня это так. Я выпустил его для небольшого числа тестеров (< 5), и некоторые из них столкнулись с ошибкой, которую я не могу воспроизвести или даже отследить.

Определенная часть моего кода - после некоторых несвязанных операций - отвечает за возобновление текущих задач загрузки, доступных в фоновом сеансе:

    [[appDelegate getNSURLSessionForBackgroundTransfers] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
    for(NSURLSessionUploadTask *task in uploadTasks) {
        [task resume];
    }

Время от времени приложение вылетает со следующим исключением в моих журналах (я использую хоккейное приложение):

SIGSEGV

На:

0   libdispatch.dylib                   0x3ba87772 _dispatch_async_f + 10
1   CFNetwork                           0x30a5b86f -[__NSCFBackgroundSessionTask _onqueue_connection_resume] + 92
2   Memoir Beta                         0x00231e85 __55-[PhotoBinariesUploader runCodeEvenIfBackgroundMode:]_block_invoke_3 (PhotoBinariesUploader.m:553)
3   CFNetwork                           0x30a848c5 __50-[__NSCFURLSession getTasksWithCompletionHandler:]_block_invoke246 + 14

Есть идеи? Любые намеки на то, что это может быть?

Заранее спасибо! Ze

1 ответ

Решение

Я видел ту же проблему, начиная с iOS 7.1. Сбой происходит, если вы вызываете возобновление для задачи с состоянием NSURLSessionTaskStateCompleted (возможно, для NSURLSessionTaskStateCanceling тоже). Я думаю, что это ошибка, представленная в iOS 7.1, потому что в iOS 7 резюме игнорировалось.

Я сделал следующее:

  if (task.state == NSURLSessionTaskStateSuspended) {
    [task resume];
  }

Это должно предотвратить сбой. И только задачи, которые приостановлены, могут быть возобновлены в любом случае.

Это по-прежнему разочаровывает, так как он работал без проблем под iOS 7 в течение нескольких месяцев, и теперь выпущенное приложение вызывает много сбоев из-за этого.

Другие вопросы по тегам