9

状态保存和恢复 因为状态保存和恢复内置于核心蓝牙中,所以您的应用可以选择使用此功能来要求系统保存您应用的中央和外围管理器的状态,并继续在其上执行某些与蓝牙相关的任务代表,即使您的应用程序不再运行。当其中一项任务完成时,系统会在后台重新启动您的应用程序,并让您的应用程序有机会恢复其状态并适当地处理事件。在上述家庭安全应用的情况下,系统会监控连接请求,并在用户回到家并且连接请求完成时重新启动应用以处理 centralManager:didConnectPeripheral: 委托回调。

我怎样才能触发它并测试代码?

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

A - kill the app from Xcode

B - kill the app manually

C - power off the phone

D - something else

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

谢谢

4

2 回答 2

18

注意感谢user1785784分享 Apple 的QA1962 - 蓝牙状态恢复将重新启动应用程序的条件,该应用程序描述了 iOS 11 中的新蓝牙行为。本文档应被视为此问题的答案,尽管我认为它错误地声称 iOS 10重新启动一个被强制退出的应用程序。(我还没有在 iOS 10 设备上测试过,但它会偏离 iOS 9。有人可以确认吗?)。

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

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

我不知道任何D。

我用A。

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

  1. 添加bluetooth-centralUIBackgroundModes您的 Info.plist
  2. CBCentralManagerOptionRestoreIdentifierKey在初始化你的时候设置一个CBCentralManager
  3. 在您的委托中实现了-(void)centralManager:willRestoreState:回调。CBCentralManager

然后你就可以测试状态恢复了:

  1. 让应用程序进入某个已知状态(比如蓝牙开机,某些设备已连接/正在连接)
  2. 在 Xcode 中杀死应用程序
  3. 查看日志或设置启动断点
  4. 更改蓝牙状态,例如通过
    • 切换航空公司模式
    • 将蓝牙设备带出范围(为了避免走路,我把我的放在导体/法拉第笼/咖啡壶中)
    • 将设备带回范围
    • 与设备交互,例如通过按下按钮/有脉冲
  5. 观看您的状态恢复代码被调用

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

咖啡壶也是法拉第笼

于 2015-10-15T00:23:47.420 回答
3

最近在 Apple Tech 的帮助下才发现这一点。还给出/有一个很好的链接,显示了在没有用户干预的情况下导致应用程序重新启动的不同方式。

我通过以下快速代码片段使应用程序突然崩溃来做到这一点。这会导致应用重新启动并调用“willRestoreState”回调。

DispatchQueue.main.asyncAfter(deadline: .now() + 5)
        {
            print("Killing app")
            // CRASH
            if ([0][1] == 1){
                exit(0)
            }
            exit(1)
        }
于 2017-10-15T17:10:43.927 回答