我们需要我们的应用程序在连接或断开蓝牙音频设备(特别是他们的汽车中的设备)时从操作系统接收通知。
当BT设备最初连接时,应用会收到通知,但它会立即断开并记录错误:
BTCentralManager :: DisconnectedPeripheral> SoundCore mini(ATT) ERROR错误域= CBErrorDomain代码= 7 “指定的设备已与我们断开连接。”
...并且“DisconnectedPeripheral”事件从未实际触发过。
我们不确定如何在应用程序背景化时简单地接收连接和断开事件。
我们是否需要将外围设备与中央管理器连接?我们只需知道音频设备是否已连接 - 我们无需以任何方式与其进行交互。
在获得断开连接外围设备后,事件永远不会从后台调用第二次。大概是因为我们收到的错误信息。
以下示例代码:
public class BTCentralManager : CBCentralManagerDelegate
{
public CBCentralManager centralManager;
public static CBPeripheral peripheral;
public BTCentralManager()
{
System.Diagnostics.Debug.WriteLine("BTCentralManager::Constructor > ");
centralManager = new CBCentralManager(this, new DispatchQueue("myqueue"),
new CBCentralInitOptions { ShowPowerAlert = true, RestoreIdentifier = "myRestoreIdentifier" });
NSUuid[] arr = { new NSUuid("7e9002be-547f-42bc-8d56-209736f70aa2") }; //Sound core mini
var devices = centralmanager.retrieveperipheralswithidentifiers(arr);
peripheral = devices.firstordefault();
//is the only way to trigger the events, we need to first connect the peripheral to central manager???
centralManager.connectPeripheral(peripheral, new PeripheralConnectionOptions
{
NotifyOnConnection = true,
NotifyOnDisconnection = true,
NotifyOnNotification = true
});
}
//Always is triggered inclusive in background
public override void UpdatedState(CBCentralManager central)
{
System.Diagnostics.Debug.WriteLine("BTCentralManager::UpdatedState > " + central.State.ToString());
}
//Only is triggered when the device is first time connected ( Inclusive in background)
public override void ConnectedPeripheral(CBCentralManager central, CBPeripheral peripheral)
{
System.Diagnostics.Debug.WriteLine("BTCentralManager::ConnectedPeripheral > " + peripheral.Name);
//After the connect made successfully I receive this error, and never connect again to the device
//Error Domain=CBErrorDomain Code=7 "The specified device has disconnected from us."
}
public override void DisconnectedPeripheral(CBCentralManager central, CBPeripheral peripheral, NSError error)
{
System.Diagnostics.Debug.WriteLine("BTCentralManager::DisconnectedPeripheral > " + peripheral.Name + " ERROR>" + error.Description);
}
public override void DiscoveredPeripheral(CBCentralManager central, CBPeripheral peripheral, NSDictionary advertisementData, NSNumber RSSI)
{
System.Diagnostics.Debug.WriteLine("BTCentralManager::DiscoveredPeripheral > " + peripheral.Name);
// base.DiscoveredPeripheral(central, peripheral, advertisementData, RSSI);
}
}
答案 0 :(得分:0)
据我了解您的问题,您需要观察蓝牙音频设备的可用性。几年前我对此进行了一些调查,结果并不令我满意。这是我的结论:
1。)CoreBluetooth仅用于蓝牙4.0 /蓝牙低功耗设备。许多蓝牙耳机甚至汽车收音机仍然没有蓝牙4.x.因此,除非您可以依赖用户的蓝牙音频设备为4.x,否则CoreBluetooth可能会浪费时间。
2。)当您的应用处于后台时,您的应用不会收到有关正在连接的音频设备的通知。
到目前为止还不好。但是,可能有一些方法可能有所帮助。1。)通过使用CLLocationManager,您可以开始观察例如指南针(不是节省电池的位置),以便在手机移动时收到通知。当应用程序调用CLLocationManagerDelegate时,只需检查连接的音频设备。这当然不是很有效,但它可能会有效。
2.)使用iBeacons和CLBeaconRegions(如果可用)。将iBeacon放在用户的车内并开始观察信标。
我知道,这不是你想听到的,但我担心你的问题没有直接的解决方案。
欢呼声, 彼得