You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:15:35