我有3 ViewControllers。1)家庭VC 2)扫描VC 3)连接VC
步骤:从家庭VC,我推动扫描VC扫描可用的BLE设备。
扫描VC:我这里有所有的BLE通信代码:
override func viewDidLoad() {
super.viewDidLoad()
AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil) // created global Instance for central Manager and assigned it here
}上面将调用centralManagerDidUpdateState(_ central: CBCentralManager),在那里我正在检查蓝牙的所有状态。如果,
case .poweredOn:
btnRefresh.isEnabled = true
print("central.state is .poweredOn...")
startScan()
}然后我扫描设备。
一旦我得到了我的设备,我就从扫描设备列表中连接到它,
然后我成功地连接到那个设备,它连接到连接VC.
在这里之前一切都很好。
但真正的问题是
1)我从连接VC中弹出扫描VC,然后再弹到HOMEVC和
2)然后再从家庭VC推到扫描VC。
扫描VC: --这将调用并分配代表给我的全局CentralManager,一旦它再次分配委托,它就断开了前面的连接。(即使我也没有接到任何didDisconnectPeripheral电话)
override func viewDidLoad() {
super.viewDidLoad()
AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil) // Here when I come again it disconnects old connection.
}我不知道怎么回事。我不会犯任何错误。请帮帮我..。
发布于 2018-12-31 10:56:45
别担心。我找到了解决办法。感谢@Natrajan给了我一些关于它的想法。
override func viewDidLoad() {
super.viewDidLoad()
if AppConstants.sharedInstance.centralManager == nil{
AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil)
}
else
{
centralManagerDidUpdateState(AppConstants.sharedInstance.centralManager!)
}
}这符合我的目的,我可以检查蓝牙状态并相应地进行扫描(每次按下扫描VC)
尤皮耶..。:)
发布于 2018-12-31 10:24:27
我认为,既然您将CBCentralManager重新分配到AppConstants.sharedInstance.centralManager in viewDidLoad,CBCentralManager就会被破坏并断开连接。
而且,当它被销毁时,它不会返回任何委托回调。
因此,您是否可以尝试像下面这样只初始化一次CBCentralManager,并在需要时断开连接?
示例:
override func viewDidLoad() {
super.viewDidLoad()
if AppConstants.sharedInstance.centralManager == nil{
AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: nil, queue: nil)
}
AppConstants.sharedInstance.centralManager.delegate = self
}https://stackoverflow.com/questions/53986065
复制相似问题