获取并发数据:不调用ExtensionDelegate

时间:2015-08-25 22:05:32

标签: apple-watch watch-os-2 apple-watch-complication clockkit

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

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

我发现这样做的能力比我想象的要差。 watchOS 2 Transition Guide表示我应该使用以下代码“[从[@fetch]扩展委托中获取所需数据”:

ExtensionDelegate* myDelegate = [[WKExtension sharedExtension] delegate];  
NSDictionary* data = [myDelegate.myComplicationData objectForKey:ComplicationCurrentEntry];

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

它也看起来像“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);  
}

2 个答案:

答案 0 :(得分:8)

自Xcode 7 Beta 4以来,我一直在使用WatchOS2中的并发症。我现在使用最新的Xcode Beta 6.我在两个Beta版本中都遇到了很多问题在Watch上,在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应用程序)并重新安装。

我希望有所帮助!

贾斯汀

答案 1 :(得分:-1)

为了使ComplicationController响应WCSession活动,您必须使控制器符合WCSessionDelegate,然后从ComplicationController中管理didReceiveUserInfo。在后台,ExtensionDelegate不会因这些更新而被唤醒。如有必要,您仍然可以从控制器更新您的代理。

此外,截至目前,模拟器不会将transferCurrentComplicationUserInfo发送到手表模拟器,您必须在设备上进行测试。