iOS14下Flutter应用不申请相机权限致App Store审核被拒如何解决
问题根因
- 你当前的代码仅读取了相机权限的现有状态,没有主动触发系统权限申请弹窗。
permission_handler的Permission.camera.status只会返回当前已有的权限结果,要弹出系统授权窗口,必须主动调用Permission.camera.request()方法。 - 代码逻辑存在错误:当权限状态返回
isDenied时,你直接执行了打开相机的逻辑,已经被用户拒绝的权限不会再弹出系统弹窗,此时直接访问相机就会触发App Store的审核规则驳回。 - iOS 14+存在权限继承机制:如果同包名应用之前安装过并授予过相机权限,卸载后短时间内重装会继承之前的权限状态,所以会直接返回
granted,导致看不到授权弹窗。
解决方案
1. 修正权限处理逻辑
替换原有的相机调用逻辑,按「查询状态-未授权则申请-判断结果再执行操作」的流程处理,参考代码如下:
handleTakePhoto() async { var status = await Permission.camera.status; print(status); // 权限还没有申请过,先主动申请权限 if (status.isUndetermined) { status = await Permission.camera.request(); } // 申请后/已有权限,判断是否授权通过 if (status.isGranted) { final PickedFile pickedFile = await picker.getImage( source: ImageSource.camera, maxHeight: 675, maxWidth: 960); if (pickedFile != null) { editImage(pickedFile.path); } } // 被拒绝,引导去设置页开启 else if (status.isPermanentlyDenied || status.isDenied) { showDialog( context: context, builder: (BuildContext context) => CupertinoAlertDialog( title: Text('相机权限申请'), content: Text('需要获取相机权限才能拍摄照片用于上传头像'), actions: <Widget>[ CupertinoDialogAction( child: Text('取消'), onPressed: () => Navigator.of(context).pop(), ), CupertinoDialogAction( child: Text('去设置'), onPressed: () => openAppSettings(), ), ], )); } }
2. 重置测试环境避免干扰
测试前进入iOS系统【设置-通用-传输或还原iPhone-还原-还原位置与隐私】,重置所有应用权限后再测试,就能正常触发授权弹窗。
3. 升级依赖到最新稳定版
确保permission_handler和image_picker都升级到官方最新稳定版,旧版本可能存在iOS 14+权限适配的bug。
4. 确认现有配置正确
你当前info.plist的权限描述配置、Podfile的预编译宏配置都是正确的,无需修改。
内容的提问来源于stack exchange,提问作者Ricardo Oscar Kanitz
相关产品推荐
相关产品推荐

