对于watchOS 3,Apple建议使用WKRefreshBackgroundTask而不是使用更新复杂功能getNextRequestedUpdateDate.
如何使用新方法确定两次更新之间的时间?
我只会破解我的数据请求(从网址)进入getCurrentTimelineEntry并将更新复杂功能,但我认为这不是苹果推荐的.
一个简短的代码示例将是一个很大的帮助.
swift apple-watch-complication swift3 watchos-3 wkrefreshbackgroundtask
我正在研究从Web服务获取计划数据的复杂性.每20-30分钟(或手动),我正在安排WKRefreshBackgroundTask来执行此操作.
正如Apple所建议的那样,我希望操作系统能够通过后台处理这些数据NSURLSession.
这是我用来下载我需要的数据的功能:
func scheduleURLSession()
{
print("\nScheduling URL Session...")
let backgroundSessionConfig:URLSessionConfiguration = URLSessionConfiguration.background(withIdentifier: NSUUID().uuidString)
backgroundSessionConfig.sessionSendsLaunchEvents = true
let backgroundSession = URLSession(configuration: backgroundSessionConfig)
let downloadTask = backgroundSession.downloadTask(with: URL(string: "https://www.myserver.com/somedata")!)
downloadTask.resume()
}
Run Code Online (Sandbox Code Playgroud)
关于这个的一些事情:
问题是,即使我正在调用resume()该任务并允许它在完成时唤醒我的应用程序,它似乎也没有.
完成后,它应该回到WKExtensionDelegate处理程序:
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)
Run Code Online (Sandbox Code Playgroud)
作为一个WKURLSessionRefreshBackgroundTask,但它没有.
我的代码与Apple的示例代码相同,然后创建另一个会话,但通过WKURLSessionRefreshBackgroundTask标识符重新加入它.这是设置委托以处理下载数据的位置.检查代码:
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task in backgroundTasks {
switch task {
case let backgroundTask as WKApplicationRefreshBackgroundTask:
print("\nWatchKit - WKApplicationRefreshBackgroundTask")
// self.updateComplicationDataArrivalTimes(backgroundTask)
self.scheduleURLSession()
backgroundTask.setTaskCompleted()
case let snapshotTask as WKSnapshotRefreshBackgroundTask: …Run Code Online (Sandbox Code Playgroud) nsurlsession watchkit watchos watchos-3 wkrefreshbackgroundtask
我正在尝试制作一个watchOS 3应用程序,我想在后台任务中更新我的复杂功能.
首先,我从后台任务中的服务器获取新数据handle().在那之后,我通过电话更新我的主动并发症complicationServer.reloadTimeline(for:).
在控制台中,我看到消息"更新复制",因此代码被执行.
然而,重新加载后,并发症仍显示旧数据.如果我切换表盘并切换回来,那么复杂功能有时会重新加载.我是否必须做其他事情才能从后台任务重新加载复杂功能?
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task : WKRefreshBackgroundTask in backgroundTasks {
if (WKExtension.shared().applicationState == .background) {
if task is WKApplicationRefreshBackgroundTask {
let dataProvider = DataProvider()
dataProvider.getData(station: "Name", completion: { (data, error) in
self.updateComplication()
self.scheduleNextBackgroundRefresh()
task.setTaskCompleted()
})
}
} else {
task.setTaskCompleted()
}
}
}
func updateComplication() {
let complicationServer = CLKComplicationServer.sharedInstance()
for complication in complicationServer.activeComplications! {
print("UPDATE COMPLICATION")
complicationServer.reloadTimeline(for: complication)
}
}
Run Code Online (Sandbox Code Playgroud) watchkit clockkit apple-watch-complication watchos-3 wkrefreshbackgroundtask
我正在尝试使用这样的行安排后台任务:
WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate: Date(timeIntervalSinceNow: TimeInterval(5) * 60), userInfo: nil, scheduledCompletion: self.scheduledCompletion)
Run Code Online (Sandbox Code Playgroud)
在哪里
func scheduledCompletion(error: Error?) {
if error == nil { print("successfully scheduled application background refresh") }
else { print("error scheduling background refresh, error: \(error)") }
}
Run Code Online (Sandbox Code Playgroud)
根据文档:
scheduledCompletion在后台应用程序刷新任务完成后由系统调用的块。
但是由于未知原因,它在调度后台刷新任务后被直接调用。后台刷新任务在正确的时间scheduledCompletion被调用,之后不会被调用。
那么它是文档中的错误,WatchKit 中的错误还是我做错了什么?