为啥当我移动到新场景时蓝牙会断开连接?

Posted

技术标签:

【中文标题】为啥当我移动到新场景时蓝牙会断开连接?【英文标题】:Why does bluetooth disconnect when I move to a new scene?为什么当我移动到新场景时蓝牙会断开连接? 【发布时间】:2019-07-22 20:20:01 【问题描述】:

我正在开发一个尝试连接到 nrf52840 开发工具包的 ios 应用程序。当我在一个场景上连接它时它连接没问题,调试菜单告诉我它连接,当我移动到另一个场景时它断开连接。

我尝试将连接移动到代码的不同区域,但这并没有改变任何东西。


import UIKit
import CoreBluetooth


class ViewController: UIViewController, CBCentralManagerDelegate 


    private var centralManager : CBCentralManager!

    private var blePeripheral : CBPeripheral!

    private var uniqueID : Any!



   // manager = CBCentralManager(delegate: self, queue: nil)

    override func viewDidLoad() 
        super.viewDidLoad()
        print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
        // Do any additional setup after loading the view, typically from a nib.
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 10.0) 
            print("Connecting to peripheral \(self.peripheral)")
        
        if(centralManager != nil)
            if isConnectedtoAnything()
                print("not scanning")
                print(centralManager.debugDescription)
            else
                print("scanning")
            
        
    
    func centralManagerDidUpdateState(_ central: CBCentralManager) 
        if central.state == .poweredOn 
            print("Bluetooth is On")
            centralManager.scanForPeripherals(withServices: nil, options: nil)
         else 
            print("Bluetooth is not activate")
        
    

    @IBAction func StartSearch() 
        print("starting Search")
        centralManager = CBCentralManager(delegate: self, queue: nil, options: nil)
    

    @IBAction func StopConn() 
        if centralManager.isScanning 
            print("Do Nothing")
        else
            print("cancelling Connection")
            centralManager.cancelPeripheralConnection(blePeripheral)
        
    

    public func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) 
        print("\nName    : \(peripheral.name ?? "(No name)")")
        if peripheral.name == "Device_Name"
                print("Found the Device")

            blePeripheral=peripheral
            central.connect(blePeripheral, options: nil)
            central.stopScan()
            if !central.isScanning
                print("===============================")
                print("Connected Successfuly")
            
        

        print("RSSI     : \(RSSI)")
        for ad in advertisementData
            print("AD Data:     \(ad)")


        
    
    func isConnectedtoAnything() ->Bool
        if centralManager.isScanning 
            print("It is scanning ")
            return false
        
        else 
            return true
        
    



    func peripheral(peripheral: CBPeripheral,
                    didUpdateValueForCharacteristic characteristic: CBCharacteristic,
                    error: NSError?)
    
        if let error = error 
            print("Failed… error: \(error)")
            return
        
        print("characteristic uuid: \(characteristic.uuid), value: \(characteristic.value)")
    

    func centralManager(_ central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral,
                        advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!)
    
        print("Peripheral : \(peripheral)")

    

我只想让应用保持与开发工具包的连接

【问题讨论】:

您可能不想在视图控制器中使用蓝牙委托方法。你需要创建另一个对象来处理你所有的蓝牙东西;创建该对象的单个实例并在视图控制器之间传递它。 【参考方案1】:

我不确定这是否是问题所在。但在视图控制器中声明连接句柄及其委托并不是一个好习惯。当您移动到新的视图控制器时,可能不会调用委托,因为从该实例调用了 viewDidDisappear()。

宁愿创建一个单例类,它只在该类中维护所有必需的连接对象和委托。然后从视图控制器中获取一个实例来建立连接。如果你移动到一个新的视图控制器,再次从单例类中获取实例以发送或接收来自新视图控制器的数据。

我以相同的方式维护多个视图控制器之间的连接。

【讨论】:

以上是关于为啥当我移动到新场景时蓝牙会断开连接?的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙 LE 在暂停时断开连接

Android 应用程序会自动断开蓝牙连接

如何断开A2DP配置文件蓝牙连接?

蓝牙连接立即断开多点框架

怎样强制断开TCP连接

当应用程序转到另一个活动时,从手机到Bluno的蓝牙连接断开连接