CoreBluetooth状态保存和恢复

时间:2015-08-16 23:51:20

标签: core-bluetooth cbcentralmanager cbperipheral

我有以下场景:iOS应用(外围设备)X OSX应用(中央)

  • 我使用CBPeripheralManagerOptionRestoreIdentifierKey实例化我的外围设备管理器。
  • 在我的外围设备的didFinishLaunchingWithOptions中,我在使用UIApplicationLaunchOptionsBluetoothPeripheralsKey获取外围设备后发送本地通知(不要对它做任何事情)
  • 在我的外围设备的willRestoreState中,我也会触发通知(除此之外别做任何其他事情)

如果我的外设应用程序在由于内存压力而被杀死之前仍在后台运行,我从OSX中心获取消息就好了。

在iOS应用程序被杀之后,当OSX中心发送消息时,上面提到的两个通知都在iOS上传出,但是我实际上期待的消息不是。

我没有随时重新提供我的外围设备管理器,我应该在哪里以及如何操作?我的应用程序的整个周期只有一个peripheralManager。

欢迎任何建议。

更新:

如果

name : Mission 1
Service offers labels : facelift, painting
date : 08/22/2015 2:00pm

在willRestoreState中,我的应用程序失去了连接

1 个答案:

答案 0 :(得分:1)

是的,在重新讨论了有关此问题的所有主题100次后,我终于弄明白了,以下是它应该如何实现:

在AppDelegate的didFinishLaunchingWithOptions:

if let options = launchOptions {
    if let peripheralManagerIdentifiers: NSArray = options[UIApplicationLaunchOptionsBluetoothPeripheralsKey] as? NSArray {

        //Loop through peripheralManagerIdentifiers reinstantiating each of your peripheralManagers
        //CBPeripheralManager(delegate: corebluetooth, queue: nil, options: [CBPeripheralManagerOptionRestoreIdentifierKey: "identifierInArray"])

    }
    else {
        //There are no peripheralManagers to be reinstantiated, instantiate them as you normally would
    }
}
else {
    //There is nothing in launchOptions, instantiate them as you normally would
}

此时,willRestoreState应该开始被调用,但是,如果您有一个管理所有订阅您的特征的中心,那么您的核心数组中将没有中心。由于我的所有中心总是在我所拥有的单一服务中订阅我的所有特征,因此我只需将所有subscribedCentral中的任何特征重新添加到我的中心数组中。

请根据您的需要进行修改。

在willRestoreState中:

var services = dict[CBPeripheralManagerRestoredStateServicesKey] as! [CBMutableService]

if let service = services.first {

    if let characteristic = service.characteristics?.first as? CBMutableCharacteristic {

        for subscribedCentral in characteristic.subscribedCentrals! {
            self.cbCentrals.append(subscribedCentral as! CBCentral)
        }

    }

}

在此之后你可以打电话给你准备与任何中心交谈的任何方法,即使你同时处理其中的几个。

祝你好运!