我正在开发对外围设备断开连接有反应的应用程序,现在我正在尝试采用iOS 7中引入的ne状态保存和恢复。
我所做的一切都像文档中所说的那样,意味着:
我为中心添加了背景模式。
我总是以相同的唯一性实例化我的中央经理
标识符。
我实现了centralManager:willRestoreState:
方法。
当我的应用程序移至后台时,我在AppDelegate回调中使用kill(getpid(), SIGKILL);
将其杀死。 (Core Bluetooth State Preservation and Restoration Not Working, Can't relaunch app into background)
现在,当我通过卸下电池断开外围设备的连接时,我的应用程序将按预期方式唤醒,并且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];
}
}
}
}
}