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