NSURLSession с фоновой настройкой и приложение, убитое пользователем

Это сценарий:

  • NSURLSession с фоновой настройкой
  • Задача загрузки или выгрузки начинается с "Плохо" или "Нет подключения к Интернету"
  • Пользователь закрыл приложение.
  • Если iOS получит подключение к Интернету, начнется сессия. Тем не мение,
  • С задачей все еще ждет интернет.
  • Пользователь убивает приложение
  • Система отменяет все отложенные задачи

Вопрос

Можно ли узнать, когда пользователь снова откроет приложение, чтобы задачи были отменены?

Если да, то где?


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

Я использую Alamofire для обработки всех моих сетевых звонков. Однако я сомневаюсь, что Alamofire изменит свое поведение.


Редактировать 1

/// Networking manager with Background Session Configuration
static var backgroundManager: Alamofire.Manager = {

    let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.xxx.NetworkingManager.Identifier")
    configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders

    let backgroundManager = Alamofire.Manager(configuration: configuration)
return backgroundManager
}()

1 ответ

Решение

Престижность Rob, потому что он показал мне правильный путь.

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


Вы можете увидеть это с помощью system.log:

Симулятор / Отладка / Открыть системный журнал...

Как поймать то, что уже происходило?

Снова создайте свой фон NSURLSession, Сделайте это в другом месте, но я сделаю это в AppDelegate для этого примера.

Система знает (благодаря идентификатору), что это тот же фоновый сеанс, что и раньше, поэтому она отображает отложенные задачи.

Затем получите все задания. Отмененные задачи все еще там

Задачи будут иметь ошибку, которую вы можете проверить.

Error Domain=NSURLErrorDomain Code=-999 "(null)" 
UserInfo={NSErrorFailingURLStringKey=http://your.api.com/url,     
NSURLErrorBackgroundTaskCancelledReasonKey=0,        
NSErrorFailingURLKey=http://your.api.com/url}

Кроме того, с этими задачами вы получите URL-адрес запроса, чтобы вы могли сопоставить запросы вашего приложения и что-то сделать.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {


    // This is the code for Swift 2.x. In Swift 3.x this call is a bit different.
    NetworkingManager.backgroundManager.session.getTasksWithCompletionHandler { (data, upload, download) in

        for task in data {

            NSLog("\(task.error)")
        }

        for task in upload {

            NSLog("\(task.error)")
        }

        for task in download {

            NSLog("\(task.error)")

            let reason = task.error?.userInfo[NSURLErrorBackgroundTaskCancelledReasonKey] as? Int
            let code = task.error?.code

            if reason == NSURLErrorCancelledReasonUserForceQuitApplication &&
                code == NSURLErrorCancelled {

                NSLog("\(task.originalRequest)")
                NSLog("\(task.currentRequest?.URL)")
            }
        }
    }
}

NSURLErrorCancelledReasonUserForceQuitApplication -> Операция была отменена, потому что пользователь заставил приложение выйти.

Так что мы на правильном пути. Если у кого-то есть лучшее решение, пожалуйста, поделитесь! Мне не очень нравится картографическое решение моих запросов URL.

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