fastlane 2.224.0 → 2.232.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +98 -92
  3. data/bin/fastlane +2 -2
  4. data/cert/lib/cert/options.rb +7 -2
  5. data/cert/lib/cert/runner.rb +23 -11
  6. data/deliver/lib/assets/summary.html.erb +3 -3
  7. data/deliver/lib/deliver/app_screenshot.rb +215 -347
  8. data/deliver/lib/deliver/app_screenshot_iterator.rb +4 -1
  9. data/deliver/lib/deliver/app_screenshot_validator.rb +5 -21
  10. data/deliver/lib/deliver/loader.rb +2 -9
  11. data/deliver/lib/deliver/options.rb +1 -1
  12. data/deliver/lib/deliver/runner.rb +1 -1
  13. data/deliver/lib/deliver/upload_metadata.rb +5 -0
  14. data/deliver/lib/deliver/upload_screenshots.rb +4 -2
  15. data/fastlane/lib/assets/completions/completion.bash +1 -1
  16. data/fastlane/lib/assets/completions/completion.sh +2 -2
  17. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +16 -15
  18. data/fastlane/lib/fastlane/actions/appium.rb +1 -1
  19. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +6 -3
  20. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +12 -8
  21. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +56 -17
  22. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +13 -1
  23. data/fastlane/lib/fastlane/actions/get_version_number.rb +1 -1
  24. data/fastlane/lib/fastlane/actions/import_certificate.rb +9 -1
  25. data/fastlane/lib/fastlane/actions/import_from_git.rb +11 -4
  26. data/fastlane/lib/fastlane/actions/increment_build_number.rb +1 -1
  27. data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +3 -2
  28. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +2 -2
  29. data/fastlane/lib/fastlane/actions/modify_services.rb +1 -0
  30. data/fastlane/lib/fastlane/actions/notarize.rb +4 -0
  31. data/fastlane/lib/fastlane/actions/onesignal.rb +1 -1
  32. data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
  33. data/fastlane/lib/fastlane/actions/register_devices.rb +1 -1
  34. data/fastlane/lib/fastlane/actions/setup_ci.rb +14 -4
  35. data/fastlane/lib/fastlane/actions/testfairy.rb +41 -4
  36. data/fastlane/lib/fastlane/actions/unlock_keychain.rb +6 -1
  37. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +1 -1
  38. data/fastlane/lib/fastlane/actions/xcov.rb +1 -7
  39. data/fastlane/lib/fastlane/cli_tools_distributor.rb +9 -0
  40. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +4 -4
  41. data/fastlane/lib/fastlane/erb_template_helper.rb +1 -7
  42. data/fastlane/lib/fastlane/fast_file.rb +9 -6
  43. data/fastlane/lib/fastlane/helper/s3_client_helper.rb +4 -0
  44. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
  45. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +20 -20
  46. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -1
  47. data/fastlane/lib/fastlane/version.rb +2 -1
  48. data/fastlane/swift/Actions.swift +1 -1
  49. data/fastlane/swift/Appfile.swift +13 -5
  50. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  51. data/fastlane/swift/Atomic.swift +1 -1
  52. data/fastlane/swift/ControlCommand.swift +5 -4
  53. data/fastlane/swift/Deliverfile.swift +2 -2
  54. data/fastlane/swift/DeliverfileProtocol.swift +265 -68
  55. data/fastlane/swift/Fastlane.swift +187 -168
  56. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +3 -1
  57. data/fastlane/swift/Gymfile.swift +2 -2
  58. data/fastlane/swift/GymfileProtocol.swift +227 -54
  59. data/fastlane/swift/LaneFileProtocol.swift +7 -5
  60. data/fastlane/swift/MainProcess.swift +1 -1
  61. data/fastlane/swift/Matchfile.swift +2 -2
  62. data/fastlane/swift/MatchfileProtocol.swift +226 -59
  63. data/fastlane/swift/OptionalConfigValue.swift +1 -1
  64. data/fastlane/swift/Plugins.swift +1 -1
  65. data/fastlane/swift/Precheckfile.swift +2 -2
  66. data/fastlane/swift/PrecheckfileProtocol.swift +45 -13
  67. data/fastlane/swift/RubyCommand.swift +6 -7
  68. data/fastlane/swift/RubyCommandable.swift +1 -1
  69. data/fastlane/swift/Runner.swift +3 -3
  70. data/fastlane/swift/RunnerArgument.swift +1 -1
  71. data/fastlane/swift/Scanfile.swift +2 -2
  72. data/fastlane/swift/ScanfileProtocol.swift +334 -84
  73. data/fastlane/swift/Screengrabfile.swift +2 -2
  74. data/fastlane/swift/ScreengrabfileProtocol.swift +89 -24
  75. data/fastlane/swift/Snapshotfile.swift +2 -2
  76. data/fastlane/swift/SnapshotfileProtocol.swift +216 -53
  77. data/fastlane/swift/SocketClient.swift +7 -7
  78. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  79. data/fastlane/swift/SocketResponse.swift +1 -1
  80. data/fastlane/swift/formatting/Brewfile.lock.json +15 -25
  81. data/fastlane/swift/formatting/Rakefile +1 -2
  82. data/fastlane/swift/main.swift +1 -1
  83. data/fastlane_core/lib/assets/XMLTemplate.xml.erb +5 -1
  84. data/fastlane_core/lib/fastlane_core/cert_checker.rb +10 -0
  85. data/fastlane_core/lib/fastlane_core/command_executor.rb +3 -1
  86. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +5 -1
  87. data/fastlane_core/lib/fastlane_core/helper.rb +6 -1
  88. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +4 -14
  89. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +19 -2
  90. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +143 -106
  91. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +3 -1
  92. data/fastlane_core/lib/fastlane_core/project.rb +8 -0
  93. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +7 -1
  94. data/frameit/lib/frameit/device.rb +2 -2
  95. data/frameit/lib/frameit/device_types.rb +108 -70
  96. data/frameit/lib/frameit/template_finder.rb +1 -1
  97. data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +1 -0
  98. data/gym/lib/gym/module.rb +9 -4
  99. data/gym/lib/gym/options.rb +20 -2
  100. data/gym/lib/gym/runner.rb +38 -3
  101. data/match/lib/assets/READMETemplate.md +2 -2
  102. data/match/lib/match/generator.rb +2 -2
  103. data/match/lib/match/options.rb +1 -0
  104. data/match/lib/match/runner.rb +1 -1
  105. data/match/lib/match/storage/s3_storage.rb +4 -7
  106. data/pilot/lib/pilot/build_manager.rb +7 -1
  107. data/precheck/lib/precheck/options.rb +1 -1
  108. data/produce/lib/produce/commands_generator.rb +2 -0
  109. data/produce/lib/produce/developer_center.rb +1 -0
  110. data/produce/lib/produce/options.rb +1 -1
  111. data/produce/lib/produce/service.rb +6 -1
  112. data/scan/lib/scan/error_handler.rb +5 -0
  113. data/scan/lib/scan/options.rb +13 -3
  114. data/scan/lib/scan/test_command_generator.rb +10 -2
  115. data/sigh/lib/assets/resign.sh +7 -5
  116. data/sigh/lib/sigh/local_manage.rb +6 -4
  117. data/sigh/lib/sigh/options.rb +1 -0
  118. data/sigh/lib/sigh/runner.rb +23 -3
  119. data/snapshot/lib/snapshot/detect_values.rb +1 -1
  120. data/snapshot/lib/snapshot/options.rb +13 -1
  121. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +4 -2
  122. data/spaceship/lib/spaceship/client.rb +153 -22
  123. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +65 -9
  124. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +4 -4
  125. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +7 -1
  126. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +16 -16
  127. data/spaceship/lib/spaceship/connect_api/models/build_upload.rb +42 -0
  128. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +2 -0
  129. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +33 -2
  130. data/spaceship/lib/spaceship/connect_api/models/device.rb +1 -2
  131. data/spaceship/lib/spaceship/connect_api/models/profile.rb +2 -3
  132. data/spaceship/lib/spaceship/connect_api/models/webhook.rb +62 -0
  133. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +0 -6
  134. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +9 -0
  135. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +38 -0
  136. data/spaceship/lib/spaceship/connect_api.rb +2 -0
  137. data/spaceship/lib/spaceship/errors.rb +23 -6
  138. data/spaceship/lib/spaceship/portal/key.rb +22 -3
  139. data/spaceship/lib/spaceship/portal/portal_client.rb +29 -2
  140. data/spaceship/lib/spaceship/spaceauth_runner.rb +5 -15
  141. data/supply/lib/supply/client.rb +18 -1
  142. data/supply/lib/supply/uploader.rb +22 -11
  143. data/trainer/lib/trainer/legacy_xcresult.rb +586 -0
  144. data/trainer/lib/trainer/options.rb +5 -0
  145. data/trainer/lib/trainer/plist_test_summary_parser.rb +84 -0
  146. data/trainer/lib/trainer/test_parser.rb +12 -293
  147. data/trainer/lib/trainer/xcresult/helper.rb +63 -0
  148. data/trainer/lib/trainer/xcresult/repetition.rb +39 -0
  149. data/trainer/lib/trainer/xcresult/test_case.rb +221 -0
  150. data/trainer/lib/trainer/xcresult/test_case_attributes.rb +49 -0
  151. data/trainer/lib/trainer/xcresult/test_plan.rb +91 -0
  152. data/trainer/lib/trainer/xcresult/test_suite.rb +134 -0
  153. data/trainer/lib/trainer/xcresult.rb +31 -388
  154. data/trainer/lib/trainer.rb +3 -1
  155. metadata +172 -33
  156. data/fastlane/lib/fastlane/actions/hipchat.rb +0 -200
  157. data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +0 -14
  158. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +0 -43
  159. data/fastlane/lib/fastlane/plugins/template/.travis.yml +0 -4
