代码之家  ›  专栏  ›  技术社区  ›  iHarshil l0gg3r

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

  •  0
  • iHarshil l0gg3r  · 技术社区  · 6 年前

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

    步骤: 从home 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 然后再次跳到 霍姆维克

    2)然后我再次从 家庭VC 扫描VC

    扫描VC: 这将调用该代理并将其分配给我的全局中心管理器,一旦它再次分配该代理,它将断开以前的连接。(连我都没有 Did断开外围设备 呼叫)

    override func viewDidLoad() {
            super.viewDidLoad()
    
                AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil) // Here when I come again it disconnects old connection.
        }
    

    我不知道是什么问题。我没有发现任何错误。 请帮助…

    2 回复  |  直到 6 年前
        1
  •  1
  •   Natarajan    6 年前

    我想,既然你要重新分配 CBCentralManager AppConstants.sharedInstance.centralManager 在里面 viewDidLoad , 中央经理 正在被破坏并断开连接。

    同样,当它被销毁时,它不会返回任何委托回调。

    所以你能试着初始化 中央经理 只有一次,如下图所示,需要时断开?

    例子:

    override func viewDidLoad() {
            super.viewDidLoad()
    
    
            if AppConstants.sharedInstance.centralManager == nil{
    
                AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: nil, queue: nil)
            }
    
            AppConstants.sharedInstance.centralManager.delegate = self
        }
    
        2
  •  0
  •   iHarshil l0gg3r    6 年前

    别担心。我找到了解决问题的方法。感谢@natrajan给了我一些想法。

    override func viewDidLoad() {
                super.viewDidLoad()
    
    
                if AppConstants.sharedInstance.centralManager == nil{
                    AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil)
                }
                else
                {
                    centralManagerDidUpdateState(AppConstants.sharedInstance.centralManager!)
                } 
    }
    

    这符合我的目的,我可以检查蓝牙状态并相应地进行扫描(每次推到scan vc)

    YuPayee… :)

    推荐文章