打开 WatchOS2 时获取更新的应用程序上下文

Posted

技术标签:

【中文标题】打开 WatchOS2 时获取更新的应用程序上下文【英文标题】:Fetch updated Application Context when opening WatchOS2 【发布时间】:2016-09-06 19:25:50 【问题描述】:

所以我已经阅读了很多关于 WatchOS2 的教程。

    我可以从 iPhone 模拟器和 iWatch 模拟器(当两者都处于活动状态时)增加、减少计数器(标签值)。

    ios 应用处于非活动状态(终止)时,watchOS2 应用处于活动状态,在 watchOS2 应用中更改值,然后打开 iOS 应用,计数器标签正在更改。

但是反过来是行不通的。在 watchOS2 应用程序处于非活动状态(终止)时更改 iOS 应用程序中的标签计数器。然后打开 watchOS2 应用,但值不变或与 iOS 应用不同。

为了改变值我使用了这个方法

   NSDictionary *dic = @@"counter":[NSNumber numberWithInt:self.counter];
   WCSession *session = [WCSession defaultSession];
   NSError *error;
  [session updateApplicationContext:dic error:&error];

我使用了this 教程,根据本教程[session updateApplicationContext:dic error:&error]; 是一种更新或更改整个上下文的方法。因此,当 watchOS2 应用程序处于活动状态时,它不应该获取在 watchOS2 应用程序终止时由 iOS 应用程序更新的最新上下文。

请建议我必须做什么。我没有找到一个解决方案或找到所有教程,都没有解决这个问题。

【问题讨论】:

从讨论到我的回答:您的问题并未准确描述您的体验。请出示负责接收的代码,包括您的设置方式。 【参考方案1】:

您有两个应用程序上下文:一个从 iOS 到 watch os,一个反之亦然。不要认为它们是一体的。

您可以考虑以下想法:

仅使用从 iOS 应用到手表的上下文。

    iOS 保存状态,将状态更新作为上下文发送到手表,就像您之前所做的那样。

    如有必要,通过用户信息队列将差异从 watchOS 发送到 iOS。用户信息消息应包含类似“计数器加 1”的内容。用户信息不会丢失,如果暂时无法交付,则会排队。

    当 iOS 应用收到“计数器加 1”时,它会执行此操作,更新其 UI,并将最终结果作为上下文发送给手表。

当用户有两个手表时,这也应该有效。

【讨论】:

我知道两者都是不同的上下文。但我们所能做的就是在接收更改通知的同时更新上下文。如何将 iOS 上下文传递给手表 没有将上下文从手表发送到 iOS,因为在我的情况下它没有意义,原因与你的情况类似。我所做的和有效的是将用户信息从手表发送到 iOS,并带有我所描述的更新信息。您可以在上下文中添加时间戳或版本号。然后你发送用户信息“add 1 to counter of version xxx” 那行不通,那发送字符串呢。如果我们在 iOS 应用程序中设置一些值,而手表应用程序被终止/不活动会怎样。然后我打开watchapp后,我将无法获取更新的数据?如果应用 dsnt 有任何服务器。 为什么不起作用?我没有说明您用于传输信息的数据格式。你使用字符串或任何适合你的东西。如果您继续按照建议从 iOS 应用程序向手表应用程序发送上下文,您的方案就可以正常工作。 手表应用没有收到?那么您的错误可能是您只是在等待手表应用程序中的回调。你必须在你的手表应用程序中做这两件事:在启动时从会话中读取上下文等待带有更新上下文的回调。

以上是关于打开 WatchOS2 时获取更新的应用程序上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WatchOS2 中显示系统加载屏幕?

保存子上下文时获取 NSFetchedResultsController 的批量更新

使用 Cocoapods + WatchOS 2 目标

核心数据:SQLite 没有立即更新

使用 setState 时如何立即获取更新状态?

无法读取上下文提供程序中的 useReducer 挂钩更新的状态