Flutter permission_handler权限永久被拒时无法打开应用设置页问题求助
问题原因
- Podfile中权限编译宏配置错误:你当前使用到的
PERMISSION_CAMERA、PERMISSION_PHOTOS、PERMISSION_MEDIA_LIBRARY对应的宏定义行被注释,且未设置为启用值1,导致permission_handler底层未编译对应权限的处理逻辑,无法识别应用的权限申请记录,跳转系统设置时无法定位到应用专属设置页。 - Info.plist权限描述不完整:
NSPhotoLibraryAddUsageDescription的描述值为空,不符合iOS系统的权限配置要求,会导致权限相关功能异常。 - 权限类型选择错误:如果仅需要访问系统相册选图/存图,使用
Permission.mediaLibrary不符合常规场景,该权限主要用于访问苹果音乐等媒体库资源,普通相册访问应使用Permission.photos。
解决方案
1. 修复Podfile配置
移除你需要用到的权限对应宏的注释,将启用的权限值设为1,不需要的权限设为0,修改后参考配置如下:
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ '$(inherited)', ## dart: PermissionGroup.calendar 'PERMISSION_EVENTS=0', ## dart: PermissionGroup.reminders 'PERMISSION_REMINDERS=0', ## dart: PermissionGroup.contacts 'PERMISSION_CONTACTS=0', ## dart: PermissionGroup.camera 'PERMISSION_CAMERA=1', ## dart: PermissionGroup.microphone 'PERMISSION_MICROPHONE=0', ## dart: PermissionGroup.speech 'PERMISSION_SPEECH_RECOGNIZER=0', ## dart: PermissionGroup.photos 'PERMISSION_PHOTOS=1', ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] 'PERMISSION_LOCATION=0', ## dart: PermissionGroup.notification 'PERMISSION_NOTIFICATIONS=0', ## dart: PermissionGroup.mediaLibrary 'PERMISSION_MEDIA_LIBRARY=1', ## dart: PermissionGroup.sensors 'PERMISSION_SENSORS=0' ] end end end
2. 补全Info.plist权限描述
将空的NSPhotoLibraryAddUsageDescription值补充为符合实际使用场景的描述,用到相机的话还要新增相机权限描述,参考配置如下:
<key>NSPhotoLibraryUsageDescription</key> <string>需要访问您的相册以查看或保存图片</string> <key>NSPhotoLibraryAddUsageDescription</key> <string>需要访问您的相册以保存图片</string> <key>NSCameraUsageDescription</key> <string>需要访问您的相机以拍摄图片</string>
3. 调整权限处理逻辑
普通相册访问场景替换为Permission.photos,如果是Android13+可以对应适配细分权限,修改后的权限封装类参考:
import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'dart:io' show Platform; class PermissionService { openPhotoGallery() async { Permission galleryPermission = Permission.photos; // 低版本Android适配 if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt < 33) { galleryPermission = Permission.storage; } } var galleryAccessStatus = await galleryPermission.status; if(!galleryAccessStatus.isGranted) { var status = await galleryPermission.request(); if(status.isPermanentlyDenied) { await openAppSettings(); } } } }
注:以上代码用到DeviceInfoPlugin需要提前安装device_info_plus依赖
4. 清理缓存重新编译
执行以下命令清理旧缓存,让新配置生效:
- 执行
flutter clean - 进入iOS目录,删除
Pods文件夹和Podfile.lock文件 - 执行
pod install --repo-update - 重新运行项目
Android端适配补充
如果Android端也存在跳转异常,需要在AndroidManifest.xml中添加对应权限声明:
<!-- 读写存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android13+图片访问权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 相机权限 --> <uses-permission android:name="android.permission.CAMERA" />
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