@@ -3,25 +3,22 @@ require 'fastimage'
3
3
  module Deliver
4
4
  class AppScreenshotValidator
5
5
  # A simple structure that holds error information as well as formatted error messages consistently
6
- # Set `to_skip` to `true` when just needing to skip uploading rather than causing a crash.
7
6
  class ValidationError
8
7
  # Constants that can be given to `type` param
9
8
  INVALID_SCREEN_SIZE = 'Invalid screen size'.freeze
10
- UNACCEPTABLE_DEVICE = 'Not an accepted App Store Connect device'.freeze
11
9
  INVALID_FILE_EXTENSION = 'Invalid file extension'.freeze
12
10
  FILE_EXTENSION_MISMATCH = 'File extension mismatches its image format'.freeze
13
11
 
14
- attr_reader :type, :path, :debug_info, :to_skip
12
+ attr_reader :type, :path, :debug_info
15
13
 
16
- def initialize(type: nil, path: nil, debug_info: nil, to_skip: false)
14
+ def initialize(type: nil, path: nil, debug_info: nil)
17
15
  @type = type
18
16
  @path = path
19
17
  @debug_info = debug_info
20
- @to_skip = to_skip
21
18
  end
22
19
 
23
20
  def to_s
24
- "#{to_skip ? '🏃 Skipping' : '🚫 Error'}: #{path} - #{type} (#{debug_info})"
21
+ "🚫 Error: #{path} - #{type} (#{debug_info})"
25
22
  end
