我正在开发对外围设备断开连接有反应的应用程序,现在我正在尝试采用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];

                }
            }
        }
    }
}

08-27 18:57