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.