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

状态保存和恢复由于状态保存和恢复是内置于蓝牙核心,您的应用程序可以select使用此function,要求系统保存您的应用程序的中央和外围pipe理人员的状态,并继续执行某些与蓝牙有关的任务即使您的应用程序不再运行,也是如此。 当这些任务中的一个完成时,系统会将您的应用程序重新启动到后台,并为您的应用程序提供恢复其状态并适当处理事件的机会。 在上述家庭安全应用的情况下,系统将监控连接请求,并且当用户返回家庭并且连接请求完成时,重新启动应用以处理centralManager:didConnectPeripheral:委托callback。

我怎样才能触发这个testing代码?

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

A - kill the app from Xcode B - kill the app manually C - power off the phone D - something else 

在所有这些选项中,我尝试去Xcode – >设备 ,看看日志,但没有看到任何状态恢复日志。

谢谢

NB感谢用户1785784分享苹果的QA1962 – 蓝牙状态恢复的条件将重新启动一个应用程序 ,描述了iOS 11的新的蓝牙行为。这个文件应该被认为是这个问题的答案,但我认为它错误地声称iOS 10 重新启动一个已经强制退出的应用程序。 (我还没有在iOS 10设备上testing过,但是本来应该是从iOS 9开始的。谁能确认?)。

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

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

我不知道D.

我用A.

首先,要实现蓝牙状态恢复,确保你已经

  1. 添加bluetooth-central作为UIBackgroundModes到您的Info.plist
  2. CBCentralManagerOptionRestoreIdentifierKey时设置一个CBCentralManager
  3. CBCentralManager委托中实现了-(void)centralManager:willRestoreState: callback。

然后你准备好testing状态恢复:

  1. 让应用程序到一些已知的状态(说蓝牙开机,一些设备连接/连接)
  2. 杀死Xcode中的应用程序
  3. 观察日志或设置启动断点
  4. 改变蓝牙状态,例如通过
    • 切换航空公司模式
    • 蓝牙设备超出范围(为了避免走路,我把我的指挥/法拉第笼/咖啡壶)
    • 把设备带回范围
    • 与设备交互,例如通过按下button/具有脉冲
  5. 看你的状态恢复代码被调用

注意application:didFinishLaunchingWithOptions:将被首先调用,并且您必须立即按照上面的描述初始化您的CBCentralManager然后 centralManager:willRestoreState:将被调用。

一个也是法拉第笼的咖啡壶

刚刚在苹果技术公司的帮助下发现了这个问题。 还给出/有一个不错的链接,显示不同的方式来导致应用程序重新启动,而无需用户干预。

我通过下面的代码片段让应用突然崩溃了。 这导致应用程序重新启动,并调用“willRestoreState”callback。

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