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

.NET MAUI Android 14中POST_NOTIFICATIONS权限相关疑问

.NET MAUI Android 通知权限疑问解答

我正在调试一个.NET MAUI Android应用(基于Android 14.0/API 34物理设备),已在AndroidManifest.xml中添加<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />,但应用启动时并未自动弹出通知权限请求。按照微软文档实现手动请求权限的代码如下:

protected override async void OnStart()
{
    await CheckAndRequestPushNotificationsPermission();
}

public static async Task<PermissionStatus> CheckAndRequestPushNotificationsPermission()
{
    PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.PostNotifications>();

    if (status == PermissionStatus.Granted)
        return status;

    if (status == PermissionStatus.Denied && DeviceInfo.Platform == DevicePlatform.iOS)
    {
        // Prompt the user to turn on in settings
        // On iOS once a permission has been denied it may not be requested again from the application
        return status;
    }

    if (Permissions.ShouldShowRationale<Permissions.PostNotifications>())
    {
        // Prompt the user with additional information as to why the permission is needed
    }

    status = await Permissions.RequestAsync<Permissions.PostNotifications>();

    return status;
}

针对这段代码和权限相关的疑问,解答如下:

1. 为何已在AndroidManifest.xml配置权限,仍需手动请求?

Android的权限分为多个等级,POST_NOTIFICATIONS是Android 13(API 33)及以上新增的危险权限。在Manifest中添加<uses-permission>仅仅是向系统声明应用需要使用该权限,并不会自动获得授权,也不会 "�**[请初始强者成功Ang//快速运,也不会触发系统的权限请求弹窗。对于危险权限,必须通过代码动态发起请求,让用户明确授权后才能使用相关功能,这是Android权限机制的强制要求。

2. 首次启动PermissionStatus为Denied,拒绝请求后不再弹出的原因?

  • Android 13+的通知权限,默认状态就是Denied,并非用户主动拒绝。
  • 当第一次发起权限请求并被用户拒绝后,系统会记录用户的选择。如果用户拒绝时没有勾选“允许再次询问”,后续调用RequestAsync将不会再弹出权限请求弹窗,权限状态会保持Denied。此时只能引导用户前往应用设置页面手动开启权限。
  • 你的代码中仅针对iOS的Denied状态做了处理,Android端遇到Denied时仍会尝试发起请求,但系统已经拦截了弹窗,所以状态不会改变。

3. 当前的权限请求实现是否正确?

整体逻辑方向是对的,但存在几个需要优化的点:

  • 避免在OnStart中使用async void:async void无法捕获异常,建议重写OnStart为异步方法(或者改用OnResume,因为OnStart仅在应用冷启动时触发,而OnResume在应用从后台返回时也会触发,更适合做权限检查),示例代码:
    protected override async Task OnStartAsync()
    {
        await base.OnStartAsync();
        await CheckAndRequestPushNotificationsPermission();
    }
    
  • 补充Android端Denied状态的处理:当Android端权限状态为Denied且ShouldShowRationale返回false时,说明用户已经拒绝过且不想再被询问,此时应该引导用户前往设置页面开启权限,而非继续调用RequestAsync。
  • 完善ShouldShowRationale的逻辑:当ShouldShowRationale返回true时,必须向用户解释权限的用途(比如“我们需要发送订单状态提醒”),提升用户授权意愿,否则直接发起请求容易被拒绝。

内容的提问来源于stack exchange,提问作者CrazyEight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:06:00