4

状态保存和恢复由于状态保存和 恢复是建立在对蓝牙核心,您的应用程序可以选择在这个 功能要求系统保存的状态你应用程序的中央 和外围经理,并继续代表他们执行某些 蓝牙相关的任务,甚至当你的应用程序是没有 不再运行。 当其中一个任务完成后,系统 将重新启动您的应用程序到后台,并给出你的应用程序的 机会恢复其状态,并适当地处理该事件 。在上述的家庭安全应用程序的情况下, 系统将监控连接请求,并重新重新发动 应用来处理centralManager:didConnectPeripheral:委托 回调当用户返回家,从而完成了连接请求 。如何触发核蓝牙状态保存和恢复

我怎么可以触发这个和测试的代码?

我有一个服务配件。我有一个扫描服务的应用程序,我选择了保存状态。然而,我不知道如何进行逻辑测试,因为我不知道我需要触发它。这些是我没能成功的选项:我试图去的Xcode

A - kill the app from Xcode 

B - kill the app manually 

C - power off the phone 

D - something else 

在所有这些选项 - >设备和查看日志,但还没有看到任何状态恢复日志。

感谢

回答

7

NB感谢user1785784分享苹果的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-centralUIBackgroundModes你的信息.plist
  2. 设置为CBCentralManagerOptionRestoreIdentifierKey当启动您的CBCentralManager
  3. 实施了在您的CBCentralManager代表中回拨-(void)centralManager:willRestoreState:

那么你准备好测试状态恢复:

  1. 获取应用程序的一些已知的状态(比如Bluetooth技术,连一些设备/连接)
  2. 终止该应用在Xcode
  3. 观看日志或set a launch breakpoint
  4. 改变蓝牙状态,例如通过
    • 切换航空公司模式
    • 采取蓝牙设备超出范围(以避免行走,我把矿井中的导体/法拉第笼/咖啡壶)
    • 使设备回到范围内
    • 相互作用与设备,例如通过按下一个按钮,/它的脉冲
  5. 看你的状态恢复的代码被称为

NBapplication:didFinishLaunchingWithOptions:称为第一,并且如上所述,你必须立即初始化您CBCentralManager然后centralManager:willRestoreState:将被调用。

A coffee pot that is also a Faraday Cage

+0

我该如何看应用程序日志?使用Xcode->设备? – mm24

+0

@RhytmicFistman非常感谢你的回答..我正在使用你的方法。但是我不确定我是否正确实施了状态恢复代码。我是否需要在AppDelegate didFinishLaunchingWithOptions中实例化新的CBCentralManager对象?你能请分享一些简单的示例代码吗? – mm24

+0

PS:同样,无论何时我使用NSLog,我都看不到设备日志中记录的消息(当应用程序被终止时)。我只能看到诸如“BTLE扫描仪开机”之类的东西。 – mm24

2

与苹果技术的帮助下就想通了这一点最近。 Also given/have a nice link that shows the different ways to cause the app to restart without user intervention.

我是通过使应用程序突然崩溃并使用下面的swift代码片段实现的。这会导致应用程序重新启动,并调用'willRestoreState'回调。

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

谢谢你这个非常重要的链接! –