如何触发核心蓝牙状态保存和恢复

时间:2015-10-14 15:57:37

标签: ios xcode bluetooth state-restoration ble-state-preservation

  国家保护和恢复因为国家保护和   恢复内置于Core Bluetooth,您的应用可以选择加入此功能   要求系统保留应用程序中心状态的功能   和外围经理人并继续表现一定   代表他们执行与蓝牙相关的任务,即使您的应用没有   运行时间更长当其中一个任务完成时,系统   将您的应用重新启动到后台并为您的应用提供   恢复其状态和处理事件的机会   适当的。对于上述家庭安全应用程序,   系统将监视连接请求,并重新启动   用于处理centralManager的应用程序:didConnectPeripheral:delegate   用户返回home和连接请求时的回调   完成。

如何触发此操作并测试代码?

我有一个服务配件。我有一个应用程序扫描服务,我选择了状态保存。但是我不确定如何对它进行逻辑测试,因为我不知道触发它需要什么。这些是我尝试失败的选项:

A - kill the app from Xcode

B - kill the app manually

C - power off the phone

D - something else

在所有这些选项中,我试图转到 Xcode - >设备并查看日志,但没有看到任何状态恢复日志。

由于

2 个答案:

答案 0 :(得分:13)

NB 感谢user1785784分享Apple的QA1962 - Conditions Under Which Bluetooth State Restoration Will Relaunch An App,其中介绍了iOS 11中的新蓝牙行为。本文档应视为此问题的答案,虽然我认为它错误地声称iOS 10 重新启动已经强制退出的应用程序。 (我还没有在iOS 10设备上对其进行过测试,但它会偏离iOS 9.任何人都可以确认吗?)。

从任务切换器手动杀死应用程序(B),确保在用户再次明确打开应用程序之前,您的应用程序不会自动启动。

C也不起作用,我认为只有VOIP应用程序在重启后自动启动,然后才会在设备解锁后启动。

我不知道任何D.

我用A.

首先,要实现蓝牙状态恢复,请确保

  1. added bluetooth-central作为您的Info.plist的UIBackgroundModes
  2. 在发起CBCentralManagerOptionRestoreIdentifierKey
  3. 时设置CBCentralManager
  4. -(void)centralManager:willRestoreState:代表中实施了CBCentralManager回调。
  5. 然后你准备好测试状态恢复了:

    1. 让应用程序进入某种已知状态(例如蓝牙开启,某些设备连接/连接)
    2. 在Xcode中杀死应用程序
    3. 观看日志或set a launch breakpoint
    4. 改变蓝牙状态,例如通过
      • 切换航空公司模式
      • 将蓝牙设备超出范围(为了避免走路,我把我放在指挥/法拉第笼/咖啡壶中)
      • 将设备带回范围
      • 与设备交互,例如按一下按钮/有一个脉冲
    5. 请注意您的州恢复代码
    6. NB :首先会调用application:didFinishLaunchingWithOptions:,您必须立即启动CBCentralManager,如上所述。 然后 centralManager:willRestoreState:将被调用。

      A coffee pot that is also a Faraday Cage

答案 1 :(得分:3)

最近在Apple Tech的帮助下想到了这一点。 Also given/have a nice link that shows the different ways to cause the app to restart without user intervention.

我是通过使用以下快速代码片段突然崩溃导致应用程序崩溃的。这会导致应用重新启动,并且会调用“恢复状态”'打回来。

DispatchQueue.main.asyncAfter(deadline: .now() + 5)
        {
            print("Killing app")
            // CRASH
            if ([0][1] == 1){
                exit(0)
            }
            exit(1)
        }