我在Swift中断开BLE外设有一些问题。首先,我尝试仅使用cancelPeripheralConnection:
函数。但是,如果我只调用此函数,则永远不会调用didDisconnectPeripheral
函数。所以我尝试按照Apple's参考指南进行操作。有人说,你应该在断开连接之前删除每个通知。这真的有必要吗?是否有可能一步取消所有通知?我设置了很多通知,因此我必须搜索许多服务和特征才能重置它们。我想,这不是一个“做得好”的解决方案。
修改
好吧,我发现cancelPeripheralConnection
效果非常好,如果我在我的BluetoothManager
课程中调用它,其中包含CBCentralManager
和CBPeripheralDelegate
...有没有办法断开与此功能之外的外围设备?
编辑4:
import UIKit
class ValueCollectionView: UICollectionViewController
{
var valueCollectionViewCell: ValueCollectionViewCell = ValueCollectionViewCell()
var bluetoothManager: BluetoothManager = BluetoothManager()
override func viewDidLoad()
{
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "back:")
self.navigationItem.leftBarButtonItem = newBackButton;
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
}
func back(sender: UIBarButtonItem)
{
bluetoothManager.disconnectPeripheral(selectedPeripheralIndex!)
self.navigationController?.popViewControllerAnimated(true)
}
//Some Collection View functions...
}
这是我disconnectPeripheral
功能的实现(集成在BluetoothManager类中):
func disconnectPeripheral(peripheralIndex: Int)
{
CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral)
}
但无论如何,如果我调用此函数,则不会调用didDisconnectPeripheral
函数。当我将该功能放入BluetoothManager类时,例如在我发现最后一个特征后,一切正常。
编辑5:
class BluetoothManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate
{
var CBmanager: CBCentralManager = CBCentralManager()
override init()
{
super.init()
self.CBmanager = CBCentralManager(delegate: self, queue: nil)
}
func connectPeripheral(peripheralIndex: Int)
{
CBmanager.connectPeripheral(peripheralArray![peripheralIndex].peripheral, options: nil)
}
func disconnectPeripheral(peripheralIndex: Int)
{
CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral)
}
//The other CentralManager functions...
}
答案 0 :(得分:6)
对于您的第一个疑问,是的,我们应该在从Apple Documentation中给出的原因断开与外围设备的连接之前取消注册已订阅的特征:
注意:
cancelPeripheralConnection:
方法是非阻止的,任何方法CBPeripheral
类命令仍在等待外围设备 你试图断开可能会或可能不会完成执行。因为 其他应用程序可能仍然连接到外围设备,取消了 本地连接不保证底层物理链路 立即断开连接。但是,从你的应用程序的角度来看, 外围设备被认为是断开连接,以及中央管理器对象 调用它的centralManager:didDisconnectPeripheral:error:
方法 委托对象。
现在,回答你的另一个问题 -
有没有办法断开此功能以外的外围设备?
您需要将其与实例化的实例断开连接并开始连接。只要你可以在同一个对象上调用取消它就可以工作。
myCentralManager.cancelPeripheralConnection(peripheral)
在我的应用程序中,我不得不使用来自许多不同类的BLE功能,这使我编写了一个单例MyBLEManager
,并且所有类都来到了这个单例中,用于所有与BLE相关的活动。这笔交易非常有用,只能帮助排除一个课程。你可以尝试一下。