获取并发数据:不调用ExtensionDelegate

Ser*_*ado 6 apple-watch clockkit watchos-2 apple-watch-complication

(在过去的几周里,其他人似乎遇到了这个问题,但是我找不到任何解决方案.)

我正在尝试做一个非常基本的事情:从我的iOS应用程序或我的Watch应用程序获取数据到我的复杂控制器.

事实证明,这样做的能力比我想象的要差.watchOS 2 Transition Guide表示我应该使用以下代码"[从[@fetch]扩展委托中获取所需的数据"):

ExtensionDelegate* myDelegate = [[WKExtension sharedExtension] delegate];  
NSDictionary* data = [myDelegate.myComplicationData objectForKey:ComplicationCurrentEntry];
Run Code Online (Sandbox Code Playgroud)

大.除此之外,我还没有弄清楚如何让这个在扩展方面工作.虽然更重要的是,我似乎甚至无法从复杂的控制器启动中获得扩展代理代码.当我运行复杂功能时,我收到此消息:"扩展收到请求以唤醒并发症支持." 但是,任何扩展委托方法中的代码都不会运行.我还在每个方法中设置了断点,并且没有一个断点被击中.

它也看起来像"transferCurrentComplicationUserInfo:"也被建议用于复杂的更新,虽然它不清楚它是如何使用的.我已经收集了它,它用于唤醒手表扩展,以便ExtensionDelegate可以在下次复杂控制器运行时存储新数据,但由于之前的问题,我无法确认.

我有一个可能的解决方法(从并发症控制器ping服务器并希望会话变量持续存在,这样我就可以发送相关数据),但是如果我不能解决这个问题,那么我的并发症工作就会受到冲击.这里的任何帮助都是巨大的.

顺便说一句,这是我对"getCurrentTimelineEntryForComplication"的代码,如果这有用的话.

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler {  
    NSDate* entryDate = [NSDate date];  

    ExtensionDelegate* myDelegate = [[WKExtension sharedExtension] delegate];  
    NSString* data = [myDelegate.complicationData objectForKey:@"meow"];  
    NSLog(@"complication data: %@", data);  

    CLKComplicationTimelineEntry* entry = [self getTimelineEntry:@"2015-08-25 00:19:42" entryDate:entryDate complication:complication];  

    handler(entry);  
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*itz 8

自从Xcode 7 Beta 4以来,我一直在使用WatchOS2中的复杂功能.我现在使用最新的Xcode Beta 6.我遇到了许多问题,就像在Watch上运行的两个Beta版本一样,在iPhone上运行然后安装到Watch,并在模拟器上运行经常会出现假阴性,因为看起来有些错误的API和OS版本.我能够通过以下方式获得有关并发症的数据.

  • 确保主接口控制器实现WCSessionDelegate协议.
  • 实现两者在接口控制器的didReceiveMessage和didReceiveApplicationContext方法.
  • 在您的iPhone应用程序中,尝试使用WCSession向Watch发送消息.
  • 如果消息无法从iPhone应用程序发送,请发送应用程序上下文.
  • 返回接口控制器,当您收到消息 - 或 - 上下文时,更新Extension Delegate中的值.
  • 仍然在接口控制器中,仍然在收到消息 - 或 - 上下文后,获取CLKComplicationServer的句柄,并在activeComplications中调用reloadTimelineForComplication中的每个复杂.
  • 在Complication Controller的getCurrentTimelineEntryForComplication中,获取您在Extension Delegate中设置的数据,并在CLKComplicationTimelineEntry中设置值.
  • 通常会在应用程序已经在Watch上打开时运行,应用程序仍然驻留在内存中,但是以Watch为后盾,或者您启动应用程序并且它们正在等待它消耗的上下文.
  • 我无法获得历史时间表条目(或未来的条目).不,我已经能够让时间轴独立于Watch应用程序进行更新.

如果您遇到问题,可以尝试以下调试方法.如上所述,API和操作系统似乎非常错误.下面的步骤工作(有时).

  • 在SIM卡中,使用iPhone和Watch sim上的重置所有设置选项.
  • 在设备上,重新启动Watch.必要时,取消配对并修理手表,尽管这需要很长时间.
  • 在iPhone上,删除应用程序(如果已安装,也将删除Watch应用程序)并重新安装.

我希望有所帮助!

贾斯汀