Skip to content

Commit c75d7cf

Browse files
authored
[iOS] Support for bluetooth permission (#30729)
* [iOS] Support for bluetooth permission * Public API
1 parent 9deb355 commit c75d7cf

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

src/Essentials/src/Permissions/Permissions.ios.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Threading.Tasks;
55
using AddressBook;
66
using AVFoundation;
7+
using CoreBluetooth;
78
using MediaPlayer;
89
using Speech;
910

@@ -153,6 +154,49 @@ public override Task<PermissionStatus> RequestAsync()
153154
}
154155
}
155156

157+
public partial class Bluetooth : BasePlatformPermission
158+
{
159+
static CBCentralManager CentralManager;
160+
161+
static void EnsureCBManagerInitialized()
162+
{
163+
CentralManager ??= new CBCentralManager();
164+
}
165+
166+
protected override Func<IEnumerable<string>> RequiredInfoPlistKeys =>
167+
() => new string[] { "NSBluetoothAlwaysUsageDescription" };
168+
169+
public override Task<PermissionStatus> CheckStatusAsync()
170+
{
171+
EnsureDeclared();
172+
EnsureCBManagerInitialized();
173+
EnsureMainThread();
174+
175+
var status = CheckPermissionsStatus(CBManager.Authorization);
176+
return Task.FromResult(status);
177+
}
178+
179+
180+
static PermissionStatus CheckPermissionsStatus(CBManagerAuthorization authorization)
181+
{
182+
return authorization switch
183+
{
184+
CBManagerAuthorization.NotDetermined => PermissionStatus.Unknown,
185+
CBManagerAuthorization.Restricted => PermissionStatus.Restricted,
186+
CBManagerAuthorization.Denied => PermissionStatus.Denied,
187+
CBManagerAuthorization.AllowedAlways => PermissionStatus.Granted,
188+
_ => PermissionStatus.Unknown,
189+
};
190+
}
191+
192+
public override Task<PermissionStatus> RequestAsync()
193+
{
194+
// A request for Bluetooth permissions is prompted as soon as the CBManager is used.
195+
// Therefore, CheckStatus and RequestAsync have the same implementation.
196+
return CheckStatusAsync();
197+
}
198+
}
199+
156200
public partial class Media : BasePlatformPermission
157201
{
158202
/// <inheritdoc/>

src/Essentials/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ Microsoft.Maui.Media.SpeechOptions.Rate.get -> float?
1919
Microsoft.Maui.Media.SpeechOptions.Rate.set -> void
2020
*REMOVED*Microsoft.Maui.Storage.IFilePicker.PickMultipleAsync(Microsoft.Maui.Storage.PickOptions? options = null) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.Maui.Storage.FileResult!>!>!
2121
Microsoft.Maui.Storage.IFilePicker.PickMultipleAsync(Microsoft.Maui.Storage.PickOptions? options = null) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.Maui.Storage.FileResult?>!>!
22+
~override Microsoft.Maui.ApplicationModel.Permissions.Bluetooth.CheckStatusAsync() -> System.Threading.Tasks.Task<Microsoft.Maui.ApplicationModel.PermissionStatus>
23+
~override Microsoft.Maui.ApplicationModel.Permissions.Bluetooth.RequestAsync() -> System.Threading.Tasks.Task<Microsoft.Maui.ApplicationModel.PermissionStatus>
24+
~override Microsoft.Maui.ApplicationModel.Permissions.Bluetooth.RequiredInfoPlistKeys.get -> System.Func<System.Collections.Generic.IEnumerable<string>>
2225
static Microsoft.Maui.Authentication.WebAuthenticator.AuthenticateAsync(Microsoft.Maui.Authentication.WebAuthenticatorOptions! webAuthenticatorOptions, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.Maui.Authentication.WebAuthenticatorResult!>!
2326
static Microsoft.Maui.Authentication.WebAuthenticator.AuthenticateAsync(System.Uri! url, System.Uri! callbackUrl, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.Maui.Authentication.WebAuthenticatorResult!>!
2427
static Microsoft.Maui.Authentication.WebAuthenticatorExtensions.AuthenticateAsync(this Microsoft.Maui.Authentication.IWebAuthenticator! webAuthenticator, System.Uri! url, System.Uri! callbackUrl, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.Maui.Authentication.WebAuthenticatorResult!>!

src/Essentials/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ Microsoft.Maui.Media.SpeechOptions.Rate.get -> float?
1919
Microsoft.Maui.Media.SpeechOptions.Rate.set -> void
2020
*REMOVED*Microsoft.Maui.Storage.IFilePicker.PickMultipleAsync(Microsoft.Maui.Storage.PickOptions? options = null) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.Maui.Storage.FileResult!>!>!
2121
Microsoft.Maui.Storage.IFilePicker.PickMultipleAsync(Microsoft.Maui.Storage.PickOptions? options = null) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.Maui.Storage.FileResult?>!>!
22+
~override Microsoft.Maui.ApplicationModel.Permissions.Bluetooth.CheckStatusAsync() -> System.Threading.Tasks.Task<Microsoft.Maui.ApplicationModel.PermissionStatus>
23+
~override Microsoft.Maui.ApplicationModel.Permissions.Bluetooth.RequestAsync() -> System.Threading.Tasks.Task<Microsoft.Maui.ApplicationModel.PermissionStatus>
24+
~override Microsoft.Maui.ApplicationModel.Permissions.Bluetooth.RequiredInfoPlistKeys.get -> System.Func<System.Collections.Generic.IEnumerable<string>>
2225
static Microsoft.Maui.Authentication.WebAuthenticator.AuthenticateAsync(Microsoft.Maui.Authentication.WebAuthenticatorOptions! webAuthenticatorOptions, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.Maui.Authentication.WebAuthenticatorResult!>!
2326
static Microsoft.Maui.Authentication.WebAuthenticator.AuthenticateAsync(System.Uri! url, System.Uri! callbackUrl, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.Maui.Authentication.WebAuthenticatorResult!>!
2427
static Microsoft.Maui.Authentication.WebAuthenticatorExtensions.AuthenticateAsync(this Microsoft.Maui.Authentication.IWebAuthenticator! webAuthenticator, System.Uri! url, System.Uri! callbackUrl, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.Maui.Authentication.WebAuthenticatorResult!>!

0 commit comments

Comments
 (0)