我正在开发我的应用程序的 WatchKit 扩展,并且遇到了一些复杂问题。
我有一个显示给定总量的复杂功能,这取决于用户在 iOS 应用程序上所做的事情。当 WatchKit 扩展运行时,iOS 应用程序使用该-[WCSession updateApplicationContext:]
方法更新手表应用程序上下文。它工作正常,然后在我的 Watch 应用程序的 ExtensionDelegate 中,我使用新数据手动更新复杂功能。
但这只有在扩展程序运行时才可以(如果不是,它将在下一次启动之前获取应用程序上下文)。
所以我编辑了我的代码,当用户在 iOS 应用程序中更改某些内容时,使用该方法将复杂数据直接发送到 Watch -[WCSession transferCurrentComplicationUserInfo:]
(它写在文档中,应该唤醒 ExtensionDelegate 以在后台接收用户信息)。
我已经实现了-session:didReceiveUserInfo:
ExtensionDelegate 的方法,以在它从 iOS 应用程序接收数据时更新并发症,但是当扩展程序未运行时它不起作用......(我不知道它是否曾经接收到用户信息,因为我无法记录)
即使扩展程序没有运行,我应该如何使我的并发症保持最新?
谢谢
PS:我正在使用手表模拟器,为了“关闭”我刚刚重启手表的扩展(从硬件菜单)
编辑:当应用程序未运行时,我设法注销语句(通过打开 Watch Simulator 系统日志),当 iOS 向手表扩展发送新的复杂用户数据时,我得到这些行:
10 月 18 日 18:08:11 pc16 WatchApp Extension[26615]:扩展收到唤醒复杂功能支持的请求。
10 月 18 日 18:08:11 pc16 断言 [26585]:断言失败:15A284 13S343:断言 + 15398 [B48FCDB-A071-3A46-878B-538DC0AFF60B]:0x1
所以手表很好地接收了用户信息字典,但似乎无法唤醒扩展......
编辑 2:这是 ExtensionDelegate 中应该接收复杂用户信息的代码部分(但在应用程序未运行时不会调用):
- (void) session: (WCSession *)session didReceiveUserInfo: (NSDictionary *)userInfo
{
NSLog(@"session:didReceiveUserInfo: %@", userInfo);
NSString *userInfoType = userInfo[KHWASessionTransferUserInfoType];
NSDictionary *userInfoContents = userInfo[KHWASessionTransferUserInfoContents];
// Complication Data
if ([userInfoType isEqualToString:KHWASessionTransferUserInfoTypeComplicationData]) {
// Store the complication data into user defaults
[[NSUserDefaults standardUserDefaults] setValue:userInfoContents[KHWAComplicationTotalBalance] forKey:KHWAComplicationTotalBalance];
[[NSUserDefaults standardUserDefaults] synchronize];
// And refresh the complications
CLKComplicationServer *complicationServer = [CLKComplicationServer sharedInstance];
for (CLKComplication *complication in complicationServer.activeComplications) {
[complicationServer reloadTimelineForComplication:complication];
}
}
}
编辑 3:WCSession 在扩展委托applicationDidFinishLaunching
方法中设置:
- (void) applicationDidFinishLaunching
{
// Setup the WatchConnectivity session
WCSession *session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
[...]
}