[英]Background Network Call from Background Push
我有一個與 Apple Watch 通信的應用程序。 當主 iOS 應用程序收到遠程通知時,它會使用URLSession
觸發網絡請求,然后還將結果發送到手表。
問題是當 iOS 應用程序在后台並且收到推送通知時,永遠不會進行網絡調用。 我可以通過斷點看到代碼被執行,但不是在接收到數據時的代碼。
我確實設置了 content-available 標志,我也嘗試使用URLSessionConfiguration.background
沒有成功。
var config:URLSessionConfiguration!
var session:URLSession?
private func configureSession()
{
self.config = URLSessionConfiguration.background(withIdentifier: "backgroundFetch")
//self.config = URLSessionConfiguration.default
self.config.sessionSendsLaunchEvents = true
self.config.timeoutIntervalForRequest = 15.0
self.config.timeoutIntervalForResource = 15.0
self.session = URLSession(configuration: self.config, delegate: self, delegateQueue: nil)
}
您可以在上面看到我在默認和后台模式下都嘗試過。
func getCoordinatesForID(_ trackID:String, withPassCode passCode:String, andMyID myID:String)
{
let url = self.WEB_DOMAIN+"getcoord"
let hash = SecurityModel.sha256(myID+trackID+passCode)!
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded;charset=utf-8", forHTTPHeaderField: "Content-Type")
let postDataStr = "auth=\(hash)&id=\(myID)&trk=\(trackID)&code=\(passCode)"
let requestBodyData = postDataStr.data(using: String.Encoding.utf8)
request.httpBody = requestBodyData
let postDataTask = self.session!.dataTask(with: request)
postDataTask.taskDescription = "getCoordinates"
postDataTask.resume()
}
上面的函數在后台被調用,但這就是事情停止的地方。 什么都沒有收到。 在前台工作正常。
我確實實現了下面的既不是在后台調用的。
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
和
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
更新:
根據愛德華的評論,我確實更新了功能以包括“后台獲取”,盡管通知后下載的文檔並未表明這是必要的。 這似乎奏效了,但只是部分有效,因此問題仍然存在。
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
上面被調用但拋出錯誤: "Lost connection to background transfer service"
。 100% 發生在后台狀態而不是前台狀態。
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
我需要並在上面的方法之前首先調用的上面,根本沒有被調用。 因此,總體而言,事情已經取得了進一步的進展,但仍然不像在前台時那樣以相同的方式工作。
解決方案:
解決方案是刪除timeoutIntervalForRequest
和timeoutIntervalforResource
盡管事實上我從來沒有等待過我在問題產生之前設置的 15 秒,但刪除這些允許進程在后台正常工作。 此外,我可以使用標准的URLSessionConfiguration.default
而不是 .background。
所以最后添加“后台獲取”功能並刪除超時解決了這個問題。
經過對上述想法的更多測試后,我發現事情並不一致。 問題是我使用的是URLSessionDataTask
,事實證明,它在后台URLSessionDataTask
。 根據 Apple 的文檔:
數據任務請求資源,將服務器的響應作為內存中的一個或多個 NSData 對象返回。 它們在默認、臨時和共享會話中受支持,但在后台會話中不受支持。
為了解決這個問題,我必須創建一個URLSessionDownloadTask
並使用其關聯的委托
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
當應用程序在后台時,網絡調用可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.