繁体   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