iOS核心蓝牙状态保存和恢复问题

Ant*_*ton 7 bluetooth objective-c ios core-bluetooth

我对iOS 7上的核心蓝牙的状态保存和恢复有疑问.

我似乎无法让它正常工作.我已经按照苹果在他们的核心蓝牙文档中提到的每个指导以及状态保存的一般文档.

例如:iOS应用程序的核心蓝牙背景处理和此处:iOS状态保存和恢复

我可以让一般的状态保存在设备上工作(对于视图控制器和对象等),但不能用于蓝牙管理器.

据我所知,cheklist看起来像这样:

  1. 通过在密钥CBCentralManagerOptionRestoreIdentifierKey的选项字典中分配恢复标识符来分配和初始化中央管理器对象时,选择保留和恢复.

  2. 在系统重新启动应用程序后,重新实例化任何中央管理器对象.当应用程序:didFinishLaunchingWithOptions:被调用时,这在app delegate中完成.在这里,我应该在选项字典中查找UIApplicationLaunchOptionsBluetoothCentralsKey,然后使用该密钥重新安排CBManager.在这里出现问题,因为该密钥从来没有任何标识符,因此我无法重新启用它.

  3. 实现适当的恢复委托方法.我也做了这一步,但由于管理器从未重新实例化,我从未收到过这个委托回调.

该应用程序在后台工作正常,我也遵循该部分的所有步骤.

现在,说了这么多,我并不确定如何测试这个,这可能是这个问题的一部分.我现在这样做的方法是按下iOS设备上的主页按钮(执行设备),这样它就可以将应用程序置于后台并返回主屏幕.在这样做时,我可以通过查看我的日志输出来判断所有常规状态保存调用是否实现.在此之后,我通过按Xcode中的停止按钮退出应用程序以终止后台进程.我现在通过Xcode重新启动应用程序,现在我再次看到正在执行的所有常规状态保存代码,除了蓝牙管理器之外的所有状态都恢复状态.

如果这是错的,请告诉我.但总的来说,我对此非常困惑,因为它在核心蓝牙文档中说,只有当" 你的应用程序被系统重新启动 "时才会进行保存.那个的真实意义是什么?我还在Apple开发者论坛上阅读了一篇文章,自从iOS 7以来,如果用户手动杀死我正在做的应用程序,操作系统现在永远不会以任何理由重新启动应用程序.

任何有关这方面的帮助将不胜感激!

/一个

小智 6

当您单击主页按钮将应用程序发送到后台时,它会暂停,并且可以处理蓝牙代表并在后台运行10秒,此功能可以通过"在info.plist中的后台模式中添加蓝牙中心"来实现,并且不使用国家保护与恢复.

如果您的应用程序被IOS终止,由于内存压力,它无法再处理蓝牙代表.在这种情况下,如果您使用状态保存和恢复,您的应用程序可以重新启动到后台再次运行,也只有10秒.10秒后,它将进入暂停状态. 只有在这种情况下,才能触发CBCentralManager的willRestoreState.

您可以添加代码

[kill(getpid(), SIGKILL);]
Run Code Online (Sandbox Code Playgroud)

对于按钮操作,当您单击该按钮时,您的应用程序将被IOS终止,就像被内存压力杀死一样,然后将触发"willRestoreState".

祝好运.


all*_*rog 5

首先,请注意视图控制器的状态保存与核心蓝牙管理器的恢复无关。

重要提示:恢复不适用于扫描、静态特征以及通常不会生成连接相关事件的任何用例。

现在步骤:

  1. 确保在测试的应用程序上有以下任何一项:
    • 外围管理器正在做广告
    • 外围管理器已连接中心
    • 中央正在尝试连接到外围设备
    • 中央连接到一些外围设备
  2. 使用此应用程序杀死您的应用程序:https : //github.com/ddaddy/BackgroundKill(向 ddaddy 致敬,在 repo 上给一颗星)
    1. 切换到杀手级应用
    2. 启动查杀进程,等待被系统终止
    3. 你的应用程序现在被杀死了
  3. 做一些连接事件
    • (已测试的外围设备)订阅外围设备上的特性
    • (经过测试的外设)开始对动态特性的读取请求
    • (中心测试)使连接请求成功
    • (测试中心)更新外围设备上的订阅特性

根据您要测试的内容,请考虑列表中的适用点。在您测试的应用程序中使用日志记录并查看管理器中的日志以了解随着时间的推移会发生什么。