【问题标题】:Get Data to Complication: ExtensionDelegate not Called使数据复杂化:未调用 ExtensionDelegate
【发布时间】:2015-08-25 22:05:31
【问题描述】:

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

我正在尝试做一件非常基本的事情:将数据从我的 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);  
}

【问题讨论】:

  • 您在 WatchKit 扩展的哪个位置激活了 WCSession?您将什么对象设置为其委托?
  • @ccjensen 遇到了同样的问题,你们有没有发现什么问题?
  • 我的问题从来没有得到答复,所以我认为这永远不会解决
  • @ccjensen 我遇到了同样的问题stackoverflow.com/questions/35542729/… ...我在ExtensionDelegate 中激活了WCSession,有什么想法吗?

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


【解决方案1】:

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

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

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

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

希望对你有帮助!

贾斯汀

【讨论】:

  • 曾经在ComplicationController 方面遇到问题,您似乎无法通过WCSession: 获取您在ExtensionDelegate 中设置的数据?
  • 是的,当我未能正确响应 getTimelineEntriesForComplication(beforeDate 和 afterDate)时,我遇到了这个问题。最初,我不明白这些方法的用途是什么,我正在用相同的数据填充所有请求的时间线条目。这使复杂控制器无法在这些时间线条目所涵盖的时间跨度内获取任何新数据。要解决此问题,请确保您仅使用已知的良好时间线条目集响应 getTimelineEntriesForComplication 并在完成时调用 handler(nil)。我希望这会有所帮助!
  • 啊,我认为这是有道理的。是什么让你点击?您是否遇到过让您更清楚的文章/教程/文档?
  • 通过反复试验和蛮力解决了这个问题。关于如何正确使用和实施并发症的信息非常有限,我相信你已经找到了!
  • 是的,我正在尽我最大的努力,一点一点地弄清楚(我认为),但仍然卡住:stackoverflow.com/questions/35542729/…
【解决方案2】:

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

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

【讨论】:

  • 我从未在模拟器上遇到getTimelineEntriesForComplication 的问题;它支持时间旅行。出于以下原因,应避免使用您的方法:ComplicationController 是一个数据,由复杂服务器按需实例化。它并不意味着接收数据或成为数据的存储库。 Apple 建议您将 fetch 和 data manager 职责分离到不同的模块中。这在you consider complications from the perspective of a watchOS 3 background task 时尤其重要。
  • 问题是 transferCurrentComplicationUserInfo 没有到达 ComplicationController,因为 WCsession 由 ExtensionDelegate 激活(并且只能有一个 WCSession 委托)。最好的解决方案是使用可以跨手表应用共享的单例来处理会话业务
  • natasha 在这里描述了这项技术natashatherobot.com/watchconnectivity-say-hello-to-wcsession
  • 误解是转移是为了去并发症控制器。不,这不是手表连接会话的设计。实际发生的是用户信息在手机和手表分机之间传输。然后由扩展来 a) 将并发症用户信息存储在模型或数据管理器中,b) 让并发症重新加载时间线(它使用现在驻留在模型或数据管理器中的新信息)。会话传输绝不意味着直接与复杂控制器通信。
  • 你绝对可以为会话管理器使用单例,但复杂控制器需要获取数据,而不是会话。这就是区别(也是将“网络”代码拆分为网络部分和数据管理器部分的根本原因)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2016-12-22
  • 2010-10-07
  • 2021-12-03
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多