我正在尝试构建一个基本的概念验证watchOS应用程序和复杂功能,该应用程序和复杂功能可从API中提取JSON数据并基于此显示量表。 我看过苹果公司的'Keping your watch app up to date',发现了关于该主题的其他几个问题,但示例代码已被删除。
API提供了未来48小时内的预测,可用于填充并发症的时间轴条目。当Complication Controller请求时间线条目时,我从Extension Delegate中提取数据,因此必须保持最新。但是,安排后台数据任务的过程使我感到困惑。当我调用backgroundSession.dataTask(with: URL(string: "https://......
时,我希望我的URLSessionDataDelegate
函数被调用,但是它们从未被调用,并且我也从未得到过handle(_ backgroundTasks)
调用的WKURLSessionRefreshBackgroundTask
问题:
当WKApplicationRefreshBackgroundTask
发送到我的ExtensionDelegate
时,我应该如何从API请求/安排数据,然后再接收它?
代码
//ExtensionDelegate
class ExtensionDelegate: NSObject, WKExtensionDelegate, URLSessionDelegate, URLSessionDataDelegate {
...
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task in backgroundTasks {
switch task {
case let backgroundTask as WKApplicationRefreshBackgroundTask:
print("background task as WKApplicationRefreshBackgroundTask")
self.scheduleURLSession()
backgroundTask.setTaskCompletedWithSnapshot(false)
return
case let urlSessionTask as WKURLSessionRefreshBackgroundTask:
print("background task as WKURLSessionRefreshBackgroundTask")
let backgroundConfigObject =
URLSessionConfiguration.background(withIdentifier: urlSessionTask.sessionIdentifier)
let backgroundSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil)
print("Rejoining session ", backgroundSession)
self.savedTask = urlSessionTask
return
default:
// make sure to complete unhandled task types
task.setTaskCompletedWithSnapshot(false)
}
}
}
func scheduleURLSession() {
let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: "nz.co.craigstanton")
backgroundConfigObject.sessionSendsLaunchEvents = true
let backgroundSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil)
let dataTask = backgroundSession.dataTask(with: URL(string: "https://craigstanton.co.nz/uvi-test?latitude=-36&longitude=174")!)
print("scheduleURLSession about to 'resume' ")
dataTask.resume()
}
//Delegate callbacks
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
print("Data task error", error)
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse,
completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
print("urlSession Delegate did receive everything ")
}
func urlSession(_: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
print("urlSession Delegate did receive something ")
}