状态保存和恢复BLE-调用确实完成了启动选项,但没有为CBCentral

时间:2015-06-19 15:46:41

标签: swift cbcentralmanager ios-bluetooth

我正在开发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 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方法,但那也没有获得卡。

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

1 个答案:

答案 0 :(得分:3)

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

实例化管理器的一个好处是使用didFinishLaunchingWithOptions方法。

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