【问题标题】:Xamarin iOS app crashes when I try to access restored CoreBluetooth peripherals当我尝试访问恢复的 CoreBluetooth 外围设备时,Xamarin iOS 应用程序崩溃
【发布时间】:2018-04-29 07:59:03
【问题描述】:

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

从 iOS 文档中,我可以看到第二个参数在 CBCentralManager.RestoredStatePeripheralsKey 中有一个包含已恢复外围设备的元素,并且该元素是 CBPeripherals 中的 NSArray。所以,我在我的类中编写了这个方法来覆盖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);
}

问题在于:NSArray&lt;CBPeripheral&gt; peripherals = restoredPeripherals as NSArray&lt;CBPeripheral&gt;;

此行会导致崩溃。在极其罕见的情况下,我能够在调试器中捕捉到这一点(在重现这一点时很难保持调试器的连接),它说明了这一行是无效的转换。

这是我从 iPad 获得的日志:

Nov 15 14:22:58 iPad-Mini Warning 520 MyApp    [Debug]   Restoring CoreBluetooth Peripherals... (
Nov 15 14:22:58 iPad-Mini Warning 520 MyApp    
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   15  MyApp                    0x00083733 -[Messenger_iOS_TruConnectBLEFactory_ManagerDelegate centralManager:willRestoreState:] + 60
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   21  libdispatch.dylib                   0x20df3b93 <redacted> + 182
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   13  libmonosgen-2.0.dylib               0x08d4ff6b mono_runtime_invoke + 138
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   4   libxamarin-debug.dylib              0x08fa2360 xamarin_printf + 0
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   24  libsystem_pthread.dylib             0x20fadb29 _pthread_wqthread + 1024
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   1   libsystem_platform.dylib            0x20faa077 _sigtramp + 42
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   2   libsystem_pthread.dylib             0x20fb0733 pthread_kill + 62
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   19  libdispatch.dylib                   0x20df6423 <redacted> + 1758
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   8   libmonosgen-2.0.dylib               0x08cde29f handle_signal_exception + 42
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   12  libmonosgen-2.0.dylib               0x08d4ffd5 do_runtime_invoke + 78
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   14  MyApp                    0x0008393b _ZL31native_to_managed_trampoline_55P11objc_objectP13objc_selectorPP11_MonoMethodP16CBCentralManagerP12NSDictionaryj + 516
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   16  CoreBluetooth                       0x2637abe3 <redacted> + 2486
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   22  libdispatch.dylib                   0x20df85e9 <redacted> + 1560
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   9   ???                                 0x00000000 0x0 + 0
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   6   libmonosgen-2.0.dylib               0x08ce6235 mono_handle_exception_internal + 3162
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   11  libmonosgen-2.0.dylib               0x08cf10f5 mono_jit_runtime_invoke + 712
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    Unhandled managed exception:
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   25  libsystem_pthread.dylib             0x20fad718 start_wqthread + 8
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   7   libmonosgen-2.0.dylib               0x08ce55d7 mono_handle_exception + 30
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   5   libmonosgen-2.0.dylib               0x08d1d7cd mono_invoke_unhandled_exception_hook + 100
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   18  libdispatch.dylib                   0x20de9823 <redacted> + 10
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   3   libsystem_c.dylib                   0x20e9b0ad abort + 108
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   17  CoreBluetooth                       0x263869f3 <redacted> + 62
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   10  libmscorlib.dll.dylib               0x00d49520 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 256
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   0   libmonosgen-2.0.dylib               0x08ce6637 mono_handle_native_crash + 196
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical: Stacktrace:
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   23  libdispatch.dylib                   0x20df7fcd <redacted> + 96
Nov 15 14:22:59 iPad-Mini Warning 520 MyApp    critical:   20  libdispatch.dylib                   0x20df5a61 <redacted> + 284

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

【问题讨论】:

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


    【解决方案1】:

    我想应该是转换成NSArray而不是NSArray&lt;CBPeripheral&gt;

    尝试以下方法:

    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);
    }
    

    【讨论】:

    • 我看到你编辑了答案,你解决问题了吗?
    • 我更改了代码,因为原始代码没有编译,是的,确实如此,尽管我还需要删除对 base.WillRestoreState(central, state); 的调用,因为 iOS 也不喜欢这样。 :)
    猜你喜欢
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2017-05-22
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多