当我尝试访问已恢复的CoreBluetooth外围设备时,Xamarin iOS应用程序崩溃

时间:2017-11-15 22:34:50

标签: ios xamarin.ios xamarin.forms core-bluetooth

我有一个Xamarin跨平台应用,它使用iOS端的bluetooth-central后台模式来保持与蓝牙到串口加密狗的连接。一切都运作良好,除了我正在尝试实施CBCentralManagerDelegate.WillRestoreState方法(请参阅iOS Doc,以及无用的Xamarin Doc以获取详细信息)。

从iOS文档中,我可以看到第二个参数的元素包含CBCentralManager.RestoredStatePeripheralsKey中已恢复的外围设备,并且该元素是NSArray的{​​{1}}个。所以,我在我的课程中编写了这个方法来覆盖CBPeripheral

CBCentralManagerDelegate

问题在于:// Handle state restoration if OS restores CoreBluetooth peripherals public override void WillRestoreState(CBCentralManager central, NSDictionary state) { NSObject restoredPeripherals = new NSObject(); if (state.TryGetValue(CBCentralManager.RestoredStatePeripheralsKey, out restoredPeripherals)) { Logger.Debug("Restoring CoreBluetooth Peripherals..."); NSArray<CBPeripheral> peripherals = restoredPeripherals as NSArray<CBPeripheral>; foreach (CBPeripheral peripheral in peripherals) { Logger.Debug("Loading preexisting peripherals"); discoveredPeripherals.Add(peripheral.Name, peripheral); } } base.WillRestoreState(central, state); }

此行导致崩溃。在非常罕见的情况下,我能够在调试器中捕获它(在重现这个时很难保持调试器的连接),它说这个行是一个无效的演员。

以下是我从iPad获取的日志:

NSArray<CBPeripheral> peripherals = restoredPeripherals as NSArray<CBPeripheral>;

有没有人知道为什么会崩溃?此外,如果有人使用Xamarin实现此方法的示例,请分享链接。我找不到任何东西。 :(

1 个答案:

答案 0 :(得分:1)

我想应该转换为NSArray而不是NSArray<CBPeripheral>

尝试以下方法:

NSArray peripherals = (NSArray) restoredPeripherals;
for (nuint i = 0; i < peripherals.Count; i++)
{
    CBPeripheral peripheral = peripherals.GetItem<CBPeripheral>(i);

    Logger.Debug("Loading preexisting peripherals");
    discoveredPeripherals.Add(peripheral.Name, peripheral);
}