26
23
 
27
24
  def inspect
@@ -46,7 +43,6 @@ module Deliver
46
43
  errors_found = []
47
44
 
48
45
  validate_screen_size(screenshot, errors_found)
49
- validate_device_type(screenshot, errors_found)
50
46
  validate_file_extension_and_format(screenshot, errors_found)
51
47
 
52
48
  # Merge errors found into given errors array
@@ -55,22 +51,10 @@ module Deliver
55
51
  end
56
52
 
57
53
  def self.validate_screen_size(screenshot, errors_found)
58
- if screenshot.screen_size.nil?
54
+ if screenshot.display_type.nil?
59
55
  errors_found << ValidationError.new(type: ValidationError::INVALID_SCREEN_SIZE,
60
56
  path: screenshot.path,
61
- debug_info: "Actual size is #{get_formatted_size(screenshot)}. See the specifications to fix #{APP_SCREENSHOT_SPEC_URL}")
62
- end
63
- end
64
-
65
- # Checking if the device type exists in spaceship
66
- # Ex: iPhone 6.1 inch isn't supported in App Store Connect but need
67
- # to have it in there for frameit support
68
- def self.validate_device_type(screenshot, errors_found)
69
- if !screenshot.screen_size.nil? && screenshot.device_type.nil?
70
- errors_found << ValidationError.new(type: ValidationError::UNACCEPTABLE_DEVICE,
71
- path: screenshot.path,
72
- debug_info: "Screen size #{screenshot.screen_size} is not accepted. See the specifications to fix #{APP_SCREENSHOT_SPEC_URL}",
73
- to_skip: true)
57
+ debug_info: "Screenshot size is not supported. Actual size is #{get_formatted_size(screenshot)}. See the specifications to fix #{APP_SCREENSHOT_SPEC_URL}")
74
58
  end
75
59
  end
76
60
 
@@ -100,16 +100,9 @@ module Deliver
100
100
  errors = []
101
101
  valid_screenshots = screenshots.select { |screenshot| Deliver::AppScreenshotValidator.validate(screenshot, errors) }
102
102
 
103
- errors_to_skip, errors_to_crash = errors.partition(&:to_skip)
104
-
105
- unless errors_to_skip.empty?
106
- UI.important("🏃 Screenshots to be skipped are detected!")
107
- errors_to_skip.each { |error| UI.message(error) }
108
- end
109
-
110
- unless errors_to_crash.empty?
103
+ unless errors.empty?
111
104
  UI.important("🚫 Invalid screenshots were detected! Here are the reasons:")
112
- errors_to_crash.each { |error| UI.error(error) }
105
+ errors.each { |error| UI.error(error) }
113
106
  UI.user_error!("Canceled uploading screenshots. Please check the error messages above and fix the screenshots.")
114
107
  end
115
108
 
@@ -99,7 +99,7 @@ module Deliver
99
99
  optional: true,
100
100
  default_value: "ios",
101
101
  verify_block: proc do |value|
102
- UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %('ios', 'appletvos', 'xros', 'osx').include?(value)
102
+ UI.user_error!("The platform can only be ios, appletvos/tvos, xros or osx") unless %w(ios appletvos tvos xros osx).include?(value)
103
103
  end),
104
104
 
105
105
  # live version
@@ -107,7 +107,7 @@ module Deliver
107
107
  begin
108
108
  precheck_success = Precheck::Runner.new.run
109
109
  rescue => ex
110
- UI.error("fastlane precheck just tried to inspect your app's metadata for App Store guideline violations and ran into a problem. We're not sure what the problem was, but precheck failed to finished. You can run it in verbose mode if you want to see the whole error. We'll have a fix out soon 🚀")
110
+ UI.error("fastlane precheck just tried to inspect your app's metadata for App Store guideline violations and ran into a problem. We're not sure what the problem was, but precheck failed to finish. You can run it in verbose mode if you want to see the whole error. We'll have a fix out soon 🚀")
111
111
  UI.verbose(ex.inspect)
112
112
  UI.verbose(ex.backtrace.join("\n"))
113
113
  end
@@ -705,6 +705,11 @@ module Deliver
705
705
  def app_rating(app_info)
706
706
  return unless options[:app_rating_config_path]
707
707
 
708
+ unless app_info
709
+ UI.important("Skipping age rating update because app info could not be fetched.")
710
+ return
711
+ end
712
+
708
713
  require 'json'
709
714
  begin
710
715
  json = JSON.parse(File.read(options[:app_rating_config_path]))
@@ -93,7 +93,9 @@ module Deliver
93
93
 
94
94
  # Verify all screenshots have been deleted
95
95
  # Sometimes API requests will fail but screenshots will still be deleted
