【问题标题】:How to handle user interaction with new Bluetooth prompt in iOS13?iOS13中如何处理用户与新蓝牙提示的交互?
【发布时间】:2020-03-27 10:24:33
【问题描述】:

“Info.plist 文件有一个新键:NSBluetoothAlwaysUsageDescription,您可以使用它来解释您的应用如何以及为什么使用蓝牙。与现有的 NSBluetoothPeripheralUsageDescription,新的描述将作为新弹出窗口的一部分显示,并且还会显示在蓝牙隐私屏幕上的设置应用程序中。”

更新到 iOS 13 后,我们的应用遇到了崩溃,我相信很多人都遇到过。我们的问题是由于未在 Xamarin.iOS 项目 Info.plist 文件中包含新需要的蓝牙密钥。

但是,在加载第一个“动作”时添加此内容后,会向用户显示新的蓝牙访问提示。

我们并不清楚如何捕获对此提示的响应。事实上,在此提示与应用程序交互之后,它没有“返回”点。无法完全找到提示交互/结果处理的断点,我们的应用程序永远不会从提示返回。它正在运行,但下一个“动作”永远不会发生。

那么,如何捕捉/处理用户与 iOS 13 中新的蓝牙提示的交互?

注意*:绝对透明 - 我们的应用程序不会初始化 CBCentralManager 的任何实例,而是利用本身在内部使用蓝牙 LE 的本机框架(我们无法控制)。

【问题讨论】:

    标签: xamarin.forms bluetooth xamarin.ios


    【解决方案1】:

    我们的案例可能非常独特,但对于那些体验这种情况的人来说,实现 CBCentralManager 并利用其 UpdatedState 方法来捕捉用户与新呈现的蓝牙对话的交互。

    在我们的 Apps MainPage 的页面创建中调用的初始化

    BleManager = new BluetoothManager();
    

    using System;
    using CoreBluetooth;
    
    namespace MyApp.iOS.Classes
    {
        public class BluetoothManager
        {
            public CBCentralManager CentralBleManager
            {
                get { return this.bleCntrlMgr; }
            }
            protected CBCentralManager bleCntrlMgr;
            protected CBCentralManagerDelegate bleMgrDel;
    
            public BluetoothManager()
            {
                this.bleCntrlMgr = new CoreBluetooth.CBCentralManager();
                this.bleCntrlMgr.UpdatedState += BleMgr_UpdatedState;
            }
    
            private void BleMgr_UpdatedState(object sender, EventArgs e)
            {
                Console.WriteLine("UpdatedState: {0}", bleCntrlMgr.State);
                if (bleCntrlMgr.State == CBCentralManagerState.PoweredOn
                    || bleCntrlMgr.State == CBCentralManagerState.PoweredOff
                    || bleCntrlMgr.State == CBCentralManagerState.Resetting
                    || bleCntrlMgr.State == CBCentralManagerState.Unauthorized
                    || bleCntrlMgr.State == CBCentralManagerState.Unsupported)
                {
                    /* return point */
                    // i.e.: CallMethod();
                }
                else if (bleCntrlMgr.State == CBCentralManagerState.Unknown)
                {
                    /* <-- request access --> */
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多