核心蓝牙:CBPeripheral 在不知不觉中断开连接并且没有收到任何对 didDisconnectPeripheral 的调用
Core Bluetooth: CBPeripheral disconnects unknowingly and not getting any call to didDisconnectPeripheral
我有 3 个视图控制器。
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.
}
我不知道出了什么问题。我没有收到任何错误。
请帮助...
我认为,由于您在 viewDidLoad
中将 CBCentralManager
重新分配给 AppConstants.sharedInstance.centralManager
,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
}
不用担心。我找到了解决方法。感谢@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)
雅皮士...
:)
我有 3 个视图控制器。 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.
}
我不知道出了什么问题。我没有收到任何错误。 请帮助...
我认为,由于您在 viewDidLoad
中将 CBCentralManager
重新分配给 AppConstants.sharedInstance.centralManager
,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
}
不用担心。我找到了解决方法。感谢@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)
雅皮士... :)