问题标签 [ble-state-preservation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1487 浏览

ios - CoreBluetooth 状态保存:恢复 CBCentralManager 的正确方法

当应用程序由于状态保存事件而获得选项午餐时,从 AppDelegate 恢复 CBCentralManager 的正确方法是什么?

0 投票
2 回答
6161 浏览

ios - 如何触发Core蓝牙状态保存和恢复

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

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

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

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

谢谢

0 投票
1 回答
1037 浏览

ios - protectedDataAvailable always true

From what I understand, UIApplication.sharedApplication().protectedDataAvailable should return false when the phone is locked and protected data is enabled on the iPhone (apparently setting a passcode enables it).

However, despite of the scenario, it always returns true.

Once my app gets reawaken by iOS due to Corebluetooth State Preservation and Restoration, I need to immediately know whether the phone is locked.

I've implemented event listeners to know when the phone gets locked/unlocked, but they are only useful once the lock state changes, I am unable to determine the lock state prior to an event.

Any ideas? Thanks

UPDATE:

this is what I use in applicationDidFinishLaunchingWithOptions:

0 投票
0 回答
64 浏览

core-bluetooth - 核心蓝牙状态保存和恢复无法正常工作

我关注了wwdc视频中的状态保存和恢复——https: //developer.apple.com/videos/play/wwdc2013/703/

我遇到的问题是,在操作系统关闭应用程序后,当 BLE 设备超出范围时。操作系统在 10 秒内没有像应有的那样唤醒应用程序并调用 didDisconnect 回调,以便我可以在其上调用连接函数。关于如何解决这个问题的任何想法?

0 投票
0 回答
49 浏览

ios - 有没有办法准确衡量“蓝牙状态保存”对应用能源使用的影响?

我想详细监控能源使用情况,并衡量蓝牙状态保存和恢复对 iOS 后台处理的影响。

我想衡量即使应用程序未运行,iOS 也会保持与蓝牙设备的“连接”处于活动状态的影响。

有没有办法这样做?


附加信息

一周前,我开始记录应用程序的能源使用情况。现在我在 Instruments 中导入了日志,现在没有了。这是 Xcode Instruments 的硬性限制吗?

关于能源使用记录的类似问题

还有这个问题通过仪器解释了更多关于能源使用记录的信息。它突出了测量单位 (20/20) 的限制。我认为这是一个硬限制,因为很难测量手机电池的相对电池电压。Apple 可能根据历史使用统计数据实现了一些近似值。

0 投票
1 回答
55 浏览

ios - 由于我激活了 BLE 状态保存,我的应用耗尽了所有电池

我有一个连接到 BLE 外围设备的应用程序。它实现了BLE的状态保存和恢复,并将连接保持在后台。

当我将手机放在外围设备旁边时,即使应用程序没有运行,外围设备也会显示有活动连接,如果放置 12 小时,它会显着减少电池电量(即使没有发生数据传输)。

这是个常见的问题吗?

我发现geolocation的类似问题。有没有办法为“BLE State-preservation”设置刷新率?

0 投票
0 回答
394 浏览

ios - 蓝牙 BLE 状态保存:CBCentralManager 在后台不会发现服务

编辑: 在@RobertVaessen 评论之后,我实现了以下内容,但是我仍然无法发现连接的外围设备的服务。

现在的疑问是:

当应用程序处于前台并首次连接到外围设备时,我已经发现了服务,这是否意味着一旦应用程序再次被唤醒,CBCentralManager 将无法发现服务?


理论背景

此处描述了蓝牙 LE 状态保存过程(请参阅“添加对状态保存和恢复的支持”部分):

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html

我正在尝试做的事情:

我正在实现一个应用程序,它使用BLE 状态保存来保持与硬件附件的连接(在后台运行时)。

我遇到的问题是,每当iOS 在 BLE 状态保存事件之后唤醒我的应用程序时,我的 CBCentralManager 都无法发现这些服务。奇怪的是,硬件外围设备“看到”了连接,但 iOS 应用程序无法访问它。

换句话说: 实现 CBCentralManager 委托的类中的以下方法被正确调用,但作用不大(请参见下面的绿色注释):

PS:我也在苹果开发者论坛上问过这个问题,但到目前为止还没有回复。


PPS: 我还在 info.plist 文件中激活了后台模式:

在此处输入图像描述

0 投票
0 回答
701 浏览

ios - 无法在 iOS 上触发 BLE 的状态恢复代码

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

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

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

重要的是要记住,当且仅当应用程序等待特定的蓝牙事件或操作(如扫描、连接或订阅的通知特性)并且该事件已发生时,它才会重新启动和恢复。(来自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?是否有调试恢复功能的首选方法?

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