我已经知道如何使用 WCSession 的updateApplicationContext
方法,但它只在我的 WatchKit 应用程序运行时才有效。
我需要将货币汇率从 iOS 应用程序传输到手表,以更新我的手表数据和复杂功能。
我有一个 API 可以获取 USD-CNY 和 USD-EUR 的汇率,并希望与手表共享(类似于NSUserDefaults
持久数据的方式),因此它可以在我的并发症中显示“1 USD = 6.3 CNY”。
那么,我该如何实现呢?
我已经知道如何使用 WCSession 的updateApplicationContext
方法,但它只在我的 WatchKit 应用程序运行时才有效。
我需要将货币汇率从 iOS 应用程序传输到手表,以更新我的手表数据和复杂功能。
我有一个 API 可以获取 USD-CNY 和 USD-EUR 的汇率,并希望与手表共享(类似于NSUserDefaults
持久数据的方式),因此它可以在我的并发症中显示“1 USD = 6.3 CNY”。
那么,我该如何实现呢?
只有一种WCSession
方法可以让您在手表应用程序未激活时更新您的并发症数据。
假设您的并发症处于活动状态,并且您没有超过(iOS 10)每天的传输次数,transferCurrentComplicationUserInfo
将在后台唤醒您的手表扩展,并立即将用户信息传输到您的扩展。
然后,您的扩展程序可以在更新您的复杂功能之前将这些数据保留在手表上(供手表应用程序在其激活时使用) 。
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
if let ... { // Retrieve exchange rate data from dictionary
// Add code here to update your cache/backing store with exchange rate
// ...
// Now update the complication
let complicationServer = CLKComplicationServer.sharedInstance()
guard let activeComplications = complicationServer.activeComplications else { // watchOS 2.2
return
}
for complication in activeComplications {
complicationServer.reloadTimelineForComplication(complication)
}
}
}
watchOS 3 支持后台刷新应用任务。这意味着您的手表应用程序现在可以在后台更新自身、其停靠快照及其复杂性。
我已经在现有答案中介绍了此信息,但将在此处总结关键要点:
Apple 建议您利用所获得的每个机会,无论您的应用程序是在前台还是在后台,以使您的复杂功能、应用程序和停靠快照保持最新。
这是一个根本性的变化,从仅在应用程序未处于活动状态时更新复杂功能,到现在更新所有内容- 复杂功能、应用程序和停靠快照 -无论您的手表应用程序是在前台还是在后台。
无论您使用哪种方法,请记住,您每天或每小时可以执行的更新数量将受到限制。
正如 Apple 建议的那样,您应该考虑将汇率更新安排在需要的时间。这两个课程涵盖了何时(以及如何)更新您的手表应用程序:
804 Designing Great Apple Watch Experiences讨论了何时以及为何更新您的手表应用程序。
218让您的手表应用程序保持最新状态提供了有关使用后台任务更新您的复杂功能、应用程序和停靠快照的详细信息。