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

iOS14下Flutter应用不申请相机权限致App Store审核被拒如何解决

问题根因

  1. 你当前的代码仅读取了相机权限的现有状态,没有主动触发系统权限申请弹窗。permission_handler的Permission.camera.status只会返回当前已有的权限结果,要弹出系统授权窗口,必须主动调用Permission.camera.request()方法。
  2. 代码逻辑存在错误:当权限状态返回isDenied时,你直接执行了打开相机的逻辑,已经被用户拒绝的权限不会再弹出系统弹窗,此时直接访问相机就会触发App Store的审核规则驳回。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:36:01