7

(看起来其他人在前几周遇到过这个问题,但我没有找到任何解决方案。)

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

事实证明,我做这件事的能力比我想象的要差。watchOS 2 过渡指南表明我应该使用以下代码“从扩展委托中获取所需的数据”:

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);  
}
4

2 回答 2

8

自 Xcode 7 Beta 4 以来,我一直在 WatchOS2 中使用 Complications。我现在使用的是最新的 Xcode Beta 6。我遇到了许多问题,例如在 Watch 上运行的两个 Beta 版本,然后在 iPhone 上运行由于似乎有错误的 API 和操作系统版本,安装到 Watch 并在模拟器上运行经常会出现误报。我已经能够通过以下方式获得数据来显示并发症。

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

如果您遇到问题,可以尝试以下调试方法。正如我上面所说,API 和操作系统似乎有很多错误。以下步骤确实有效(有时)。

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

我希望这会有所帮助!

贾斯汀

于 2015-09-02T15:10:12.730 回答
-1

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

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

于 2016-07-04T17:14:27.173 回答