我似乎无法让它正常工作.我已经遵循了苹果在他们的核心蓝牙文档中提到的每个指导以及状态保存的一般文档.
例如:Core Bluetooth Background Processing for iOS Apps和这里:iOS State Preservation and Restoration
我可以让一般的状态保存在设备上工作(对于视图控制器和对象等),但不能用于蓝牙管理器.
据我所知,cheklist看起来像这样:
>通过在密钥CBCentralManagerOptionRestoreIdentifierKey的选项字典中分配恢复标识符来分配和初始化中央管理器对象时,选择保留和恢复.
>在系统重新启动应用程序后,重新实例化任何中央管理器对象.当应用程序:didFinishLaunchingWithOptions:被调用时,这在app delegate中完成.在这里,我应该在选项字典中查找UIApplicationLaunchOptionsBluetoothCentralsKey,然后使用该密钥重新安排CBManager.在这里出现问题,因为该密钥从来没有任何标识符,因此我无法重新启用它.
>实现适当的恢复委托方法.我也做了这一步,但由于管理器从未重新实例化,我从未收到过这个委托回调.
该应用程序在后台运行良好,我也遵循该部分的所有步骤.
现在,说了这些,我并不确定如何测试这个,这可能是这个问题的一部分.我现在的做法是按下iOS设备上的主页按钮(执行设备),以便将应用程序置于后台并返回主屏幕.在这样做时,我可以通过查看我的日志输出来判断所有常规状态保存调用是否实现.在此之后,我通过按Xcode中的停止按钮退出应用程序以终止后台进程.我现在通过Xcode重新启动应用程序,现在我再次看到正在执行的所有常规状态保存代码,除了蓝牙管理器之外的所有状态都恢复状态.
如果这是错的,请告诉我.但总的来说,我对此非常困惑,因为它在核心蓝牙文档中说,只有当“你的应用程序被系统重新启动”时才会进行保存.那个的真实意义是什么?我还在Apple开发者论坛上看了一篇文章,自从iOS 7以来,如果用户手动杀死我正在做的应用程序,操作系统现在永远不会以任何理由重新启动应用程序.
任何有关这方面的帮助将非常感谢!
/一个
解决方法
如果您的应用程序被IOS终止,由于内存压力,它无法再处理蓝牙代表.在这种情况下,如果您使用了State Preservation&恢复,您的应用程序可以重新启动到后台再次运行,也只有10秒. 10秒后,它将进入暂停状态.
只有在这种情况下,才能触发CBCentralManager的willRestoreState.
[kill(getpid(),SIGKILL);]
对于按钮操作,当您单击该按钮时,您的应用程序将被IOS终止,就像被内存压力杀死一样,然后将触发“willRestoreState”.
祝好运.