如何检查我的应用程序 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
我需要检查我的 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中,权限
请使用此测试应用程序供您参考LINK