React Native中Firebase与react-native-permissions的iOS安装冲突问题
解决React Native中use_frameworks!与react-native-permissions的兼容问题
我在React Native项目中为了集成Firebase,必须在Podfile中添加use_frameworks!配置。现在要安装需要权限支持的react-native-qrcode-scanner组件,它依赖react-native-permissions,但由于Podfile里的use_frameworks!,导致无法完成安装。当前的Podfile代码如下:
require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' pre_install do |installer| Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {} installer.pod_targets.each do |pod| if pod.name.eql?('RNPermissions') || pod.name.start_with?('Permission-') def pod.build_type; Pod::BuildType.static_library end end end end $RNFirebaseAsStaticFramework = true platform :ios, min_ios_version_supported prepare_react_native_project! use_frameworks! # If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. # because `react-native-flipper` depends on (FlipperKit,...) that will be excluded # # To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` # ```js # module.exports = { # dependencies: { # ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), # ``` flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green use_frameworks! :linkage => linkage.to_sym end target 'yawaPickerApp' do config = use_native_modules! # Flags change depending on the env values. flags = get_default_flags() use_react_native!( :path => config[:reactNativePath], # Hermes is now enabled by default. Disable by setting this flag to false. # Upcoming versions of React Native may rely on get_default_flags(), but # we make it explicit here to aid in the React Native upgrade process. :hermes_enabled => false ,#flags[:hermes_enabled], :fabric_enabled => flags[:fabric_enabled], # Enables Flipper. # # Note that if you have use_frameworks! enabled, Flipper will not work and # you should disable the next line. #:flipper_configuration => flipper_config, # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) permissions_path = '../node_modules/react-native-permissions/ios' pod 'Permission-Camera', :path => "#{permissions_path}/Camera" target 'yawaPickerAppTests' do inherit! :complete # Pods for testing end post_install do |installer| react_native_post_install( installer, # Set `mac_catalyst_enabled` to `true` in order to apply patches # necessary for Mac Catalyst builds :mac_catalyst_enabled => false ) __apply_Xcode_12_5_M1_post_install_workaround(installer) end end
修复方案
问题出在use_frameworks!默认会将所有Pod编译为动态框架,但react-native-permissions及其子库需要以静态库形式构建才能兼容。调整Podfile配置,同时满足Firebase和权限组件的需求:
修改后的完整Podfile:
require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' pre_install do |installer| Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {} installer.pod_targets.each do |pod| # 强制RNPermissions和权限子库为静态库 if pod.name.eql?('RNPermissions') || pod.name.start_with?('Permission-') def pod.build_type Pod::BuildType.static_library end end end end $RNFirebaseAsStaticFramework = true platform :ios, min_ios_version_supported prepare_react_native_project! # 配置use_frameworks为静态链接,兼容Firebase和权限组件 use_frameworks! :linkage => :static flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled target 'yawaPickerApp' do config = use_native_modules! flags = get_default_flags() use_react_native!( :path => config[:reactNativePath], :hermes_enabled => false, :fabric_enabled => flags[:fabric_enabled], :app_path => "#{Pod::Config.instance.installation_root}/.." ) permissions_path = '../node_modules/react-native-permissions/ios' pod 'Permission-Camera', :path => "#{permissions_path}/Camera" target 'yawaPickerAppTests' do inherit! :complete end post_install do |installer| react_native_post_install( installer, :mac_catalyst_enabled => false ) __apply_Xcode_12_5_M1_post_install_workaround(installer) end end
关键修改点
- 将全局的
use_frameworks!替换为use_frameworks! :linkage => :static,指定静态链接方式,既满足Firebase的需求,又避免动态框架冲突 - 移除了重复的
linkage判断逻辑,避免配置冲突 - 保留
pre_install钩子中强制权限相关Pod为静态库的设置,确保react-native-permissions能正常编译
执行步骤
- 替换原Podfile内容为上述修改后的版本
- 清理并重新安装依赖:
cd ios rm -rf Pods Podfile.lock pod install --repo-update
内容的提问来源于stack exchange,提问作者Keyvan
相关产品推荐
相关产品推荐

