Flutter的permission_handler插件检查iOS的通知权限不准确

文章底部有更新

今天,做好了一个功能,就是在app内检查用户有没有给当前APP打开通知权限,

如果没打开,就展示一个 banner ,让用户去点击banner去打开权限 。

android上测试得非常顺利,

结果,

在iOS 上就是不行,不管怎么打开关闭通知,使用 

Permission.notification.status 获取到的结果一直是: PermissionStatus.denied

我去,这也太坑了, 通过咨询AI大神,得出结论: 

这这这,  不准确也不解决一下吗? 真的无语了。 

解决办法:

  Future<bool> checkIOSNotificationsStatus() async {
    final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();
    final bool? granted = await flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()
        ?.requestPermissions(alert: true, badge: true, sound: true);
    return granted ?? false;
  }

只能先这样解决了, 我判断如果是iOS平台,就用我写的这个方法 checkIOSNotificationsStatus 来判断权限的状态。 

你们说为什么 permission_handler 插件没有发现这个问题? 也不及时更新解决一下。 

-------------------------------- 分隔线 ------------------------------------ 

今天偶然发现了这个问题的真正的解决方法, 就需要把下面这些用到的权限,宏定义设置为1. 

比如我把 PERMISSION_LOCATION 设置为0 ,那么 

var result = await Permission.location.request();

无论如何也是请求不到权限弹窗的,所以其它权限的 request 也是一样的情况 。 

这个是很容易忽略的点。 

config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
  '$(inherited)',

  ## dart: PermissionGroup.calendar
  'PERMISSION_EVENTS=1',
  
  ## dart: PermissionGroup.calendarFullAccess
  'PERMISSION_EVENTS_FULL_ACCESS=1',

  ## dart: PermissionGroup.reminders
  'PERMISSION_REMINDERS=1',

  ## dart: PermissionGroup.contacts
  'PERMISSION_CONTACTS=1',

  ## dart: PermissionGroup.camera
  'PERMISSION_CAMERA=1',

  ## dart: PermissionGroup.microphone
  'PERMISSION_MICROPHONE=1',

  ## dart: PermissionGroup.speech
  'PERMISSION_SPEECH_RECOGNIZER=1',

  ## dart: PermissionGroup.photos
  'PERMISSION_PHOTOS=1',

  ## The 'PERMISSION_LOCATION' macro enables the `locationWhenInUse` and `locationAlways` permission. If
  ## the application only requires `locationWhenInUse`, only specify the `PERMISSION_LOCATION_WHENINUSE`
  ## macro.
  ##
  ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
  'PERMISSION_LOCATION=1',
  'PERMISSION_LOCATION_WHENINUSE=0',

  ## dart: PermissionGroup.notification
  'PERMISSION_NOTIFICATIONS=1',

  ## dart: PermissionGroup.mediaLibrary
  'PERMISSION_MEDIA_LIBRARY=1',

  ## dart: PermissionGroup.sensors
  'PERMISSION_SENSORS=1',

  ## dart: PermissionGroup.bluetooth
  'PERMISSION_BLUETOOTH=1',

  ## dart: PermissionGroup.appTrackingTransparency
  'PERMISSION_APP_TRACKING_TRANSPARENCY=1',

  ## dart: PermissionGroup.criticalAlerts
  'PERMISSION_CRITICAL_ALERTS=1',

  ## dart: PermissionGroup.criticalAlerts
  'PERMISSION_ASSISTANT=1',
<think>好的,我现在需要帮助用户解决在Flutter中使用permission_handler配置安卓本地存储权限的问题。首先,我需要回顾用户提供的引用内容,看看是否有相关的信息。 根据引用[1],permission_handler插件需要同时配置Android和iOS权限,用户可能遇到了配置生效的问题。引用[2]提到了添加依赖的步骤,版本是7.1.0。引用[3]展示了如何在代码中请求权限,但具体到存储权限可能需要同的PermissionGroup。引用[4]提到了iOS端的权限问题,但用户现在关注的是安卓端。 用户的问题明确,需要配置安卓的本地存储权限。首先,我应该分步骤说明配置流程。可能包括添加依赖、修改AndroidManifest.xml、动态请求权限等步骤。 需要注意的是,Android的存储权限在API 23(Android 6.0)之后需要动态请求,而仅仅是声明在清单文件中。因此,用户需要在代码中处理运行时权限。 另外,安卓10(API 29)及以上版本引入了分区存储,可能需要处理同的权限策略,比如使用READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE,或者考虑使用MANAGE_EXTERNAL_STORAGE,但后者可能需要特别处理,并且可能被Google Play接受。因此,建议用户根据目标API级别选择合适的权限。 在代码示例部分,需要展示如何请求存储权限,可能使用Permission.storage,并检查权限状态是否为granted。同时,要提醒用户处理权限被拒绝的情况,比如引导用户到设置页面。 还要注意检查用户是否已经正确配置了AndroidManifest.xml文件,添加了相应的权限声明。例如: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 此外,可能需要处理Android 11(API 30)及以上的权限变更,比如使用MANAGE_EXTERNAL_STORAGE,但需要谨慎,因为Google Play可能有政策限制。因此,建议用户尽可能使用分区存储,减少对广泛存储权限的依赖。 总结步骤应该是: 1. 添加依赖 2. 配置AndroidManifest.xml 3. 动态请求权限 4. 处理权限结果 同时,生成相关问题时要考虑用户可能遇到的后续问题,比如权限被拒绝后的处理,同安卓版本的适配等。</think>### 在Flutter中配置Android本地存储权限的步骤 #### 1. 添加依赖 在 `pubspec.yaml` 文件中添加 `permission_handler` 依赖: ```yaml dependencies: permission_handler: ^10.4.4 # 使用最新稳定版本 ``` 运行 `flutter pub get` 安装依赖[^2]。 #### 2. 配置Android权限声明 在 `android/app/src/main/AndroidManifest.xml` 的 `<manifest>` 标签内添加以下权限: ```xml <!-- 存储权限(Android 10及以下) --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Android 11及以上访问所有文件 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" /> ``` #### 3. 动态请求权限 在代码中使用 `Permission.storage` 请求存储权限: ```dart import 'package:permission_handler/permission_handler.dart'; // 检查并请求存储权限 Future<bool> requestStoragePermission() async { final status = await Permission.storage.request(); if (status.isGranted) { return true; } else if (status.isPermanentlyDenied) { // 引导用户手动开启权限 await openAppSettings(); } return false; } // 使用示例 void accessFile() async { if (await requestStoragePermission()) { // 执行文件操作 } else { print("权限被拒绝"); } } ``` #### 4. 适配Android版本 - **Android 10(API 29)及以上**:若需要访问媒体文件,建议使用 `READ_MEDIA_IMAGES`/`READ_MEDIA_VIDEO` 代替传统存储权限。 - **Android 13(API 33)及以上**:需单独请求 `READ_MEDIA_IMAGES` 或 `READ_MEDIA_VIDEO`[^1]。 #### 注意事项 - **分区存储**:从Android 11开始,Google推荐使用分区存储(Scoped Storage),尽量避免使用 `MANAGE_EXTERNAL_STORAGE`[^4]。 - **Google Play政策**:使用 `MANAGE_EXTERNAL_STORAGE` 需在应用商店提交「权限声明表」,否则可能被下架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值