iOS后台上传-如何处理过期的身份验证令牌

时间:2018-12-07 23:53:57

标签: ios authentication nsurlsession nsurlsessionuploadtask

我正在执行后台上传到需要使用令牌进行授权的端点。该令牌作为HTTP标头包含在已创建/启动的各个上传任务中。

是否可以响应过期的令牌消息并阻止401s?大致来说,我希望执行的时间表是:

  1. 使用有效令牌开始在前台上传
  2. 应用程序已后台运行,上传继续,但应用程序本身已关闭
  3. 一段时间后,用户将设备与其他应用程序一起使用,等等。
  4. 第1步中使用的令牌已过期,所有仍在进行的上传将需要新的令牌。
  5. 应用程序在后台启动,告诉我auth令牌已过期。
  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方法未调用-在这种情况下,这是我所期望的。假设它被调用,我不确定在这种情况下如何用新令牌响应。

有什么想法吗?

0 个答案:

没有答案