Ios 核心蓝牙:CBPeripheral在不知情的情况下断开连接,并且没有接到didDisconnectPeripheral的任何呼叫
我有3个视图控制器。 1) 家庭风险投资 2) 扫描VC 3) 连接VC 步骤: 在家里的VC中,我点击Scan VC来扫描可用的设备 扫描VC:我这里有所有BLE通信代码:Ios 核心蓝牙:CBPeripheral在不知情的情况下断开连接,并且没有接到didDisconnectPeripheral的任何呼叫,ios,swift,core-bluetooth,cbcentralmanager,Ios,Swift,Core Bluetooth,Cbcentralmanager,我有3个视图控制器。 1) 家庭风险投资 2) 扫描VC 3) 连接VC 步骤: 在家里的VC中,我点击Scan VC来扫描可用的设备 扫描VC:我这里有所有BLE通信代码: override func viewDidLoad() { super.viewDidLoad() AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil) /
override func viewDidLoad() {
super.viewDidLoad()
AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil) // created global Instance for central Manager and assigned it here
}
上面将调用centralManagerDidUpdateState(ucentral:CBCentralManager)
检查蓝牙的所有状态。如果
case .poweredOn:
btnRefresh.isEnabled = true
print("central.state is .poweredOn...")
startScan()
}
然后我扫描设备
一旦我拿到我的设备,我就从扫描设备列表连接到它
然后我成功连接到该设备,它将转到连接VC。
直到这里一切都很好
但真正的问题始于何时
1) 我从连接VC以扫描VC,然后再次弹出到HOMEVC,然后
2) 然后我再次从主VC推送到扫描VC
扫描VC:这将调用代理并将其分配给我的全局中心管理器,一旦再次分配代理,它将断开以前的连接。(即使我没有接到任何断开外围设备连接的电话)
我不知道是什么问题。我没有得到任何错误。
请帮助…我想,由于您正在将
CBCentralManager
重新分配给AppConstants.sharedInstance.centralManager
中的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
}
不用担心。我找到了解决办法。感谢@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)
雅皮士。。。
:)是的,我试过了,但它只是第一次检查蓝牙状态。当我回到这个屏幕时,它不再调用这个CentralManagerDipDateState(uCentral:CBCentralManager)方法。每次扫描VC时,我都要检查并扫描BLE。是的,它不会再次调用委托方法,除非
CBCentralManager
的状态发生任何更改。但是您可以使用viewDidLoad
中的AppConstants.sharedInstance.centralManager.state
获取CBCentralManager
的当前状态。感谢您的帮助。我很感激。
override func viewDidLoad() {
super.viewDidLoad()
if AppConstants.sharedInstance.centralManager == nil{
AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil)
}
else
{
centralManagerDidUpdateState(AppConstants.sharedInstance.centralManager!)
}
}