簡體   English   中英

來自后台推送的后台網絡調用

[英]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)

我需要並在上面的方法之前首先調用的上面,根本沒有被調用。 因此,總體而言,事情已經取得了進一步的進展,但仍然不像在前台時那樣以相同的方式工作。

解決方案:

解決方案是刪除timeoutIntervalForRequesttimeoutIntervalforResource盡管事實上我從來沒有等待過我在問題產生之前設置的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM