ios - WatchOS WCSession sendMessage的调试和状态恢复问题唤醒了被杀死的iPhone应用程序

标签 ios watchos-2 watchconnectivity state-restoration

我正在尝试向我的应用程序添加简单的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发送情况下,该被终止应用程序运行时发生了什么。即。


我的应用在特定状态下运行(A)
我按下主页按钮以使应用程序后台运行,此时对我的应用程序状态(A)执行了状态编码。
然后,该应用程序位于后台。
然后,我通过停止在Xcode中运行来强制终止该应用程序。
最后,我接着从手表发送sendMessage,使系统重新运行被终止的应用程序。
在这个阶段,我希望状态恢复加载发生,消息进入并经过处理,将应用程序状态更改为状态B,然后该应用程序返回到后台。


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

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

当我下次正确打开我的应用程序时,会发生什么状态恢复,当处理完手表sendMessage时,它会回到状态A,它应该处于状态B。我猜测它仍在后台运行,所以当应用程序在后台生成的应用程序应持久存在,并且不会发生新的状态恢复。但是,如果系统在处于状态B的背景下又再次终止了该应用程序,该怎么办?它是否欣赏这种情况需要使用新的状态编码来保存新的状态B,还是只是终止了该应用程序而什么也不做。如果是这样,那么当我们最终重新启动它时,我们可能会再次回到应用程序状态A,而不是B。

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

抱歉,对于从sendMessage调用重新运行iPhone应用程序时发生的情况,我发现文档含糊不清。任何人有任何想法吗?一如既往地感谢您的宝贵时间!干杯!

最佳答案

背景和状态恢复:

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

Preserving and Restoring State


  UIKit在适当的时间(例如,当您的应用程序从前台移到后台时)会保留您的应用程序状态。


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

The App Life Cycle


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


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

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

如果您对此有特定疑问,请与该答案的作者发表评论。

关于ios - WatchOS WCSession sendMessage的调试和状态恢复问题唤醒了被杀死的iPhone应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36320816/

相关文章:

ios - IOS 上的辅助功能问题。画外音未检测到 aria-expanded

swift - 如何在非事件 watch 收到本地通知时触发触觉警报

ios - 观看 OS 2 问题以设置图像

swift - 结合 WatchConnectivity 和并发症

iphone - UILocalNotification 不会触发

ios - 将字符串转换为整数 iOS + Swift 2.0

ios - 如何处理异步 sendMessage 调用?

ios - 无法从动态通知 Controller 发送 Watch Connectivity 消息

ios - 在xib中使用UIStackview,隐藏和显示 subview 问题

swift - RealmSwift 和 watchos2