我有一个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实现此方法的示例,请分享链接。我找不到任何东西。 :(
答案 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);
}