96
- count = iterator.each_app_screenshot_set.map { |_, app_screenshot_set| app_screenshot_set }
96
+ count = iterator.each_app_screenshot_set
97
+ .select { |localization, _| screenshots_per_language.keys.include?(localization.locale) }
98
+ .map { |_, app_screenshot_set| app_screenshot_set }
97
99
  .reduce(0) { |sum, app_screenshot_set| sum + app_screenshot_set.app_screenshots.size }
98
100
 
99
101
  UI.important("Number of screenshots not deleted: #{count}")
@@ -134,7 +136,7 @@ module Deliver
134
136
  number_of_screenshots_per_set[app_screenshot_set] ||= (app_screenshot_set.app_screenshots || []).count
135
137
 
136
138
  if number_of_screenshots_per_set[app_screenshot_set] >= 10
137
- UI.error("Too many screenshots found for device '#{screenshot.device_type}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
139
+ UI.error("Too many screenshots found for device '#{screenshot.display_type}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
138
140
  next
139
141
  end
140
142
 
@@ -21,6 +21,6 @@ _fastlane_complete() {
21
21
  completions="$(sed -En 's/^[ ]*lane +:([^ ]+).*$/\1/p' "$file")"
22
22
  completions="$completions update_fastlane"
23
23
 
24
- COMPREPLY=( $(compgen -W "$completions" -- "$word") )
24
+ mapfile -t COMPREPLY < <(compgen -W "$completions" -- "$word")
25
25
  }
26
26
 
@@ -4,9 +4,9 @@
4
4
  # shellcheck disable=SC2039
5
5
 
6
6
  if [ -n "$BASH_VERSION" ]; then
7
- source ~/.fastlane/completions/completion.bash
7
+ . ~/.fastlane/completions/completion.bash
8
8
  elif [ -n "$ZSH_VERSION" ]; then
9
- source ~/.fastlane/completions/completion.zsh
9
+ . ~/.fastlane/completions/completion.zsh
10
10
  fi
11
11
 
12
12
  # Do not remove v0.0.1
@@ -66,17 +66,17 @@ module Fastlane
66
66
  version_number = params[:version]
67
67
  platform = params[:platform]
68
68
 
69
- # Create filter for get_builds with optional version number
70
- filter = { app: app.id }
69
+ # Create filter for get_build_uploads with optional version number
70
+ filter = {}
71
71
  if version_number
72
- filter["preReleaseVersion.version"] = version_number
72
+ filter["cfBundleShortVersionString"] = version_number
73
73
  version_number_message = "version #{version_number}"
74
74
  else
75
75
  version_number_message = "any version"
76
76
  end
77
77
 
78
78
  if platform
79
- filter["preReleaseVersion.platform"] = Spaceship::ConnectAPI::Platform.map(platform)
79
+ filter["platform"] = Spaceship::ConnectAPI::Platform.map(platform)
80
80
  platform_message = "#{platform} platform"
81
81
  else
82
82
  platform_message = "any platform"
@@ -84,19 +84,20 @@ module Fastlane
84
84
 
85
85
  UI.message("Fetching the latest build number for #{version_number_message}")
86
86
 
87
- # Get latest build for optional version number and return build number if found
88
- build = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion", limit: 1).first
89
- if build
90
- build_nr = build.version
91
- UI.message("Latest upload for version #{build.app_version} on #{platform_message} is build: #{build_nr}")
92
- return OpenStruct.new({ build_nr: build_nr, build_v: build.app_version })
87
+ # Get latest build upload for optional version number and return build number if found
88
+ build_upload = Spaceship::ConnectAPI.get_build_uploads(app_id: app.id, filter: filter, sort: "-cfBundleVersion", limit: 1).first
89
+ if build_upload
90
+ build_nr = build_upload.cf_build_version
91
+ build_v = build_upload.cf_build_short_version_string
92
+ UI.message("Latest upload for version #{build_v} on #{platform_message} is build: #{build_nr}")
93
+ return OpenStruct.new({ build_nr: build_nr, build_v: build_v })
93
94
  end
94
95
 
95
- # Let user know that build couldn't be found
96
- UI.important("Could not find a build for #{version_number_message} on #{platform_message} on App Store Connect")
96
+ # Let user know that build upload couldn't be found
97
+ UI.important("Could not find a build upload for #{version_number_message} on #{platform_message} on App Store Connect")
97
98
 
98
99
  if params[:initial_build_number].nil?
99
- UI.user_error!("Could not find a build on App Store Connect - and 'initial_build_number' option is not set")
100
+ UI.user_error!("Could not find a build upload on App Store Connect - and 'initial_build_number' option is not set")
100
101
  else
101
102
  build_nr = params[:initial_build_number]
102
103
  UI.message("Using initial build number of #{build_nr}")
@@ -140,7 +141,7 @@ module Fastlane
140
141
  conflicting_options: [:api_key_path]),
141
142
  FastlaneCore::ConfigItem.new(key: :initial_build_number,
142
143
  env_name: "INITIAL_BUILD_NUMBER",
143
- description: "sets the build number to given value if no build is in current train",
144
+ description: "sets the build number to given value if no build (upload) is in current train",
144
145
  skip_type_validation: true), # as we also allow integers, which we convert to strings anyway
145
146
  FastlaneCore::ConfigItem.new(key: :app_identifier,
146
147
  short_option: "-a",
@@ -186,7 +187,7 @@ module Fastlane
186
187
  optional: true,
187
188
  default_value: "ios",
188
189
  verify_block: proc do |value|
189
- UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %('ios', 'appletvos', 'xros', 'osx').include?(value)
190
+ UI.user_error!("The platform can only be ios, appletvos/tvos, xros or osx") unless %w(ios appletvos tvos xros osx).include?(value)
190
191
  end),
191
192
  FastlaneCore::ConfigItem.new(key: :team_name,
192
193
  short_option: "-e",
@@ -90,7 +90,7 @@ module Fastlane
90
90
  port: params[:port],
91
91
  appium_lib: appium_lib
92
92
  ).start_driver
93
- Appium.promote_appium_methods(RSpec::Core::ExampleGroup)
93
+ Appium.promote_appium_methods(RSpec::Core::ExampleGroup, @driver)
94
94
  end
95
95
 
96
96
  c.after(:each) do
@@ -138,10 +138,11 @@ fastlane produce enable_services --help
138
138
  --associated-domains Enable Associated Domains
139
139
  --auto-fill-credential Enable Auto Fill Credential
140
140
  --class-kit Enable Class Kit
141
- --icloud STRING Enable iCloud, suitable values are "xcode5_compatible" and "xcode6_compatible"
141
+ --icloud STRING Enable iCloud, suitable values are "xcode5_compatible" and "xcode6_compatible"
142
142
  --custom-network-protocol Enable Custom Network Protocol
143
143
  --data-protection STRING Enable Data Protection, suitable values are "complete", "unlessopen" and "untilfirstauth"
144
144
  --extended-virtual-address-space Enable Extended Virtual Address Space
145
+ --declared-age-range Enable Declared Age Range capability
145
146
  --game-center STRING Enable Game Center, suitable values are "ios" and "macos
146
147
  --health-kit Enable Health Kit
147
148
  --hls-interstitial-preview Enable Hls Interstitial Preview
@@ -201,10 +202,11 @@ fastlane produce disable_services --help
201
202
  --associated-domains Disable Associated Domains
202
203
  --auto-fill-credential Disable Auto Fill Credential
203
204
  --class-kit Disable Class Kit
204
- --icloud STRING Disable iCloud
205
+ --icloud STRING Disable iCloud
205
206
  --custom-network-protocol Disable Custom Network Protocol
206
207
  --data-protection STRING Disable Data Protection
207
208
  --extended-virtual-address-space Disable Extended Virtual Address Space
209
+ --declared-age-range Disable Declared Age Range capability
208
210
  --game-center STRING Disable Game Center
209
211
  --health-kit Disable Health Kit
210
212
  --hls-interstitial-preview Disable Hls Interstitial Preview
@@ -302,7 +304,7 @@ lane :release do
302
304
  app_version: '1.0',
303
305
  sku: '123',
304
306
  team_name: 'SunApps GmbH', # only necessary when in multiple teams
305
-
307
+
306
308
  # Optional
307
309
  # App services can be enabled during app creation
308
310
  enable_services: {
@@ -317,6 +319,7 @@ lane :release do
317
319
  car_play_navigation_app: "on", # Valid values: "on", "off"
318
320
  car_play_voip_calling_app: "on", # Valid values: "on", "off"
319
321
  class_kit: "on", # Valid values: "on", "off"
322
+ declared_age_range: "on", # Valid values: "on", "off"
320
323
  icloud: "xcode5_compatible", # Valid values: "xcode5_compatible", "xcode6_compatible", "off"
321
324
  critical_alerts: "on", # Valid values: "on", "off"
322
325
  custom_network_protocol: "on", # Valid values: "on", "off"
@@ -215,7 +215,9 @@ fastlane match development
215
215
  This will create a new certificate and provisioning profile (if required) and store them in your selected storage.
216
216
  If you previously ran _match_ with the configured storage it will automatically install the existing profiles from your storage.
217
217
 
218
- The provisioning profiles are installed in `~/Library/MobileDevice/Provisioning Profiles` while the certificates and private keys are installed in your Keychain.
218
+ The provisioning profiles are installed in `~/Library/Developer/Xcode/UserData/Provisioning Profiles` (`~/Library/MobileDevice/Provisioning Profiles` for Xcode versions prior to 16.0) while the certificates and private keys are installed in your Keychain.
219
+
220
+ > fastlane relies on the system's default Xcode version to determine the current version. The path where provisioning profiles are stored changed in Xcode 16. If you use the `xcode_select` or `xcodes` actions and you have Xcode 15 and 16 installed in your system, please make sure to execute them before invoking the `sync_code_signing` action.
219
221
 
220
222
  To get a more detailed output of what _match_ is doing use
221
223
 
@@ -406,14 +408,16 @@ If you're not using `Fastfile`, you can also use the `force_for_new_devices` opt
406
408
  fastlane match adhoc --force_for_new_devices
407
409
  ```
408
410
 
409
- ##### Templates (aka: custom entitlements)
411
+ ##### Managed capabilities
410
412
 
411
- _match_ can generate profiles that contain custom entitlements by passing in the entitlement's name with the `template_name` parameter.
413
+ > [!IMPORTANT]
414
+ > This feature has been deprecated since May 2025, until Apple provides a new solution. We will update this documentation once we have more information on how to handle managed capabilities in the future.
412
415
 
413
- ```
414
- match(type: "development",
415
- template_name: "Apple Pay Pass Suppression Development")
416
- ```
416
+ Managed capabilities — formerly known as "additional entitlements" or "custom entitlements", enabled via "templates" — are additional capabilities that require Apple's review and approval before they can be distributed.
417
+
418
+ These capabilities used to be enabled by passing a `template_name` parameter to the _match_ action, which would then generate a provisioning profile with the entitlements specified by the given template. However, this feature was never officially supported by Apple's API (undocumented), and they eventually removed it in May 2025 ([see issue #29498](https://github.com/fastlane/fastlane/issues/29498)). Apple still hasn't provided a replacement for this functionality.
419
+
420
+ As a result, the `template_name` parameter was deprecated in the _match_ action, and it will not generate provisioning profiles with custom entitlements.
417
421
 
418
422
  ### Setup Xcode project
419
423
 
@@ -564,7 +568,7 @@ What's the worst that could happen for each of the profile types?
564
568
 
565
569
  #### App Store Profiles
566
570
 
567
- An App Store profile can't be used for anything as long as it's not re-signed by Apple. The only way to get an app resigned is to submit an app for review which could take anywhere from 24 hours to a few days (checkout [appreviewtimes.com](http://appreviewtimes.com) for up-to-date expectations). Attackers could only submit an app for review, if they also got access to your App Store Connect credentials (which are not stored in git, but in your local keychain). Additionally you get an email notification every time a build gets uploaded to cancel the submission even before your app gets into the review stage.
571
+ An App Store profile can't be used for anything as long as it's not re-signed by Apple. The only way to get an app resigned is to submit an app for review which could take anywhere from 24 hours to a few days. Attackers could only submit an app for review, if they also got access to your App Store Connect credentials (which are not stored in git, but in your local keychain). Additionally you get an email notification every time a build gets uploaded to cancel the submission even before your app gets into the review stage.
568
572
 
569
573
  #### Development and Ad Hoc Profiles
570
574
 
@@ -588,7 +588,7 @@ Key | Editable While Live | Directory | Filename | Deprecated Filename
588
588
 
589
589
  ### Available age rating groups
590
590
 
591
- #### Non Boolean
591
+ #### Infrequent/Mild or Frequent/Intense
592
592
 
593
593
  **Values**
594
594
 
@@ -597,34 +597,73 @@ Key | Editable While Live | Directory | Filename | Deprecated Filename
597
597
  - 2: Frequent/Intense (Legacy value, use `FREQUENT_OR_INTENSE`instead)
598
598
 
599
599
  - `NONE`
600
+ - `INFREQUENT`
600
601
  - `INFREQUENT_OR_MILD`
602
+ - `FREQUENT`
601
603
  - `FREQUENT_OR_INTENSE`
602
604
 
603
605
  **Keys**
604
606
 
605
- - 'alcoholTobaccoOrDrugUseOrReferences'
606
- - 'contests'
607
- - 'gamblingSimulated'
608
- - 'medicalOrTreatmentInformation'
609
- - 'profanityOrCrudeHumor'
610
-
611
- - 'sexualContentGraphicAndNudity'
612
- - 'sexualContentOrNudity'
613
- - 'horrorOrFearThemes'
614
- - 'matureOrSuggestiveThemes'
615
- - 'unrestrictedWebAccess'
616
- - 'violenceCartoonOrFantasy'
617
- - 'violenceRealisticProlongedGraphicOrSadistic'
618
- - 'violenceRealistic'
619
- - 'kidsAgeBand'
607
+ - `alcoholTobaccoOrDrugUseOrReferences`
608
+ - `contests`
609
+ - `gamblingSimulated`
610
+ - `gunsOrOtherWeapons`
611
+ - `horrorOrFearThemes`
612
+ - `matureOrSuggestiveThemes`
613
+ - `medicalOrTreatmentInformation`
614
+ - `profanityOrCrudeHumor`
615
+ - `sexualContentGraphicAndNudity`
616
+ - `sexualContentOrNudity`
617
+ - `violenceCartoonOrFantasy`
618
+ - `violenceRealistic`
619
+ - `violenceRealisticProlongedGraphicOrSadistic`
620
+
621
+ #### Age Rating
622
+
623
+ **Values**
624
+
625
+ - `NONE`
626
+ - `NINE_PLUS`
627
+ - `THIRTEEN_PLUS`
628
+ - `SIXTEEN_PLUS`
629
+ - `EIGHTEEN_PLUS`
630
+ - `UNRATED`
631
+
632
+ **Keys**
633
+
634
+ - `ageRatingOverrideV2`
635
+
636
+ #### Korea Age Rating
637
+
638
+ **Values**
639
+
640
+ - `NONE`
641
+ - `FIFTEEN_PLUS`
642
+ - `NINETEEN_PLUS`
643
+
644
+ **Keys**
645
+
646
+ - `koreaAgeRatingOverride`
647
+
648
+ #### URL
649
+
650
+ **Keys**
651
+
652
+ - `developerAgeRatingInfoUrl`
620
653
 
621
654
  #### Boolean
622
655
 
623
656
  **Keys**
624
657
 
658
+ - `advertising`
659
+ - `ageAssurance`
625
660
  - `gambling`
626
- - 'seventeenPlus'
661
+ - `healthOrWellnessTopics`
662
+ - `lootBox`
663
+ - `messagingAndChat`
664
+ - `parentalControls`
627
665
  - `unrestrictedWebAccess`
666
+ - `userGeneratedContent`
628
667
 
629
668
  #### Kids Age
630
669
 
@@ -77,7 +77,19 @@ _pilot_ does all kinds of magic for you:
77
77
  - Automatically detects the bundle identifier from your `ipa` file
78
78
  - Automatically fetch the AppID of your app based on the bundle identifier
79
79
 
80
- _pilot_ uses [_spaceship_](https://spaceship.airforce) to submit the build metadata and the iTunes Transporter to upload the binary. Because iTunes Transporter's upload capability is only supported on OS X, `pilot upload` does not work on Linux, as described [in this issue](https://github.com/fastlane/fastlane/issues/5789)
80
+ _pilot_ uses [_spaceship_](https://spaceship.airforce) to submit the build metadata and the iTunes Transporter to upload the binary.
81
+
82
+ ### Upload from Linux
83
+
84
+ To upload binaries from Linux:
85
+
86
+ - have the package file and the `AppStoreInfo.plist` file in the same location on disk (_check [fastlane gym](https://docs.fastlane.tools/actions/gym/) on how to make them_)
87
+ - make sure you have [Transporter on Linux](https://help.apple.com/itc/transporteruserguide/en.lproj/static.html) installed
88
+ - set the following environment variables:
89
+ - `FASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPT=true`
90
+ - `FASTLANE_ITUNES_TRANSPORTER_PATH=/usr/local/itms` (_or the path where Transporter is installed_)
91
+
92
+ _Note: fastlane will temporarily save the upload credentials in `$HOME/.appstoreconnect/private_keys/`. Any other files in that directory will be deleted upon upload completion._
81
93
 
82
94
  ## List builds
83
95
 
@@ -69,7 +69,7 @@ module Fastlane
69
69
 
70
70
  # Returns if only one non-test target
71
71
  if non_test_targets.count == 1
72
- return targets.first
72
+ return non_test_targets.first
73
73
  end
74
74
 
75
75
  options = targets.map(&:name)
@@ -6,7 +6,7 @@ module Fastlane
6
6
  def self.run(params)
7
7
  keychain_path = params[:keychain_path] || FastlaneCore::Helper.keychain_path(params[:keychain_name])
8
8
 
9
- FastlaneCore::KeychainImporter.import_file(params[:certificate_path], keychain_path, keychain_password: params[:keychain_password], certificate_password: params[:certificate_password], output: params[:log_output])
9
+ FastlaneCore::KeychainImporter.import_file(params[:certificate_path], keychain_path, keychain_password: params[:keychain_password], certificate_password: params[:certificate_password], certificate_format: params[:certificate_format], output: params[:log_output])
10
10
  end
11
11
 
12
12
  def self.description
@@ -23,6 +23,9 @@ module Fastlane
23
23
  sensitive: true,
24
24
  default_value: "",
25
25
  optional: true),
26
+ FastlaneCore::ConfigItem.new(key: :certificate_format,
27
+ description: "Format of the certificate. Check the '-f' switch from 'security import --help' command",
28
+ optional: true),
26
29
  FastlaneCore::ConfigItem.new(key: :keychain_name,
27
30
  env_name: "KEYCHAIN_NAME",
28
31
  description: "Keychain the items should be imported to",
@@ -65,6 +68,11 @@ module Fastlane
65
68
  )',
66
69
  'import_certificate(
67
70
  certificate_path: "certs/development.cer"
71
+ )',
72
+ 'import_certificate(
73
+ certificate_path: "certs/dist.p12",
74
+ certificate_password: ENV["CERTIFICATE_PASSWORD"] || "default",
75
+ certificate_format: "pkcs12"
68
76
  )'
69
77
  ]
70
78
  end
@@ -30,9 +30,10 @@ module Fastlane
30
30
  default_value: 'HEAD',
31
31
  optional: true),
32
32
  FastlaneCore::ConfigItem.new(key: :dependencies,
33
- description: "The array of additional Fastfiles in the repository",
34
- default_value: [],
35
- optional: true),
33
+ description: "The array of additional Fastfiles in the repository",
34
+ default_value: [],
35
+ type: Array,
36
+ optional: true),
36
37
  FastlaneCore::ConfigItem.new(key: :path,
37
38
  description: "The path of the Fastfile in the repository",
38
39
  default_value: 'fastlane/Fastfile',
@@ -43,6 +44,11 @@ module Fastlane
43
44
  optional: true),
44
45
  FastlaneCore::ConfigItem.new(key: :cache_path,
45
46
  description: "The path to a directory where the repository should be cloned into. Defaults to `nil`, which causes the repository to be cloned on every call, to a temporary directory",
47
+ optional: true),
48
+ FastlaneCore::ConfigItem.new(key: :git_extra_headers,
49
+ description: "An optional list of custom HTTP headers to access the git repo (`Authorization: Basic <YOUR BASE64 KEY>`, `Cache-Control: no-cache`, etc.)",
50
+ default_value: [],
51
+ type: Array,
46
52
  optional: true)
47
53
  ]
48
54
  end
@@ -68,7 +74,8 @@ module Fastlane
68
74
  branch: "HEAD", # The branch to checkout on the repository.
69
75
  path: "fastlane/Fastfile", # The path of the Fastfile in the repository.
70
76
  version: [">= 1.1.0", "< 2.0.0"], # The version to checkout on the repository. Multiple conditions can be used to select the latest version within constraints.
71
- cache_path: "~/.cache/fastlane/imported" # A directory in which the repository will be added, which means that it will not be cloned again on subsequent calls.
77
+ cache_path: "~/.cache/fastlane/imported", # A directory in which the repository will be added, which means that it will not be cloned again on subsequent calls.
78
+ git_extra_headers: ["Authorization: Basic <YOUR BASE64 KEY>", "Cache-Control: no-cache"]
72
79
  )'
73
80
  ]
74
81
  end
@@ -8,7 +8,7 @@ module Fastlane
8
8
  require 'shellwords'
9
9
 
10
10
  def self.is_supported?(platform)
11
- [:ios, :mac].include?(platform)
11
+ [:ios, :mac, :xros].include?(platform)
12
12
  end
13
13
 
14
14
  def self.run(params)
@@ -3,6 +3,7 @@ module Fastlane
3
3
  class InstallXcodePluginAction < Action
4
4
  def self.run(params)
5
5
  require 'fileutils'
6
+ require 'tmpdir'
6
7
 
7
8
  if params[:github]
8
9
  base_api_url = params[:github].sub('https://github.com', 'https://api.github.com/repos')
@@ -25,10 +26,10 @@ module Fastlane
25
26
  end
26
27
 
27
28
  zip_path = File.join(Dir.tmpdir, 'plugin.zip')
28
- sh("curl -Lso #{zip_path} #{params[:url]}")
29
+ Action.sh("curl", "-L", "-s", "-o", zip_path, params[:url])
29
30
  plugins_path = "#{ENV['HOME']}/Library/Application Support/Developer/Shared/Xcode/Plug-ins"
30
31
  FileUtils.mkdir_p(plugins_path)
31
- Action.sh("unzip -qo '#{zip_path}' -d '#{plugins_path}'")
32
+ Action.sh("unzip", "-qo", zip_path, "-d", plugins_path)
32
33
 
33
34
  UI.success("Plugin #{File.basename(params[:url], '.zip')} installed successfully")
34
35
  UI.message("Please restart Xcode to use the newly installed plugin")
@@ -83,11 +83,11 @@ module Fastlane
83
83
  optional: true,
84
84
  default_value: "ios",
85
85
  verify_block: proc do |value|
86
- UI.user_error!("The platform can only be ios, osx, xros or appletvos") unless %('osx', ios', 'appletvos', 'xros').include?(value)
86
+ UI.user_error!("The platform can only be ios, osx, xros or appletvos/tvos") unless %w(ios osx xros appletvos tvos).include?(value)
87
87
  end),
88
88
  FastlaneCore::ConfigItem.new(key: :initial_build_number,
89
89
  env_name: "INITIAL_BUILD_NUMBER",
90
- description: "sets the build number to given value if no build is in current train",
90
+ description: "sets the build number to given value if no build (upload) is in current train",
91
91
  default_value: 1,
92
92
  skip_type_validation: true), # allow Integer, String
93
93
  FastlaneCore::ConfigItem.new(key: :team_id,
@@ -49,6 +49,7 @@ module Fastlane
49
49
  associated_domains: 'associated_domains',
50
50
  auto_fill_credential: 'auto_fill_credential',
51
51
  class_kit: 'class_kit',
52
+ declared_age_range: 'declared_age_range',
52
53
  icloud: 'icloud',
53
54
  custom_network_protocol: 'custom_network_protocol',
54
55
  data_protection: 'data_protection',
@@ -73,6 +73,10 @@ module Fastlane
73
73
  "--wait"
74
74
  ] + auth_parts
75
75
 
76
+ if verbose
77
+ submit_parts << "--verbose"
78
+ end
79
+
76
80
  submit_command = submit_parts.join(' ')
77
81
  submit_response = Actions.sh(
78
82
  submit_command,
@@ -53,7 +53,7 @@ module Fastlane
53
53
  payload["organization_id"] = organization_id unless organization_id.nil?
54
54
 
55
55
  # here's the actual lifting - POST or PUT to OneSignal
56
- json_headers = { 'Content-Type' => 'application/json', 'Authorization' => "Basic #{auth_token}" }
56
+ json_headers = { 'Content-Type' => 'application/json', 'Authorization' => "Key #{auth_token}" }
57
57
  url = +'https://api.onesignal.com/apps'
58
58
  url << '/' + app_id if is_update
59
59
  uri = URI.parse(url)
@@ -58,7 +58,7 @@ module Fastlane
58
58
  optional: true,
59
59
  default_value: platform.empty? ? "ios" : platform,
60
60
  verify_block: proc do |value|
61
- UI.user_error!("The platform can only be ios or mac") unless %('ios', 'mac').include?(value)
61
+ UI.user_error!("The platform can only be ios or mac") unless %w(ios mac).include?(value)
62
62
  end),
63
63
  FastlaneCore::ConfigItem.new(key: :udid,
64
64
  env_name: "FL_REGISTER_DEVICE_UDID",
@@ -160,7 +160,7 @@ module Fastlane
160
160
  optional: true,
161
161
  default_value: platform.empty? ? "ios" : platform,
162
162
  verify_block: proc do |value|
163
- UI.user_error!("The platform can only be ios or mac") unless %('ios', 'mac').include?(value)
163
+ UI.user_error!("The platform can only be ios or mac") unless %w(ios mac).include?(value)
164
164
  end)
165
165
  ]
166
166
  end