在不运行时保持我的WatchKit并发症是最新的

我正在研究我的应用程序的WatchKit扩展,并且有一些并发症的问题。

我有一个复杂function,显示给定的总金额,这取决于用户在iOS应用程序上做了什么。 当WatchKit扩展程序运行时,iOS应用程序使用-[WCSession updateApplicationContext:]方法更新监视应用程序上下文。 它工作正常,然后在我的Watch应用程序的ExtensionDelegate中,我手动更新新数据的复杂性。

但只有当扩展程序正在运行时才会出现这种情况(如果不是,则在下次启动之前不会获得应用程序上下文)。

所以我编辑了我的代码,当用户在iOS应用程序中使用-[WCSession transferCurrentComplicationUserInfo:]方法更改内容时,将复杂数据直接发送到Watch(它在文档中写入,应该唤醒ExtensionDelegate以接收用户信息)在背景中)。

我已经实现了-session:didReceiveUserInfo: ExtensionDelegate的方法来在从iOS应用程序接收数据时更新复杂性,但是当扩展未运行时它不起作用…(我不知道是否它曾收到用户信息,因为我无法记录它)

即使扩展未运行,我该怎样做才能使我的并发症保持最新?

谢谢

PS:我正在使用Watch Simulator,并且“关闭”扩展我只是重启Watch(从硬件菜单)

编辑 :我设法在应用程序未运行时注销语句(通过打开Watch Simulator系统日志),当iOS将新的复杂用户数据发送到watch扩展时,我得到这些行:

10月18日18:08:11 pc16 WatchApp扩展[26615]:扩展收到唤醒复杂function支持的请求。

10月18日18:08:11 pc16断言[26585]:断言失败:15A284 13S343:断言+ 15398 [B48FCADB-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]; [...] } 

哇,我终于解决了这个问题!

看来,即使我没有在日志文件中看到它(参见我的上一条评论),WCExtensionDelegate的init方法在唤醒应用程序时也能很好地调用。

所以我只需要将WCSession设置块移动到init方法中:

 - (id) init { if (self = [super init]) { // Setup the WatchConnectivity session WCSession *session = [WCSession defaultSession]; session.delegate = self; [session activateSession]; } return self; } 

而且它暂时工作正常……