我发现这个方法是在模拟器上调用的,但是在真正的手表设备上,它永远不会被调用。 Apple的简单代码和我的测试。
我想知道的是我的错误还是Apple的错误。
我的代码 -
class InterfaceController: WKInterfaceController, WKExtensionDelegate {
@IBOutlet var textLbl: WKInterfaceLabel!
override func awake(withContext context: Any?) {
super.awake(withContext: context)
WKExtension.shared().delegate = self
// Configure interface objects here.
}
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task : WKRefreshBackgroundTask in backgroundTasks {
if task is WKSnapshotRefreshBackgroundTask {
textLbl.setText("hahahah");
task.setTaskCompleted()
}
}
}
}
答案 0 :(得分:2)
官方Apple代码示例WatchBackgroundRefresh在watchOS 3.0(14S326)上也以相同方式失败。我在自己的代码中也看到了相同的失败,尽管它与之前的3.0测试版一起使用。
另一个症状是没有调用handle(...)
进行快照刷新,即WKSnapshotRefreshBackgroundTask
任务。
我已经提交了一份Apple错误报告,该报告在OpenRader上列出: http://www.openradar.me/radar?id=6720257230110720
最后,我注意到Apple Stocks应用程序确实获得了后台刷新。所以我不确定为什么这会起作用,而其他应用程序会失败。
答案 1 :(得分:0)
我设法通过将scheduledCompletion属性指向“真实”函数而不是闭包来找到一种解决方法,例如。
WKExtension.shared().scheduleBackgroundRefresh(
withPreferredDate: nextRefreshTime!,
userInfo: nil,
scheduledCompletion: self.backgroundRefreshRunning)
...
private func backgroundRefreshRunning(error: Error?) {
if (error != nil) {
print("Error running background task: \(error.debugDescription)")
}
}
现在似乎工作正常!
我的猜测是Swift 3编译器中存在一个错误。我曾经使用内联闭包为scheduledCompletion值,这个工作正常,直到我将我的代码从Swift 2.3更新为Swift 3