【问题标题】:Xamarin iOS 13 check bluetooth permission without triggering a native popupXamarin iOS 13 在不触发原生弹出窗口的情况下检查蓝牙权限
【发布时间】:2020-02-12 09:58:11
【问题描述】:

iOS 13 开始请求蓝牙权限。当尚未授予蓝牙权限时,我想显示一个自定义屏幕来解释为什么我需要蓝牙并建议让应用程序访问它。在此之前,我必须检查是否授予了蓝牙权限。

此功能立即显示原生弹出窗口并请求权限:

public bool NeedsBluetoothPermission()
        {
            if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
            {
                return CBCentralManager.Authorization != CBManagerAuthorization.AllowedAlways;
            }
            else
            {
                return false;
            }
        }

问题:如何在不触发原生弹窗的情况下检查应用是否需要请求蓝牙权限?

This answer 对我不起作用,因为我还没有创建任何 CBCentralManager 实例,我只使用它的静态属性。

原生 iOS 开发者也请加入。我想这不仅仅是 Xamarin 的问题......

【问题讨论】:

  • 您可以在info.plist 中的NSBluetoothAlwaysUsageDescription 键中写下您的解释。如果CBCentralManager.Authorization 是检查蓝牙权限的唯一方法,我认为您无法在使用前显示自定义屏幕。您还可以选择在用户安装完应用后显示自定义屏幕。

标签: xamarin bluetooth permissions ios13


【解决方案1】:

另一种方法是使用 CBCentralInitOptions,您可以在其中将“ShowPowerAlert”设置为 false。

当您创建 CBCentralManager 的实例时,传递 init 选项,它不会显示原生弹出窗口

【讨论】:

    【解决方案2】:

    最后,我想通了。 这种行为在 iOS 13.0 测试版中是真实存在的。

    对于最新的 iOS 13.2,我没有发现此问题。

    我可以默默地检查 CBCentralManager.Authorization 属性。 当我创建一个 CBCentralManager 的实例时,系统弹出窗口就会出现。

    【讨论】:

    • 不幸的是,这实际上不是一个测试版问题,而是一个实际的 iOS 13.0 错误,并且已在 iOS 13.1 中修复。希望由于 iOS 13.1 是在 13.0 后 7 天发布的,因此应该有极少数人使用 iOS 13.0。 Source.
    【解决方案3】:

    就我而言,CBCentralManager.Authorization 不存在。但是 CBPeripheralManager.authorization 是一个适用于 iOS 13+ 的静态类 var。 Apple's documentation

    - (void)checkBluetoothPermissionStatus:(CDVInvokedUrlCommand *)command
    {
        if (@available(iOS 13.1, *)) {
            switch(CBPeripheralManager.authorization) {
                case CBPeripheralManagerAuthorizationStatusAuthorized:
                    NSLog(@"CBP BLE allowedAlways");
                    [self requestBluetoothPermission: command]; // Further get the BLE on/off status once the permission is granted
                    break;
                case CBPeripheralManagerAuthorizationStatusDenied:
                    NSLog(@"CBP BLE denied");
                    [self sendMessage:@"Denied" error:true command:command];
                    break;
                case CBPeripheralManagerAuthorizationStatusNotDetermined:
                    NSLog(@"CBP BLE notDetermined");
                    [self sendMessage:@"Undetermined" error:true command:command];
                    break;
                case CBPeripheralManagerAuthorizationStatusRestricted:
                    NSLog(@"CBP BLE restricted");
                    [self sendMessage:@"Restricted" error:true command:command];
                    break;
            }
        } else {
            // Fallback on earlier versions
            NSLog(@"CBP BLE unknown");
            [self sendMessage:@"Unknown" error:true command:command];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2020-02-15
      相关资源
      最近更新 更多