14

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

正如 Apple 所说,“由于 Core Bluetooth 内置了状态保存和恢复功能,您的应用程序可以选择加入此功能,以要求系统保留您的应用程序的中央和外围管理器的状态,并继续执行某些与蓝牙相关的任务。代表他们,即使您的应用程序不再运行。当其中一项任务完成时,系统会将您的应用程序重新启动到后台,并让您的应用程序有机会恢复其状态并适当地处理事件。

我添加了以下代码以选择加入此功能:

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

但是应用程序被唤醒时的回调从未被触发。

-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}

-(void)centralManager:(CBCentralManager *)central
      willRestoreState:(NSDictionary *)state {
}

这两个永远不会被调用。

我测试这个唤醒功能的方式:

  1. 我在 info.plist 的后台模式中添加了“蓝牙中央”,因此 BLE 在后台运行。

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

  3. 按回家然后出去,玩一些内存重的游戏,在调试日志中我会看到:“由于内存压力而终止。进程以退出代码 0 完成”。这是为了模拟ios系统如何因内存压力而终止后台应用程序。

  4. 用另一个 iphone No.2 启动一个信标并开始广播。

  5. 结果:那些重新启动的回调永远不会被调用。

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

谢谢!

4

3 回答 3

14

当你点击home键将app发送到后台时,它会暂停,并且可以处理蓝牙代理并在后台运行10s,这个功能可以单独通过“在info.plist中添加蓝牙中枢后台模式”来实现,并且不使用国家保护和恢复。

如果您的应用程序被IOS 终止,由于内存压力,它无法再处理蓝牙代理。在这种情况下,如果您使用了 State Preservation & Restoration,您的应用程序可以重新启动到后台再次运行,同样只有 10 秒。10s 后,它将进入暂停状态。 只有在这种情况下,CBCentralManager 的 willRestoreState 才能被触发。

您可以添加代码

杀死(getpid(),SIGKILL);

到一个按钮动作,当你点击按钮时,你的应用会像被内存压力杀死一样被IOS终止,然后会触发“willRestoreState”。

祝你好运。

于 2014-03-07T08:02:57.113 回答
4

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

于 2013-12-11T22:20:59.807 回答
4

我在后台扫描具有已知服务的外围设备时也遇到了这个问题UUIDs。也许这是iOS中的一个错误。我发现 iOS 在发现外围设备时确实会重新启动应用程序,这可以通过在 XCode 中查看设备管理器的控制台输出来看出。didFinishLaunchingWithOptions委托被调用,但对委托的调用被CBCentralManager's willRestoreState延迟,直到用户手动将应用程序带到前台。

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

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

对于didFinishLaunchingWithOptions委托,在应用程序移至前台之前,调试控制台中不会显示该消息。

我的解决方法是使用在单独线程上运行的自定义队列,而不是queue:nil在创建CBCentralManager. 这样,当应用程序仍在后台时,就会调用代表。

于 2014-01-09T12:17:42.603 回答