Xamarin:通知权限的设置与读取实现方案
Xamarin跨平台本地通知权限处理方案
一、跨平台抽象定义
先在共享项目里定义统一的权限服务接口和状态枚举,方便跨平台调用:
public interface INotificationPermissionService { // 请求通知权限 Task<bool> RequestPermissionAsync(); // 检查当前权限状态 Task<NotificationPermissionStatus> GetPermissionStatusAsync(); } // 权限状态枚举 public enum NotificationPermissionStatus { Granted, Denied, NotDetermined, Provisional // iOS专属临时权限 }
二、Android平台实现
1. 配置权限
在Android项目的AndroidManifest.xml中添加对应权限(Android 13及以上必须):
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
2. 服务实现类
[assembly: Dependency(typeof(NotificationPermissionService))] namespace YourApp.Droid { public class NotificationPermissionService : INotificationPermissionService { public async Task<NotificationPermissionStatus> GetPermissionStatusAsync() { if (Build.VERSION.SdkInt < BuildVersionCodes.Tiramisu) { // Android 12及以下默认授予通知权限 return NotificationPermissionStatus.Granted; } var status = await Permissions.CheckStatusAsync<Permissions.PostNotifications>(); return status switch { PermissionStatus.Granted => NotificationPermissionStatus.Granted, PermissionStatus.Denied => NotificationPermissionStatus.Denied, _ => NotificationPermissionStatus.NotDetermined }; } public async Task<bool> RequestPermissionAsync() { if (Build.VERSION.SdkInt < BuildVersionCodes.Tiramisu) { return true; } var status = await Permissions.RequestAsync<Permissions.PostNotifications>(); return status == PermissionStatus.Granted; } } }
三、iOS平台实现
1. 配置权限描述
在iOS项目的Info.plist中添加权限申请说明:
<key>NSUserNotificationUsageDescription</key> <string>需要通知权限来接收本地提醒</string> <key>NSAlertUsageDescription</key> <string>需要通知权限来显示提醒内容</string>
2. 服务实现类
[assembly: Dependency(typeof(NotificationPermissionService))] namespace YourApp.iOS { public class NotificationPermissionService : INotificationPermissionService { public Task<NotificationPermissionStatus> GetPermissionStatusAsync() { var settings = UNUserNotificationCenter.Current.GetNotificationSettingsAsync().Result; return Task.FromResult(settings.AuthorizationStatus switch { UNAuthorizationStatus.Authorized => NotificationPermissionStatus.Granted, UNAuthorizationStatus.Denied => NotificationPermissionStatus.Denied, UNAuthorizationStatus.NotDetermined => NotificationPermissionStatus.NotDetermined, UNAuthorizationStatus.Provisional => NotificationPermissionStatus.Provisional, _ => NotificationPermissionStatus.NotDetermined }); } public async Task<bool> RequestPermissionAsync() { var center = UNUserNotificationCenter.Current; var options = UNAuthorizationOptions.Alert | UNAuthorizationOptions.Sound | UNAuthorizationOptions.Badge; var (granted, _) = await center.RequestAuthorizationAsync(options); return granted; } } }
四、共享项目中调用
在业务代码里通过依赖服务获取实例,完成权限检查和请求:
var permissionService = DependencyService.Get<INotificationPermissionService>(); var currentStatus = await permissionService.GetPermissionStatusAsync(); if (currentStatus != NotificationPermissionStatus.Granted) { var isGranted = await permissionService.RequestPermissionAsync(); if (!isGranted) { // 权限被拒绝,可提示用户前往系统设置开启 } }
内容的提问来源于stack exchange,提问作者Mark Wardell
相关产品推荐
相关产品推荐

