WatchOS WCSession sendMessage waking killed iPhone 应用程序的调试和状态恢复问题

Debugging and state restoration concerns of WatchOS WCSession sendMessage waking killed iPhone app

我正在尝试向我的应用程序添加简单的 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 生成进程,如果我尝试附加到进程显然为时已晚,理想情况下我希望能够尽早设置断点以查看情况工作。更糟糕的情况是,我可以依赖很多我猜想的日志并查看这些日志。只是想知道是否有尝试调试这种情况的好方法?

最后,在这个被杀死的应用程序 运行 中,发送消息时发生的情况与状态恢复有关。 IE。

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

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

当我下次正确打开我的应用程序时会发生什么,是否会发生状态恢复,这使我们在处理完手表发送消息时回到状态 A,它应该处于状态 B。我猜它仍然 运行因此,当应用程序在后台生成应用程序时发生的任何事情都应该持续存在,并且不会发生新的状态恢复。但是,如果系统在后台处于状态 B 时再次终止应用程序怎么办?它是否理解这种情况需要新的状态编码来保存新的状态 B,或者它只是终止应用程序而不做任何事情。如果是这样,那么当我们最终重新启动它时,我们可能会再次回到应用程序状态 A 而不是 B。

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

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

背景和状态恢复:

您在后台启动(然后终止)的应用永远不会保存状态,因为它从不从前台过渡到后台(这是状态保存发生的时候)。

来自 Preserving and Restoring State:

UIKit preserves your app’s state at appropriate times, such as when your app moves from the foreground to the background.

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

来自The App Life Cycle

In addition, an app being launched directly into the background enters [the background state] instead of the inactive state.

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

至于当应用程序从终止状态在后台启动时附加到您的应用程序,这种情况有 a question which already provides the correct approach

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