我有一个Apple Watch应用程序,可以从同一个iPhone应用程序接收数据。 iPhone应用程序使用Watch Connectivity框架定期向手表发送数据:
try? WCSession.default.updateApplicationContext(["kAppContext": data])
然后手表在以下位置接收有效载荷:
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
if let data = applicationContext["kAppContext"] as? Data {
//Trigger push notification. Will be observed by the CLKComplicationDataSource
}
}
在CLKComplicationDataSource
中,我正在听通知并更新并发症:
let server = CLKComplicationServer.sharedInstance()
if let complications = server.activeComplications {
for complication in complications {
server.reloadTimeline(for: complication)
}
}
引擎盖下没有什么新东西,当手表在前台时,并发症得到了更新,没有任何问题。当Apple Watch在后台运行时,它将停止接收以下任何更新:
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any])
因此不会更新并发症。
现在,我正在尝试通过扩展代理中的后台刷新任务在后台更新并发症:
func applicationWillResignActive() {
scheduleTask()
}
func scheduleTask() {
WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate: Date().addingTimeInterval(5), userInfo: nil) { error in
if error != nil {
print("Error adding schedule update")
}
}
现在是问题。由于某种原因,在安排了1次后台更新后,方法func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any])
被正确调用,并且几乎所有从手机发送的数据都到达了手表,并且并发症得到了更新。
为什么会这样?它可以满足我的要求,但我不知道为什么。为什么仅添加一个后台应用程序刷新任务会使电话中的数据开始通过?我没有在Apple文档中找到这种行为的描述。
谢谢