状态保存和恢复 BLE- 调用 didFinishLaunchingWithOptions 但不为 CBCentral 调用任何委托方法

State Preservation and Restoration BLE- Calls didFinishLaunchingWithOptions but doesn't call any delegate method for CBCentral

我正在开发 iPhone 应用程序并已实现 CBCentralManager。还使用后台模式更新了 plist,使用标识符初始化了 centralmanager。

还在 didFinishLaunchingWithOptions

中添加了这段代码
if var centralManagerIdentifiers: NSArray = launchOptions?    [UIApplicationLaunchOptionsBluetoothCentralsKey] as? NSArray {
    // Awake as Bluetooth Central
    // No further logic here, will be handled by centralManager willRestoreState

    for identifier in  centralManagerIdentifiers {
        if identifier as NSString == "centralManager"{
            var notification = UILocalNotification()
            notification.alertBody = String(centralManagerIdentifiers.count) 
            notification.alertAction = "open" 
            notification.fireDate =  NSDate()
            notification.soundName = UILocalNotificationDefaultSoundName 
            UIApplication.sharedApplication().scheduleLocalNotification(notification)

            }
        }
}

我在不同的 class 中创建了一个中央管理器,那是单例。

    class var sharedInstance: BLEManager {
    struct Singleton {
        static let instance = BLEManager()
    }

    return Singleton.instance
}


override init() {
    super.init()
    let centralQueue = dispatch_queue_create(“centralManager_queue”, DISPATCH_QUEUE_SERIAL)
    centralManager = CBCentralManager(delegate: self, queue: centralQueue, options: [CBCentralManagerOptionRestoreIdentifierKey : "centralManager"])
}

如果我一两天不使用我的应用程序,然后外围设备开始广告,应用程序会唤醒并触发此通知,但不会调用任何 CBCentral 委托方法。我也实现了 willRestoreState 方法,但那也没有得到卡片。

用例:我需要连接外围设备并在其开始广告后发送数据,即使应用程序未被使用。 当应用程序收到 didFinishLaunchingWithOptions 调用时,我应该在哪里处理连接过程?我必须在 did finishlaunch 方法中初始化 centralManager 吗?

必须立即初始化中央管理器以处理委托调用。一旦创建 CBPeripheralManager 并将委托传递给 init 方法,就会调用委托方法。如果管理器的标识符与挂起的会话匹配,则状态将被恢复。

实例化管理器的一个好点是在 didFinishLaunchingWithOptions 方法中。

您可以通过导致崩溃或在测试时按下 xCode 的停止按钮并等待 BLE 触发的新操作(例如来自通知特性的通知)来轻松测试它.这比等待几天系统杀死不活动的应用程序要快得多。