如何检查我的应用程序 ios 在 Xamarin.ios 中是否具有蓝牙权限?

How do I check is my app ios has Bluetooth permission in Xamarin.ios?

我需要检查我的 Xamarin.Forms 应用程序是否具有 蓝牙权限 ,如果没有,我想请求它。我已经能够将其实现为 Android 的依赖服务,但我不知道如何为 iOS 实现它。我看到一些文章提到了 ios 13 与更早版本之间的一些差异,但它们并不是很清楚。

我尝试使用以下代码在 iPhone 6s 运行 ios 12.2 上进行检查和测试:

var manager = new CBCentralManager();
return (CBCentralManager.Authorization) == CBManagerAuthorization.AllowedAlways;

但它抛出 MonoTouchException。如何检查权限以及如何请求权限?以及如何处理 ios 不同版本的需求? (早在 ios 11 年)。

Apple introduced bluetooth 来自 iOS 13.

的许可

因此,您不需要为 iOS 12 岁及以下儿童请求或检查蓝牙权限。

要启用蓝牙,必须在 plist 文件中添加两个密钥。隐私 - 蓝牙外围设备使用说明和隐私 - 蓝牙始终使用说明。描述您为什么要在您的应用中使用蓝牙。

Xamarin.Forms 共享 PCL 代码

依赖服务接口

public interface IPermissionService
{
    bool HasBluetoothPermission();
    void RequestBluetoothPermission(Action bluetoothAction);
}

UI 用于检查状态和请求蓝牙权限的页面

<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="StackQA2XF.BluetoothPermissionPage">
    <ContentPage.Content>
        <StackLayout Orientation="Vertical" Spacing="50" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
            <StackLayout Orientation="Horizontal" HeightRequest="60" >
                <Button Text="Has Bluetooth Permission" Clicked="HasBluetooth_Clicked" />
                <Label x:Name="LabelHasPermission" VerticalOptions="Center" FontSize="Micro" Margin="10,0,0,0" TextColor="OrangeRed" Text="No" />
            </StackLayout>
            <Button Text="Request Bluetooth Permission" Clicked="RequestBluetooth_Clicked"/>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>
public partial class BluetoothPermissionPage : ContentPage
{
    readonly IPermissionService service;

    public BluetoothPermissionPage()
    {
        InitializeComponent();
        service = DependencyService.Get<IPermissionService>();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        CheckBluetooothPermission();
    }

    void HasBluetooth_Clicked(System.Object sender, System.EventArgs e)
    {
        CheckBluetooothPermission();
    }

    private void CheckBluetooothPermission()
    {
        LabelHasPermission.Text = service.HasBluetoothPermission() ? "YES" : "NO";
    }

    void RequestBluetooth_Clicked(System.Object sender, System.EventArgs e)
    {
        service.RequestBluetoothPermission(() =>
        {
            CheckBluetooothPermission();
        });
    }
}

iOS平台端(原生代码)

依赖服务实现。

[assembly: Dependency(typeof(StackQA2XF.iOS.Service.PermissionService))]
namespace StackQA2XF.iOS.Service
{
    public class PermissionService : IPermissionService
    {
        Action? _bluetoothAction = null; //Optional, if you wanted to notify user that you have performed action (allow or deny) on the permission request dialog

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

        public void RequestBluetoothPermission(Action bluetoothAction)
        {
            _bluetoothAction = bluetoothAction;
            var myDelegate = new PermissionCBCentralManager(this);
            var centralManger = new CBCentralManager(myDelegate, DispatchQueue.MainQueue, new CBCentralInitOptions() { ShowPowerAlert = false });
        }

        internal void CurrentUpdatedState(CBCentralManager central)
        {
            _bluetoothAction?.Invoke();
        }
    }

    public class PermissionCBCentralManager : CBCentralManagerDelegate
    {
        PermissionService permissionService = null;

        public PermissionCBCentralManager(PermissionService controller)
        {
            permissionService = controller;
        }

        public override void UpdatedState(CBCentralManager central)
        {
            permissionService.CurrentUpdatedState(central);
        }
    }
}

Info.plist

For backward support for older iOS versions, NSBluetoothPeripheralUsageDescription needs to be defined in info.plist

注意:如果CBCentralManager.ShowPowerAlert is true,当用户的蓝牙设置为OFF时,将导致在设备的蓝牙设置中显示ON的系统对话框。 IE。 CBCentralManager.ShowPowerAlert is true 如果您的 iPhone.iPhone.

中的蓝牙权限已关闭或您的应用和蓝牙功能已关闭,CBCentralManager.ShowPowerAlert is true 将出现两个对话框

ShowPowerAlert is false时,此系统对话框将不会显示。

不要使用模拟器检查此实现。

权限请求对话框将出现在 iOS 13 及更高版本中。

在iOS中,权限。因此,只有在第一次安装后,您才能在点击“Request Bluetooth Permission”时看到蓝牙权限请求对话框。一旦您拒绝,稍后第二次单击“请求蓝牙权限”按钮时,将不会显示权限请求对话框。您可以通过显示带有按钮的自定义对话框来处理这些场景,以导航到应用程序的设置。

请使用此测试应用程序供您参考LINK