0

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

我按照文档中的说明做了所有事情,这意味着:

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

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

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

当我的应用程序移到后台时,我在 AppDelegate 回调中用kill(getpid(), SIGKILL);. (核心蓝牙状态保存和恢复不起作用,无法将应用重新启动到后台

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

4

1 回答 1

1

这就是我的方式:

- (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];

                }
            }
        }
    }
}
于 2015-02-26T11:48:18.337 回答