国家保护和恢复因为国家保护和 恢复内置于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 - >设备并查看日志,但没有看到任何状态恢复日志。
由于
答案 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.
首先,要实现蓝牙状态恢复,请确保
bluetooth-central
作为您的Info.plist的UIBackgroundModes
CBCentralManagerOptionRestoreIdentifierKey
CBCentralManager
-(void)centralManager:willRestoreState:
代表中实施了CBCentralManager
回调。然后你准备好测试状态恢复了:
NB :首先会调用application:didFinishLaunchingWithOptions:
,您必须立即启动CBCentralManager
,如上所述。 然后 centralManager:willRestoreState:
将被调用。
答案 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)
}