iOS相机权限获取

复制代码
语言:Flutter
问题:获取相机弹窗的权限不出来,iOS系统设置里面对应app也没有相机选项。是宏没有打开
解决方法:打开宏

Podfile

swift 复制代码
# post_install do |installer|
#   installer.pods_project.targets.each do |target|
#     flutter_additional_ios_build_settings(target)
#     # 为所有 Pod 目标启用 dSYM 生成
#     target.build_configurations.each do |config|
#       if config.name == 'Release'
#         config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf-with-dsym'
#       end
#     end
#   end
# end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)

    target.build_configurations.each do |config|

      if config.name == 'Release'
        config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf-with-dsym'
      end

      # ⭐ permission_handler 必须的宏配置
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',

        'PERMISSION_CAMERA=1',

      ]

    end
  end
end

这段 Podfile 的 post_install 配置是正确的


一、post_install 是什么 🔧

arduino 复制代码
post_install do |installer|

意思是:

CocoaPods 安装完成后执行这段脚本。

也就是在执行:

复制代码
pod install

之后运行。

用途:

  • 修改 iOS 编译参数
  • 给插件加配置
  • 修复 Flutter / iOS 插件问题

Flutter 权限插件基本都用这个。


二、installer.pods_project.targets.each do |target|

vbnet 复制代码
installer.pods_project.targets.each do |target|

意思是:

遍历所有 Pod 插件。

例如:

  • permission_handler
  • mobile_scanner
  • ffmpeg_kit
  • camera
  • etc

这段代码会对 所有插件生效

相当于:

给所有插件统一设置编译参数。


三、flutter_additional_ios_build_settings(target)

scss 复制代码
flutter_additional_ios_build_settings(target)

意思:

Flutter 自动生成的 iOS配置。

它会自动设置:

  • Swift版本
  • 架构支持
  • Bitcode
  • iOS版本兼容性

这是 Flutter 官方必须的一行。

不能删。


四、target.build_configurations.each do |config|

arduino 复制代码
target.build_configurations.each do |config|

意思:

遍历 Debug / Release 编译模式。

iOS有三种模式:

  • Debug(开发)
  • Profile(性能分析)
  • Release(发布)

这段代码:

对每个模式分别设置参数。


五、DEBUG_INFORMATION_FORMAT = dwarf-with-dsym

arduino 复制代码
if config.name == 'Release'
  config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf-with-dsym'
end

意思:

Release版本生成 dSYM 文件。

作用:

  • 崩溃日志解析
  • Crashlytics
  • TestFlight 崩溃分析

否则:

  • 崩溃日志看不懂

这是一个好习惯配置 👍

和权限无关。


六、最重要的一段(权限宏)⭐

css 复制代码
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [  '$(inherited)',  'PERMISSION_CAMERA=1',]

这是关键。

意思:

给 iOS 编译器设置宏定义。

等价于:

arduino 复制代码
#define PERMISSION_CAMERA 1

告诉 permission_handler:

编译相机权限代码。


七、$(inherited) 是什么

arduino 复制代码
'$(inherited)',

意思:

保留系统原来的设置。

如果不写:

可能破坏 Flutter 默认配置。

必须保留。

相当于:

在原来的基础上增加权限宏。


八、PERMISSION_CAMERA=1 是什么 ⭐

arduino 复制代码
'PERMISSION_CAMERA=1',

意思:

打开相机权限模块。

permission_handler 内部代码类似:

arduino 复制代码
#if PERMISSION_CAMERA
// 相机权限代码
#endif

如果没有:

arduino 复制代码
#if PERMISSION_CAMERA

条件不成立。

相机代码不会编译进去。

结果就是:

  • request() 不弹窗
  • denied
  • 设置里没有权限

之前就是这个问题。


九、整体逻辑总结(核心理解)

配置现在等价于:

安装所有插件

Flutter配置生效

Release版本生成崩溃符号

开启相机权限模块

流程:

ini 复制代码
pod install
   ↓
执行 post_install
   ↓
给所有插件加 PERMISSION_CAMERA=1
   ↓
Xcode 编译
   ↓
permission_handler 包含相机权限代码
   ↓
request() 正常弹窗

十、建议升级为完整权限配置(推荐)🔥

建议改成:

css 复制代码
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [  '$(inherited)',  'PERMISSION_CAMERA=1',  'PERMISSION_PHOTOS=1',  'PERMISSION_MICROPHONE=1',]

原因:

以后大概率会用:

  • 相册
  • 麦克风
  • 视频

否则未来又会踩坑。


十一、最关键结论

现在这段:

arduino 复制代码
'PERMISSION_CAMERA=1',

就是让:

ini 复制代码
Permission.camera.request();

真正生效的原因。

没有它:

iOS 会表现为:

  • 不弹窗
  • denied
  • 设置没有权限
相关推荐
风华圆舞3 小时前
Flutter + 鸿蒙 Intents Kit:页面直达能力的完整接入方案
flutter·ui·华为·harmonyos
韩曙亮3 小时前
【Flutter】Flutter 组件 ④ ( 组件渲染 的 三棵树理论 | Widget 树 → Element 树 → RenderObject 树 )
flutter·element·widget·renderobject
初级代码游戏3 小时前
easy Photo Clean公测版:快速清理iPhone照片 邀请公测
ios·iphone
库奇噜啦呼4 小时前
【iOS】RunLoop学习
学习·ios
黑科技iOS上架5 小时前
iOS应用周末提交什么情况算卡审
经验分享·ios
恋猫de小郭6 小时前
Android 17 正式版发布,全新 AI 和各种破坏性更新
android·前端·flutter
kingbal6 小时前
Windows:flutter环境搭建
windows·flutter
911hzh7 小时前
Flutter MethodChannel 跨端通信框架 zh_native_channel:快速入门、优势分析与 Pigeon 对比
flutter
911hzh7 小时前
Flutter 快速搭建新项目:用 Flutter Foundation Kit 一条命令生成带基础架构的 App 模板
flutter