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

Flutter上传App Store Connect缺NSCameraUsageDescription、推送权限报错如何解决

两类上传报错的定向修复方案

一、ITMS-90683 缺少NSCameraUsageDescription用途字符串修复

你之前在Podfile中配置的PERMISSION_CAMERA=0编译宏,仅能关闭permission_handler插件自身的相机权限请求逻辑,无法阻断其他第三方依赖在pod安装阶段自动注入的相机权限声明。iOS审核会静态扫描Info.plist内所有存在的权限键,只要键存在就必须配套合规的用途说明字符串,和你实际代码是否调用相机能力无关。

  • 依赖侧排查:进入项目的ios目录,执行grep -r "NSCameraUsageDescription" Pods/,可定位所有会自动向Info.plist注入该权限键的库,结合你列出的依赖清单,命中源通常为google_mobile_ads、flutter_facebook_login、本地路径的social_share_plugin、image_gallery_saver。
  • 配置层修复:在现有Podfile的post_install块中,将以下编译宏合并到GCC_PREPROCESSOR_DEFINITIONS数组中,从根源禁用第三方库的相机权限注入逻辑:
    # 禁用Google移动广告SDK的相机权限自动注入
    'GAD_DISABLE_CAMERA_USAGE_DESCRIPTION=1',
    # 禁用Facebook登录SDK的相机权限自动注入
    'FBSDKCameraAccessDisabled=1'
    
    配置完成后执行pod install --repo-update重装依赖,这两个SDK将不再自动向Info.plist写入NSCameraUsageDescription键。
  • 兜底规则:如果重装依赖后Info.plist内仍存在NSCameraUsageDescription键,直接补上合规的用途说明字符串(如"应用需访问相机以支持头像拍摄、功能扫码")即可,无需强行删除键值——强行删除会导致下次pod install时被第三方库重新注入,反而容易漏配触发审核报错。
  • 自定义插件排查:检查你本地路径引用的photo_view、social_share_plugin、apple_sign_in_firebase插件的原生iOS代码,确认是否存在硬编码写入相机权限的逻辑,若存在则移除对应的注入代码,避免残留权限键未配说明被审核拦截。

二、ITMS-90078 缺少推送通知权限配置修复

该报错的触发逻辑为:App Store Connect的静态扫描检测到应用二进制内存在registerForRemoteNotifications的方法调用符号,即要求应用在entitlement配置中补上推送权限条目,和你是否实际开发推送功能无关。结合你的依赖清单,该符号的来源通常为google_mobile_ads SDK、Firebase核心SDK的内置逻辑。

  • 最低成本修复路径:打开Xcode的Runner项目,进入Signing & Capabilities标签页,添加Push Notifications能力,Xcode会自动在Runner.entitlements文件中写入aps-environment的环境配置项。完成该配置后重新打包上传即可通过审核,该操作不会触发任何用户端的权限弹窗——只要你不主动在代码中请求通知权限,用户完全感知不到该配置的存在。
  • 零侵入禁用路径:如果完全不想暴露推送能力配置,可在Podfile的GCC_PREPROCESSOR_DEFINITIONS数组中加入以下编译宏,从二进制层面移除远程通知的调用符号:
    # 禁用Firebase核心SDK的推送注册逻辑
    'FIR_MESSAGING_DISABLE=1',
    # 禁用Google移动广告SDK的推送注册逻辑
    'GAD_DISABLE_PUSH_NOTIFICATIONS=1'
    
    配置完成后重装依赖重新打包,静态扫描将不再检测到远程通知的调用符号,自然不会触发该报错。

打包前本地验证

为避免上传后再被审核拦截,在执行Archive打包前做两项本地校验:

  1. 右键生成的.xcarchive文件,选择Show Package Contents,进入Products/Applications/Runner.app目录,右键显示包内容打开Info.plist,排查所有权限键是否都配套了对应的用途说明字符串,无漏配项。
  2. 在Runner.app目录下执行nm Runner | grep registerForRemoteNotifications,确认二进制内无对应方法调用符号(如果已经在Xcode中配置了推送capability则无需执行该步校验)。

合并后的完整post_install配置参考:

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)',
        # permission_handler 权限关闭配置
        'PERMISSION_EVENTS=0',
        'PERMISSION_REMINDERS=0',
        'PERMISSION_CONTACTS=0',
        'PERMISSION_CAMERA=0',
        'PERMISSION_MICROPHONE=0',
        'PERMISSION_SPEECH_RECOGNIZER=0',
        'PERMISSION_PHOTOS=0',
        'PERMISSION_LOCATION=0',
        'PERMISSION_NOTIFICATIONS=0',
        'PERMISSION_MEDIA_LIBRARY=0',
        'PERMISSION_SENSORS=0',
        'PERMISSION_BLUETOOTH=0',
        # 第三方库权限关闭配置
        'GAD_DISABLE_CAMERA_USAGE_DESCRIPTION=1',
        'FBSDKCameraAccessDisabled=1',
        'FIR_MESSAGING_DISABLE=1',
        'GAD_DISABLE_PUSH_NOTIFICATIONS=1'
      ]
    end
  end
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 14:15:08