18

我试图让我的应用程序响应重新启动到后台是对发现广告外围设备的响应。

以下代码目前在我的应用程序中工作(在前台 + 后台,即使在后台运行数小时后):

[self.centralManager scanForPeripheralsWithServices:self.services options:nil];

通常,我的应用程序没有任何待处理的连接请求,因为我想在后台扫描新广告。以下文档使我相信这仍然是可能的:

重要的是要记住,当且仅当应用程序等待特定的蓝牙事件或操作(如扫描、连接或订阅的通知特性)并且该事件已发生时,它才会重新启动和恢复。(来自https://developer.apple.com/library/content/qa/qa1962/_index.html

系统跟踪...中央管理器正在扫描的服务(以及扫描开始时指定的任何扫描选项)(来自https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts /CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html )

执行

我正在按照“添加对状态保护和恢复的支持”部分下最后一个链接 ^ 中概述的步骤执行以下操作:

  1. 按照指示实例化中央管理器:

    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{ CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier" }];

  2. 重新实例化您的中央和外围管理器

在这里我实际上没有做任何其他事情,因为didFinishLaunchingWithOptions被调用并且中央将使用相同的标识符重新初始化。(这里还有什么我想念的事情要做吗?)

  1. 实现恢复功能:

    (void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary *)state { // 此处设置了断点但从未到达... NSLog(@"..."); }

我如何测试状态保存/恢复

我在恢复函数中设置了一个断点(从第 3 步开始),并且还插入了一个NSLog.

通过单击“停止”,如如何触发核心蓝牙状态保存和恢复中所建议的那样,我希望我可以像往常一样通过我的外围设备进行广告来触发代码(当应用程序时,此发现/连接流程运行良好正在后台运行)。但我不能说真的没有任何事情发生。

我的一般问题是:为什么没有触发断点/没有打印 NSLogs?是否有调试恢复功能的首选方法?

最后,作为健全性检查,我是否正确阅读了文档,发现广告外围设备应该触发应用程序重新启动到后台以供应用程序处理?

4

0 回答 0