我正在开发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?
答案 0 :(得分:3)
必须立即初始化中央管理器以处理委托调用。创建CBPeripheralManager并将委托传递给init方法后,将调用委托方法。如果管理器的标识符与挂起的会话匹配,则将恢复状态。
实例化管理器的一个好处是使用didFinishLaunchingWithOptions
方法。
您可以通过导致崩溃或在测试时按下xCode的停止按钮并等待BLE触发的新操作(例如,通知特性的通知)来轻松测试。它比等待几天系统杀死应用程序不活动要快得多。