核心蓝牙状态保持和恢复不工作,无法重新启动应用程序到后台
我试图让核心蓝牙唤醒应用程序,即使它没有运行。
正如苹果指出的那样,“由于状态保存和恢复是内置在蓝牙芯片中的,因此您的应用可以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的方式:
-
我在info.plist中添加了背景模式下的“bluetooth central”,所以BLE在后台运行。
-
在我的iphone 1号启动centralManager。 开始扫描。
-
按回家,出门,玩一些记忆沉重的游戏,在debugging日志中,我会看到:“由于内存压力终止,处理完成退出代码0”。 这是为了模拟由于内存压力,ios系统如何终止后台应用程序。
-
用另一个iphone 2号启动一个灯塔并开始播放。
-
结果:那些重新启动callback从未被调用。
任何想法,为什么这是行不通的? 如果是API问题,当您的手机靠近BLE信标时,是否有其他方法可以将您的应用程序重新启动为BLE后台? 我已经尝试使用ibeacon来唤醒应用程序,但核心蓝牙中央pipe理器不会允许您在后台连接ibeacon。
谢谢!
CoreBluetooth
状态恢复仅适用于连接和外设事件。 单纯依靠扫描目前不支持。
当您点击主页button发送应用程序到后台,它暂停,并且可以处理蓝牙代表并在后台运行10秒,这个function可以单独通过“在后台添加蓝牙模式在info.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
。 这样,代表被调用,而应用程序仍然在后台。