首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核心蓝牙: CBPeripheral在不知情的情况下断开连接,没有接到任何didDisconnectPeripheral呼叫

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

Stack Overflow用户
提问于 2018-12-31 09:57:04
回答 2查看 916关注 0票数 0

我有3 ViewControllers。1)家庭VC 2)扫描VC 3)连接VC

步骤:从家庭VC,我推动扫描VC扫描可用的BLE设备。

扫描VC:我这里有所有的BLE通信代码:

代码语言:javascript
复制
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),在那里我正在检查蓝牙的所有状态。如果,

代码语言:javascript
复制
case .poweredOn:
            btnRefresh.isEnabled = true
            print("central.state is .poweredOn...")

            startScan()
        }

然后我扫描设备。

一旦我得到了我的设备,我就从扫描设备列表中连接到它,

然后我成功地连接到那个设备,它连接到连接VC.

在这里之前一切都很好。

但真正的问题是

1)我从连接VC中弹出扫描VC,然后再弹到HOMEVC

2)然后再从家庭VC推到扫描VC

扫描VC: --这将调用并分配代表给我的全局CentralManager,一旦它再次分配委托,它就断开了前面的连接。(即使我也没有接到任何didDisconnectPeripheral电话)

代码语言:javascript
复制
override func viewDidLoad() {
        super.viewDidLoad()

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

我不知道怎么回事。我不会犯任何错误。请帮帮我..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-31 10:56:45

别担心。我找到了解决办法。感谢@Natrajan给了我一些关于它的想法。

代码语言:javascript
复制
override func viewDidLoad() {
            super.viewDidLoad()


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

这符合我的目的,我可以检查蓝牙状态并相应地进行扫描(每次按下扫描VC)

尤皮耶..。:)

票数 0
EN

Stack Overflow用户

发布于 2018-12-31 10:24:27

我认为,既然您将CBCentralManager重新分配到AppConstants.sharedInstance.centralManager in viewDidLoadCBCentralManager就会被破坏并断开连接。

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

因此,您是否可以尝试像下面这样只初始化一次CBCentralManager,并在需要时断开连接?

示例:

代码语言:javascript
复制
override func viewDidLoad() {
        super.viewDidLoad()


        if AppConstants.sharedInstance.centralManager == nil{

            AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: nil, queue: nil)
        }

        AppConstants.sharedInstance.centralManager.delegate = self
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53986065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档