Фоновая загрузка iOS - как обработать просроченный токен авторизации - PullRequest
0 голосов
/ 08 декабря 2018

Я выполняю фоновые загрузки в конечную точку, для которой требуется авторизация с использованием токена.Маркер включается в качестве заголовка HTTP для отдельных задач загрузки, которые создаются / запускаются.

Можно ли отвечать на сообщения токена с истекшим сроком действия и предотвращать 401-е?Грубо говоря, временная шкала, которую я надеюсь реализовать, такова:

  1. Начать загрузку на переднем плане с действительным токеном
  2. Приложение фоновое, загрузка продолжается, но само приложение закрыто
  3. По прошествии некоторого времени пользователь использует устройство с другими приложениями и т. Д.
  4. Срок действия токена, использованного на шаге 1, истекает, и для всех выполняющихся закачек потребуется новый токен.
  5. Приложение запускается в фоновом режиме,сообщая, что срок действия авторизационного токена истек.
  6. Я обновляю токен приложения, и загрузка может продолжаться
  7. Загрузка отчета успешно завершена.

Пока чтоне удалось получить такое поведение - на шаге 5 вместо выдачи вызова / и т.д.что может обработать делегат сеанса или задачи, я просто получаю 401 ответ.

Настройка конфигурации / сеанс / задача:

let config = URLSessionConfiguration.background(withIdentifier: "background_upload_session")
session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

var request = URLRequest(url: NetworkService.uploadUrl)
request.httpMethod = "POST"
...
request.setValue(authToken, forHTTPHeaderField: "Authorization-Token")
...
let task = session.uploadTask(with: request, fromFile: filePath)
task.taskDescription = filePath.lastPathComponent
task.resume()

Методы делегирования:

public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    if error != nil {
        DDLogError("NetworkService urlSession didCompleteWithError:\(String(describing: error))")
    }

    if let httpResponse = task.response as? HTTPURLResponse {
        let statusMessage = httpResponse.statusCode == 201 ? "success" : "fail"

        DDLogInfo("NetworkService didCompleteWithError status code: \(httpResponse.statusCode) - \(statusMessage)")
    }
}

public func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    DDLogInfo("NetworkService urlSession task didReceive challenge")


    completionHandler(.performDefaultHandling, nil)
}

Метод didReceiveChallenge не вызывается - чего я и ожидал в этом случае.Предполагая, что он был вызван, я не уверен, как ответить новым токеном в этой ситуации.

Есть идеи?

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