Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心蓝牙:CBPeripheral在不知情的情况下断开连接,并且没有接到didDisconnectPeripheral的任何呼叫_Ios_Swift_Core Bluetooth_Cbcentralmanager - Fatal编程技术网

Ios 核心蓝牙:CBPeripheral在不知情的情况下断开连接,并且没有接到didDisconnectPeripheral的任何呼叫

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) /

我有3个视图控制器。 1) 家庭风险投资 2) 扫描VC 3) 连接VC

步骤: 在家里的VC中,我点击Scan VC来扫描可用的设备

扫描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(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!)
            } 
}