2

我遇到了 WatchConnectivity 和可能的 Clockkit 框架的问题。我正在尝试transferCurrentComplicationUserInfo在 iOS 应用程序中使用将数据发送到手表并更新并发症。在手表上的扩展委托中,我实现了委托方法didReceiveUserInfo,我在其中处理数据,然后调用以更新并发症。

当我在模拟器上运行 iOS 应用程序时,一切正常。但是,如果我在实际设备上运行它,手机的传输开始,复杂功能调用requestedUpdateDidBegin(),但didReceiveUserInfo手表上的扩展内部从未被调用,因此我没有复杂功能的数据。

有什么建议么?还是我应该提交错误报告?

4

3 回答 3

2

这听起来像是在 Apple Watch 上设置 WCSession 对象的问题。对于复杂性,我建议在 ExtensionDelegate 的 init 方法中执行此操作。原因是 applicationDidFinishLaunching 仅在您的手表扩展程序(主手表应用程序)启动时调用,而不是在显示复杂功能或浏览时调用。

override init() {
    super.init()

    // Setup watch connectivity. We do this here because applicationDidFinishLaunching is only
    // called when the watch extension is being called, not when a complciation is being updated
    self.session.delegate = self
    self.session.activateSession()
}
于 2016-03-02T18:45:43.700 回答
1

可能是因为你超过了transferCurrentComplicationUserInfo传输数据的系统限制,因为你一天只能传输50次

从 iOS 传输数据 或者,如果您的 watchOS 应用程序有一个配套的 iOS 应用程序,您可以在 iOS 应用程序中收集数据,然后将该数据传输到 Apple Watch。但是,此更新策略将手表与配套的 iPhone 绑定在一起。如果用户在没有手机的情况下冒险外出,您将无法更新并发症,这种情况可能会导致过时或不准确的并发症。此外,与推送通知一样,系统每天将您限制为 50 次并发症传输。

您可以通过 remainingComplicationUserInfoTransfers 查看允许传输的 剩余时间

于 2020-09-26T18:38:03.307 回答
1

在确定永远不会调用扩展之前,您应该通过“设备”窗格检查监视(控制台)日志消息。扩展程序可能是在后台启动的,并且没有附加到调试器,因此您不会NSLog在 Xcode 控制台中看到该消息。

更重要的是,您可能已经将一些复杂userInfo功能从手机转移到手表上,但是一旦手表收到字典,您似乎就没有对字典做任何事情。您要做的不仅仅是传输当前的并发症信息。复杂数据源在被调用时需要访问该信息 getCurrentTimelineEntryForComplication(作为重新加载时间线的结果)。

可能的原因

你没有分享太多代码,所以我解决了如何transferCurrentComplicationUserInfo actually works,并提到了我在你的代码中看到的一个不相关的问题。

没有更多代码,很难提供具体的答案,但为了将来可能遇到此问题的其他人,我会尽力提供帮助。

didReceiveUserInfo以下是您的扩展程序未被调用的一些可能性。

  • WCSession您在多个地方激活,并且转移正在(不)由另一位代表处理。
  • 您没有对您激活的会话进行引用,并且它超出了范围。
  • 该应用程序尚未在 Watch 上打开。
  • 会话没有足够快或在正确的位置激活。
  • transferCurrentComplicationUserInfo失败并出现错误,因为您的手机已锁定。(这是 Apple 已经承认的已知问题,并且有解决方法。

代码如何帮助改进您的问题和我们的答案

提供代码的目的是识别或消除某些东西不工作的原因。通常需要代码来帮助回答“为什么这不起作用?” 编程题。

仅仅因为它恰好在模拟器中工作,这并不能保证您“正确设置”。在设备上进行测试会发现在模拟器中测试永远不会发现的错误是合理的。

于 2016-03-03T02:51:09.117 回答