核心蓝牙状态保持和恢复不工作,无法重新启动应用程序到后台

我试图让核心蓝牙唤醒应用程序,即使它没有运行。

正如苹果指出的那样,“由于状态保存和恢复是内置在蓝牙芯片中的,因此您的应用可以select使用此function来要求系统保留您应用的中央和外围pipe理员的状态,并继续执行某些与蓝牙相关的任务即使你的应用程序不再运行,当这些任务中的一个完成时,系统将把你的应用程序重新启动到后台,让你的应用程序有机会恢复它的状态并适当地处理事件。

我添加了以下代码来join此function:

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

但是,应用程序醒来时的callback从未触发过。

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { } -(void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary *)state { } 

这两个从来没有被称为。

我正在testing这个唤醒function的方式:

  1. 我在info.plist中添加了背景模式下的“bluetooth central”,所以BLE在后台运行。

  2. 在我的iphone 1号启动centralManager。 开始扫描。

  3. 按回家,出门,玩一些记忆沉重的游戏,在debugging日志中,我会看到:“由于内存压力终止,处理完成退出代码0”。 这是为了模拟由于内存压力,ios系统如何终止后台应用程序。

  4. 用另一个iphone 2号启动一个灯塔并开始播放。

  5. 结果:那些重新启动callback从未被调用。

任何想法,为什么这是行不通的? 如果是API问题,当您的手机靠近BLE信标时,是否有其他方法可以将您的应用程序重新启动为BLE后台? 我已经尝试使用ibeacon来唤醒应用程序,但核心蓝牙中央pipe理器不会允许您在后台连接ibeacon。

谢谢!

CoreBluetooth状态恢复仅适用于连接和外设事件。 单纯依靠扫描目前不支持。

当您点击主页button发送应用程序到后台,它暂停,并且可以处理蓝牙代表并在后台运行10秒,这个function可以单独通过“在后台添加蓝牙模式在i​​nfo.plist中”来实现使用国家保存和恢复。

如果你的应用程序被IOS终止,由于内存的压力 ,它不能再处理蓝牙代表。 在这种情况下,如果您使用状态保存和恢复,您的应用程序可以重新启动后台运行,也只有10秒。 十几秒钟后,它将进入暂停状态。 只有在这种情况下,CBCentralManager的willRestoreState才能被触发。

你可以添加代码

kill(getpid(),SIGKILL);

以一个button的动作,当你点击button,你的应用程序将被IOS终止,就像被内存压力杀死,然后“willRestoreState”将被触发。

祝你好运。

我也有这个问题与后台扫描已知的服务UUIDs外设。 也许这是iOS中的一个错误。 我发现iOS在发现外设时会重新启动应用程序,正如通过观看XCode中设备pipe理器的控制台输出所看到的一样。 didFinishLaunchingWithOptions委托被调用,但对CBCentralManager's willRestoreState委托的调用被延迟,直到用户手动将应用程序放到前台。

就好像主线程上的事件循环没有运行,即使应用程序已经启动。 例如,添加代码时:

 dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"Hello from the main thread"); }); 

didFinishLaunchingWithOptions委托,消息不显示在debugging控制台中,直到应用程序移动到前台。

我的解决方法是使用在单独的线程上运行的自定义队列,而不是传递queue:nil创buildCBCentralManager 。 这样,代表被调用,而应用程序仍然在后台。