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

Flutter本地推送通知权限申请:设置关闭时如何获取用户授权?

Flutter本地推送通知权限申请(关闭状态下的处理)

在Flutter中处理通知权限关闭的情况,核心是先检查权限状态,再根据状态执行请求或引导用户打开系统设置。以下是具体实现步骤:

1. 添加依赖

在pubspec.yaml中引入两个核心依赖:

dependencies:
  flutter_local_notifications: ^16.1.0 # 本地推送核心包
  permission_handler: ^11.0.1 # 权限管理包

执行flutter pub get完成依赖安装。

2. 检查并请求通知权限

核心逻辑

  • 先获取当前通知权限状态
  • 若权限未授予,分两种情况处理:
    • 权限处于"未决定"状态:直接弹出系统权限请求弹窗
    • 权限已被拒绝(包括永久拒绝):引导用户跳转到应用设置页面手动开启

代码实现

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin();
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); // 全局导航键,用于弹窗跳转

// 初始化推送插件和权限检查
Future<void> initNotifications() async {
  // 初始化Android和iOS推送配置
  const AndroidInitializationSettings androidInit = AndroidInitializationSettings('@mipmap/ic_launcher');
  const DarwinInitializationSettings iosInit = DarwinInitializationSettings(
    requestAlertPermission: false, // 统一用permission_handler处理权限请求
    requestBadgePermission: false,
    requestSoundPermission: false,
  );
  const InitializationSettings initSettings = InitializationSettings(android: androidInit, iOS: iosInit);
  await _notificationsPlugin.initialize(initSettings);

  // 启动时检查权限
  await checkNotificationPermission();
}

// 检查并处理通知权限
Future<void> checkNotificationPermission() async {
  final PermissionStatus status = await Permission.notification.status;

  if (status.isGranted) {
    // 权限已授予,正常处理推送逻辑
    print("通知权限已授予");
  } else if (status.isDenied) {
    // 首次请求或用户临时拒绝,再次发起权限请求
    final PermissionStatus result = await Permission.notification.request();
    if (!result.isGranted) {
      _showPermissionGuideDialog();
    }
  } else if (status.isPermanentlyDenied) {
    // 权限被永久拒绝,直接引导到设置页
    _showPermissionGuideDialog();
  }
}

// 显示权限引导弹窗
void _showPermissionGuideDialog() {
  showDialog(
    context: navigatorKey.currentContext!,
    builder: (context) => AlertDialog(
      title: const Text("通知权限已关闭"),
      content: const Text("为了接收推送通知,请前往应用设置开启通知权限"),
      actions: [
        TextButton(
          onPressed: () => Navigator.pop(context),
          child: const Text("取消"),
        ),
        TextButton(
          onPressed: () async {
            Navigator.pop(context);
            // 跳转到当前应用的系统设置页面
            await openAppSettings();
          },
          child: const Text("去设置"),
        ),
      ],
    ),
  );
}

3. 平台适配注意事项

  • Android 13+:需要在AndroidManifest.xml中添加权限声明:
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    
  • iOS:需要在Info.plist中添加权限描述文本:
    <key>NSNotificationAlertUsageDescription</key>
    <string>需要通知权限来接收重要消息提醒</string>
    <key>NSNotificationBadgeUsageDescription</key>
    <string>需要通知权限来更新应用角标</string>
    <key>NSNotificationSoundUsageDescription</key>
    <string>需要通知权限来播放通知音效</string>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:48:12