0

我正在尝试向我的应用程序添加简单的 WatchOS 2.0 功能,以允许在手表上触发简单的操作并在我的 iPhone 上的主应用程序中产生影响。所有这些都取决于使用 WCSession 的 sendMessage 方法从手表发送消息

[[WCSession defaultSession] sendMessage:applicationData
                         replyHandler:^(NSDictionary *reply) {
                           //handle reply from iPhone app here
                           DbgLog(@"reply received=%@", reply);
                         }
                         errorHandler:^(NSError *error) {
                           //catch any errors here
                           DbgLog(@"error received=%@", error);
                         }
 ];

到目前为止一切正常,消息已发送,消息已收到,我的应用程序反应正确。我什至可以让我的应用程序在后台运行,一切似乎仍然正常(我可以在手表上看到 iPhone 是否对消息做出反应,因为 iPhone 将更新手表连接上下文,然后反映在手表上)。我现在只想开始调试边缘情况。

我主要担心的两个问题是...

如果它被杀死,我该如何调试唤醒我的应用程序的系统。我显然无法从 Xcode 生成进程,如果我尝试附加到进程显然为时已晚,理想情况下,我希望能够尽早设置断点以查看事情是如何工作的。更糟糕的是,我可以依靠我猜测的大量日志并查看这些日志。只是想知道是否有尝试调试这种情况的好方法?

最后,关于状态恢复,在 sendMessage 被发送场景运行的这个被杀死的应用程序中会发生什么。IE。

  • 我的应用程序在特定状态下运行应用程序 (A)
  • 我按下主页按钮使应用程序后台运行,当时为我的应用程序状态(A)执行状态编码。
  • 然后该应用程序位于后台。
  • 然后我通过停止在 Xcode 中运行来强制终止该应用程序。
  • 最后,我从手表发送消息,导致系统重新运行被杀死的应用程序。
  • 在这个阶段,我预计会发生状态恢复加载,消息进来并被处理,将应用程序状态更改为状态 B,然后应用程序回到后台。

我的问题是该应用程序在最初后台运行时仍将其状态编码保存在状态 A 中。

在处理完手表连接 sendMessage 后,有什么方法可以强制在后台进行新的状态编码?

当我下一次正确打开我的应用程序时会发生什么,是否会发生状态恢复,这会在处理完手表 sendMessage 后将我们带回到状态 A,它应该处于状态 B。我猜它仍在后台运行,所以无论发生了什么应用程序在后台生成的应用程序应该持续存在,并且不应发生新的状态恢复。但是,如果系统在状态 B 的背景下再次杀死应用程序怎么办。它是否理解这种情况需要新的状态编码来保存新的状态 B,或者它只是杀死应用程序而不做任何事情。如果是这样,那么当我们最终重新启动它时,我们可能会再次回到应用程序状态 A 而不是 B。

顺便说一句,刚刚开始尝试调试这类事情,尽管似乎无法连接我的调试器以用于该系统重新运行我的 iPhone 应用程序的实例。我注意到,当我执行应该唤醒被杀死的 iPhone 应用程序的 sendMessage 时,手表应用程序没有正确更新,即。电话应用程序未完全执行请求的操作。我目前对这个州发生的事情一无所知,但想知道状态恢复是否会阻碍。是否收到消息,唤醒应用程序,尝试对不存在的数据采取行动,因为尚未发生状态恢复,然后发生状态恢复..我第二次从手表发送消息时应用程序行为正确,所以它的好像初始消息唤醒了应用程序但由于某种原因没有 t 正确处理消息。一旦正确唤醒,下一个 sendMessage 将正常处理。

抱歉,我发现文档在 iPhone 应用程序从 sendMessage 调用重新运行后台时发生的情况相当模糊。有人有什么想法吗?非常感谢您的时间!干杯!

4

1 回答 1

1

背景和状态恢复:

您在后台启动(然后终止)的应用程序将永远不会保存状态,因为它永远不会从前台转换到后台(即发生状态保存时)。

保存和恢复状态

UIKit 在适当的时候保留你的应用程序的状态,例如当你的应用程序从前台移动到后台时。

它不保存状态的原因是因为它直接启动到后台。

应用程序生命周期

此外,直接启动到后台的应用程序会进入[后台状态]而不是非活动状态。

调试在后台启动的应用程序:

至于从终止状态在后台启动时附加到您的应用程序,有一个问题已经为这种情况提供了正确的方法。

如果您对此有具体问题,请与该答案的作者发表评论。

于 2016-03-31T01:40:50.560 回答