watchOS中的后台数据任务

时间:2019-01-03 23:42:27

标签: watchkit watch-os urlsession

我正在尝试构建一个基本的概念验证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 ")
}

0 个答案:

没有答案
相关问题