核心蓝牙状态恢复

我正在做一个应用程序,对外设断开作出反应,我现在正在尝试采用iOS 7中引入的ne状态保存和恢复。

我做了一切像文档说的,意思是:

  1. 我为中央添加了背景模式。

  2. 我总是使用相同的唯一标识符来实例化我的中央pipe理器。

  3. 我实现了centralManager:willRestoreState:方法。

当我的应用程序移动到后台时,我用kill(getpid(), SIGKILL);在AppDelegatecallback中杀死它kill(getpid(), SIGKILL); 。 ( 核心蓝牙状态保持和恢复不工作,不能重新启动应用程序到后台 )

当我现在通过删除电池断开外设我的应用程序正在被唤醒如预期和launchOptions[UIApplicationLaunchOptionsBluetoothCentralsKey]包含正确的标识符,但centralManager:willRestoreState:未被调用。 只有当我断开另一个外设时,这个方法才被调用。

这是我的方式:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSArray *peripheralManagerIdentifiers = launchOptions[UIApplicationLaunchOptionsBluetoothPeripheralsKey]; if (peripheralManagerIdentifiers) { // We've restored, so create the _manager on the main queue _manager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) options:@{CBPeripheralManagerOptionRestoreIdentifierKey:@"YourUniqueIdentifier"}]; } else { // Not restored so just create as normal manager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:@{CBPeripheralManagerOptionRestoreIdentifierKey:@"YourUniqueIdentifier"}]; } return YES; } 

接着:

 - (void)peripheralManager:(CBPeripheralManager *)peripheral willRestoreState:(NSDictionary *)dict { // This is the advertisement data that was being advertised when the app was terminated by iOS _advertisementData = dict[CBPeripheralManagerRestoredStateAdvertisementDataKey]; NSArray *services = dict[CBPeripheralManagerRestoredStateServicesKey]; // Loop through the services, I only have one service but if you have more you'll need to check against the UUID strings of each for (CBMutableService *service in services) { _primaryService = service; // Loop through the characteristics for (CBMutableCharacteristic *characteristic in _primaryService.characteristics) { if ([characteristic.UUID.UUIDString isEqualToString:CHARACTERISTIC_UUID]) { _primaryCharacteristic = characteristic; NSArray *subscribedCentrals = characteristic.subscribedCentrals; // Loop through all centrals that were subscribed when the app was terminated by iOS for (CBCentral *central in subscribedCentrals) { // Add them to an array [_centrals addObject:central]; } } } } }