Swift后台数据任务
Swift background data task
我正在尝试在 Swift 中发出后台 post 请求。我知道我应该配置一个后台 URLSession 并使用委托而不是完成处理程序。
这是我正在使用的委托:
class Delegate:NSObject, URLSessionDelegate, URLSessionTaskDelegate,
URLSessionDataDelegate{
var completionHandler:((String) -> Void)?
func urlSession(_ session: URLSession,
dataTask: URLSessionDataTask,
didReceive response: URLResponse,
completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
completionHandler(URLSession.ResponseDisposition.allow)
}
func urlSession(_ session: URLSession,
dataTask: URLSessionDataTask,
didReceive data: Data) {
let responseString = String(data: data, encoding: .utf8)!
if let handler = self.completionHandler {
handler(responseString)
session.finishTasksAndInvalidate()
}
}
}
这就是我启动数据任务的方式:
let url = URL(string: endpoint)
var request = URLRequest(url: url!)
request.setValue("text/xml", forHTTPHeaderField: "Content-Type")
request.httpBody = body.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
request.httpMethod = "POST"
let delegate = Delegate()
delegate.completionHandler = {
data in
// use the data
}
let config = URLSessionConfiguration.background(withIdentifier: "id-background")
let session = URLSession(configuration: config, delegate: delegate, delegateQueue: nil)
let task = session.dataTask(with: request)
task.resume()
这仍然只适用于前台。
我在这里错过了什么?
您将需要实施 AppDelegate
方法
并将其放入您的委托中
此外,您应该实施 后台模式 。您的问题的相对答案可以在这里找到。
我正在尝试在 Swift 中发出后台 post 请求。我知道我应该配置一个后台 URLSession 并使用委托而不是完成处理程序。
这是我正在使用的委托:
class Delegate:NSObject, URLSessionDelegate, URLSessionTaskDelegate,
URLSessionDataDelegate{
var completionHandler:((String) -> Void)?
func urlSession(_ session: URLSession,
dataTask: URLSessionDataTask,
didReceive response: URLResponse,
completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
completionHandler(URLSession.ResponseDisposition.allow)
}
func urlSession(_ session: URLSession,
dataTask: URLSessionDataTask,
didReceive data: Data) {
let responseString = String(data: data, encoding: .utf8)!
if let handler = self.completionHandler {
handler(responseString)
session.finishTasksAndInvalidate()
}
}
}
这就是我启动数据任务的方式:
let url = URL(string: endpoint)
var request = URLRequest(url: url!)
request.setValue("text/xml", forHTTPHeaderField: "Content-Type")
request.httpBody = body.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
request.httpMethod = "POST"
let delegate = Delegate()
delegate.completionHandler = {
data in
// use the data
}
let config = URLSessionConfiguration.background(withIdentifier: "id-background")
let session = URLSession(configuration: config, delegate: delegate, delegateQueue: nil)
let task = session.dataTask(with: request)
task.resume()
这仍然只适用于前台。
我在这里错过了什么?
您将需要实施 AppDelegate
方法
并将其放入您的委托中
此外,您应该实施 后台模式 。您的问题的相对答案可以在这里找到。