1# Uncomment this line to define a global platform for your project 2platform :ios, '9.0' 3 4# CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 7project 'Runner', { 8 'Debug' => :debug, 9 'Profile' => :release, 10 'Release' => :release, 11} 12 13def parse_KV_file(file, separator='=') 14 file_abs_path = File.expand_path(file) 15 if !File.exists? file_abs_path 16 return []; 17 end 18 generated_key_values = {} 19 skip_line_start_symbols = ["#", "/"] 20 File.foreach(file_abs_path) do |line| 21 next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 22 plugin = line.split(pattern=separator) 23 if plugin.length == 2 24 podname = plugin[0].strip() 25 path = plugin[1].strip() 26 podpath = File.expand_path("#{path}", file_abs_path) 27 generated_key_values[podname] = podpath 28 else 29 puts "Invalid plugin specification: #{line}" 30 end 31 end 32 generated_key_values 33end 34 35target 'Runner' do 36 use_frameworks! 37 use_modular_headers! 38 39 # Flutter Pod 40 41 copied_flutter_dir = File.join(__dir__, 'Flutter') 42 copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') 43 copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') 44 unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) 45 # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. 46 # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. 47 # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. 48 49 generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') 50 unless File.exist?(generated_xcode_build_settings_path) 51 raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" 52 end 53 generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) 54 cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; 55 56 unless File.exist?(copied_framework_path) 57 FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) 58 end 59 unless File.exist?(copied_podspec_path) 60 FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) 61 end 62 end 63 64 # Keep pod path relative so it can be checked into Podfile.lock. 65 pod 'Flutter', :path => 'Flutter' 66 67 # Plugin Pods 68 69 # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 70 # referring to absolute paths on developers' machines. 71 system('rm -rf .symlinks') 72 system('mkdir -p .symlinks/plugins') 73 plugin_pods = parse_KV_file('../.flutter-plugins') 74 plugin_pods.each do |name, path| 75 symlink = File.join('.symlinks', 'plugins', name) 76 File.symlink(path, symlink) 77 pod name, :path => File.join(symlink, 'ios') 78 end 79end 80 81# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. 82install! 'cocoapods', :disable_input_output_paths => true 83 84post_install do |installer| 85 installer.pods_project.targets.each do |target| 86 target.build_configurations.each do |config| 87 config.build_settings['ENABLE_BITCODE'] = 'NO' 88 end 89 end 90end 91 92pre_install do |installer| 93 # workaround for https://github.com/CocoaPods/CocoaPods/issues/3289 94 Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {} 95end 96