fastlane 2.147.0 → 2.150.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +82 -82
  3. data/cert/lib/cert/commands_generator.rb +1 -0
  4. data/credentials_manager/lib/credentials_manager/cli.rb +2 -0
  5. data/deliver/lib/deliver.rb +0 -1
  6. data/deliver/lib/deliver/app_screenshot.rb +28 -27
  7. data/deliver/lib/deliver/commands_generator.rb +1 -0
  8. data/deliver/lib/deliver/html_generator.rb +2 -2
  9. data/deliver/lib/deliver/options.rb +6 -11
  10. data/deliver/lib/deliver/runner.rb +7 -4
  11. data/deliver/lib/deliver/setup.rb +5 -30
  12. data/deliver/lib/deliver/submit_for_review.rb +124 -83
  13. data/deliver/lib/deliver/upload_metadata.rb +284 -143
  14. data/deliver/lib/deliver/upload_price_tier.rb +15 -8
  15. data/deliver/lib/deliver/upload_screenshots.rb +86 -37
  16. data/fastlane/lib/assets/s3_html_template.erb +1 -1
  17. data/fastlane/lib/fastlane/actions/crashlytics.rb +0 -4
  18. data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -1
  19. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +42 -2
  20. data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +1 -1
  21. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +2 -2
  22. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +3 -11
  23. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +15 -2
  24. data/fastlane/lib/fastlane/actions/download_dsyms.rb +7 -1
  25. data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +1 -1
  26. data/fastlane/lib/fastlane/actions/google_play_track_release_names.rb +74 -0
  27. data/fastlane/lib/fastlane/actions/hipchat.rb +1 -1
  28. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +1 -1
  29. data/fastlane/lib/fastlane/actions/slack.rb +2 -2
  30. data/fastlane/lib/fastlane/actions/slather.rb +8 -1
  31. data/fastlane/lib/fastlane/actions/spm.rb +7 -0
  32. data/fastlane/lib/fastlane/actions/swiftlint.rb +14 -0
  33. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +1 -1
  34. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +3 -34
  35. data/fastlane/lib/fastlane/actions/xcodebuild.rb +4 -4
  36. data/fastlane/lib/fastlane/cli_tools_distributor.rb +28 -6
  37. data/fastlane/lib/fastlane/commands_generator.rb +1 -1
  38. data/fastlane/lib/fastlane/documentation/actions_list.rb +1 -1
  39. data/fastlane/lib/fastlane/lane.rb +3 -3
  40. data/fastlane/lib/fastlane/lane_manager.rb +0 -10
  41. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +3 -3
  42. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +29 -0
  43. data/fastlane/lib/fastlane/swift_fastlane_function.rb +22 -5
  44. data/fastlane/lib/fastlane/swift_lane_manager.rb +0 -8
  45. data/fastlane/lib/fastlane/version.rb +1 -1
  46. data/fastlane/swift/ControlCommand.swift +1 -0
  47. data/fastlane/swift/Deliverfile.swift +1 -1
  48. data/fastlane/swift/Fastlane.swift +140 -30
  49. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +3 -9
  50. data/fastlane/swift/Gymfile.swift +1 -1
  51. data/fastlane/swift/GymfileProtocol.swift +1 -1
  52. data/fastlane/swift/Matchfile.swift +1 -1
  53. data/fastlane/swift/MatchfileProtocol.swift +5 -1
  54. data/fastlane/swift/Precheckfile.swift +1 -1
  55. data/fastlane/swift/RubyCommand.swift +29 -6
  56. data/fastlane/swift/RubyCommandable.swift +1 -0
  57. data/fastlane/swift/Runner.swift +85 -13
  58. data/fastlane/swift/Scanfile.swift +1 -1
  59. data/fastlane/swift/ScanfileProtocol.swift +10 -2
  60. data/fastlane/swift/Screengrabfile.swift +1 -1
  61. data/fastlane/swift/Snapshotfile.swift +1 -1
  62. data/fastlane/swift/SnapshotfileProtocol.swift +17 -1
  63. data/fastlane/swift/SocketClient.swift +76 -45
  64. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  65. data/fastlane/swift/SocketResponse.swift +1 -0
  66. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +1 -3
  67. data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +7 -0
  68. data/frameit/lib/frameit/commands_generator.rb +1 -0
  69. data/frameit/lib/frameit/device_types.rb +100 -100
  70. data/gym/lib/gym/generators/package_command_generator.rb +4 -0
  71. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +4 -0
  72. data/gym/lib/gym/options.rb +1 -1
  73. data/gym/lib/gym/runner.rb +14 -0
  74. data/match/lib/match/commands_generator.rb +1 -0
  75. data/match/lib/match/generator.rb +2 -1
  76. data/match/lib/match/nuke.rb +21 -16
  77. data/match/lib/match/options.rb +18 -1
  78. data/match/lib/match/storage/git_storage.rb +4 -0
  79. data/match/lib/match/storage/google_cloud_storage.rb +4 -0
  80. data/match/lib/match/storage/interface.rb +4 -0
  81. data/match/lib/match/storage/s3_storage.rb +4 -0
  82. data/pem/lib/pem/commands_generator.rb +1 -0
  83. data/pilot/lib/pilot/build_manager.rb +23 -7
  84. data/pilot/lib/pilot/options.rb +5 -0
  85. data/produce/lib/produce/commands_generator.rb +1 -0
  86. data/produce/lib/produce/itunes_connect.rb +20 -20
  87. data/produce/lib/produce/options.rb +3 -3
  88. data/scan/lib/scan/detect_values.rb +3 -0
  89. data/scan/lib/scan/options.rb +20 -2
  90. data/scan/lib/scan/test_command_generator.rb +6 -1
  91. data/scan/lib/scan/test_result_parser.rb +9 -2
  92. data/screengrab/lib/screengrab/runner.rb +10 -9
  93. data/sigh/lib/assets/resign.sh +7 -7
  94. data/sigh/lib/sigh/commands_generator.rb +1 -0
  95. data/sigh/lib/sigh/options.rb +7 -1
  96. data/sigh/lib/sigh/runner.rb +2 -1
  97. data/snapshot/lib/assets/SnapshotHelper.swift +16 -37
  98. data/snapshot/lib/assets/SnapshotHelperXcode8.swift +3 -3
  99. data/snapshot/lib/snapshot/detect_values.rb +15 -0
  100. data/snapshot/lib/snapshot/options.rb +31 -0
  101. data/snapshot/lib/snapshot/reports_generator.rb +8 -1
  102. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +3 -1
  103. data/snapshot/lib/snapshot/test_command_generator.rb +8 -3
  104. data/snapshot/lib/snapshot/test_command_generator_base.rb +7 -1
  105. data/spaceship/lib/spaceship/.DS_Store +0 -0
  106. data/spaceship/lib/spaceship/client.rb +9 -1
  107. data/spaceship/lib/spaceship/commands_generator.rb +1 -0
  108. data/spaceship/lib/spaceship/connect_api.rb +21 -2
  109. data/spaceship/lib/spaceship/connect_api/client.rb +47 -11
  110. data/spaceship/lib/spaceship/connect_api/model.rb +1 -1
  111. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +109 -0
  112. data/spaceship/lib/spaceship/connect_api/models/app.rb +113 -3
  113. data/spaceship/lib/spaceship/connect_api/models/app_category.rb +94 -0
  114. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +74 -0
  115. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +38 -0
  116. data/spaceship/lib/spaceship/connect_api/models/app_price.rb +22 -0
  117. data/spaceship/lib/spaceship/connect_api/models/app_price_tier.rb +12 -0
  118. data/spaceship/lib/spaceship/connect_api/models/app_review_attachment.rb +81 -0
  119. data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +117 -0
  120. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +101 -0
  121. data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +51 -0
  122. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +182 -0
  123. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +70 -0
  124. data/spaceship/lib/spaceship/connect_api/models/app_store_version_phased_release.rb +36 -0
  125. data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +26 -0
  126. data/spaceship/lib/spaceship/connect_api/models/build.rb +8 -0
  127. data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +40 -0
  128. data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +26 -0
  129. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +10 -3
  130. data/spaceship/lib/spaceship/connect_api/tunes/client.rb +33 -0
  131. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +703 -0
  132. data/spaceship/lib/spaceship/errors.rb +3 -0
  133. data/spaceship/lib/spaceship/spaceauth_runner.rb +2 -2
  134. data/supply/lib/supply/client.rb +19 -0
  135. data/supply/lib/supply/commands_generator.rb +1 -0
  136. data/supply/lib/supply/options.rb +9 -0
  137. data/supply/lib/supply/reader.rb +16 -0
  138. data/supply/lib/supply/uploader.rb +4 -0
  139. metadata +52 -47
  140. data/deliver/lib/deliver/upload_assets.rb +0 -27
  141. data/supply/lib/supply/.client.rb.swp +0 -0
@@ -1,23 +1,30 @@
1
1
  require_relative 'module'
2
+ require 'spaceship'
2
3
 
3
4
  module Deliver
4
5
  # Set the app's pricing
5
6
  class UploadPriceTier
6
7
  def upload(options)
7
8
  return unless options[:price_tier]
8
- app = options[:app]
9
9
 
10
- # just to be sure, the user might have passed an int (which is fine with us)
11
- options[:price_tier] = options[:price_tier].to_s
10
+ price_tier = options[:price_tier].to_s
12
11
 
13
- old_price = app.price_tier
14
- if options[:price_tier] == old_price
15
- UI.success("Price Tier unchanged (tier #{options[:price_tier]})")
12
+ legacy_app = options[:app]
13
+ app_id = legacy_app.apple_id
14
+ app = Spaceship::ConnectAPI::App.get(app_id: app_id)
15
+
16
+ app_prices = app.fetch_app_prices
17
+ if app_prices.first
18
+ old_price = app_prices.first.id
19
+ end
20
+
21
+ if price_tier == old_price
22
+ UI.success("Price Tier unchanged (tier #{old_price})")
16
23
  return
17
24
  end
18
25
 
19
- app.update_price_tier!(options[:price_tier])
20
- UI.success("Successfully updated the pricing from #{old_price} to #{options[:price_tier]}")
26
+ app.update_app_price_tier(app_price_tier_id: price_tier)
27
+ UI.success("Successfully updated the pricing from #{old_price} to #{price_tier}")
21
28
  end
22
29
  end
23
30
  end
@@ -11,69 +11,118 @@ module Deliver
11
11
  return if options[:skip_screenshots]
12
12
  return if options[:edit_live]
13
13
 
14
- app = options[:app]
14
+ legacy_app = options[:app]
15
+ app_id = legacy_app.apple_id
16
+ app = Spaceship::ConnectAPI::App.get(app_id: app_id)
15
17
 
16
- v = app.edit_version(platform: options[:platform])
17
- UI.user_error!("Could not find a version to edit for app '#{app.name}'") unless v
18
+ platform = Spaceship::ConnectAPI::Platform.map(options[:platform])
19
+ version = app.get_edit_app_store_version(platform: platform)
20
+ UI.user_error!("Could not find a version to edit for app '#{app.name}' for '#{platform}'") unless version
21
+
22
+ UI.important("Will begin uploading snapshots for '#{version.version_string}' on App Store Connect")
18
23
 
19
24
  UI.message("Starting with the upload of screenshots...")
20
25
  screenshots_per_language = screenshots.group_by(&:language)
21
26
 
27
+ localizations = version.get_app_store_version_localizations
28
+
22
29
  if options[:overwrite_screenshots]
23
- UI.message("Removing all previously uploaded screenshots...")
24
- # First, clear all previously uploaded screenshots
25
- screenshots_per_language.keys.each do |language|
26
- # We have to nil check for languages not activated
27
- next if v.screenshots[language].nil?
28
- v.screenshots[language].each_with_index do |t, index|
29
- v.upload_screenshot!(nil, t.sort_order, t.language, t.device_type, t.is_imessage)
30
+ # Get localizations on version
31
+ localizations.each do |localization|
32
+ # Only delete screenshots if trying to upload
33
+ next unless screenshots_per_language.keys.include?(localization.locale)
34
+
35
+ # Iterate over all screenshots for each set and delete
36
+ screenshot_sets = localization.get_app_screenshot_sets
37
+ screenshot_sets.each do |screenshot_set|
38
+ UI.message("Removing all previously uploaded screenshots for '#{localization.locale}' '#{screenshot_set.screenshot_display_type}'...")
39
+ screenshot_set.app_screenshots.each do |screenshot|
40
+ UI.verbose("Deleting screenshot - #{localization.locale} #{screenshot_set.screenshot_display_type} #{screenshot.id}")
41
+ screenshot.delete!
42
+ end
30
43
  end
31
44
  end
32
45
  end
33
46
 
34
- # Now, fill in the new ones
35
- indized = {} # per language and device type
47
+ # Finding languages to enable
48
+ languages = screenshots_per_language.keys
49
+ locales_to_enable = languages - localizations.map(&:locale)
36
50
 
37
- enabled_languages = screenshots_per_language.keys
38
- if enabled_languages.count > 0
39
- v.create_languages(enabled_languages)
51
+ if locales_to_enable.count > 0
40
52
  lng_text = "language"
41
- lng_text += "s" if enabled_languages.count != 1
42
- Helper.show_loading_indicator("Activating #{lng_text} #{enabled_languages.join(', ')}...")
43
- v.save!
44
- # This refreshes the app version from iTC after enabling a localization
45
- v = app.edit_version(platform: options[:platform])
53
+ lng_text += "s" if locales_to_enable.count != 1
54
+ Helper.show_loading_indicator("Activating #{lng_text} #{locales_to_enable.join(', ')}...")
55
+
56
+ locales_to_enable.each do |locale|
57
+ version.create_app_store_version_localization(attributes: {
58
+ locale: locale
59
+ })
60
+ end
61
+
46
62
  Helper.hide_loading_indicator
63
+
64
+ # Refresh version localizations
65
+ localizations = version.get_app_store_version_localizations
47
66
  end
48
67
 
68
+ # Upload screenshots
69
+ indized = {} # per language and device type
70
+
49
71
  screenshots_per_language.each do |language, screenshots_for_language|
72
+ # Find localization to upload screenshots to
73
+ localization = localizations.find do |l|
74
+ l.locale == language
75
+ end
76
+
77
+ unless localization
78
+ UI.error("Couldn't find localization on version for #{language}")
79
+ next
80
+ end
81
+
82
+ indized[localization.locale] ||= {}
83
+
84
+ # Create map to find screenshot set to add screenshot to
85
+ app_screenshot_sets_map = {}
86
+ app_screenshot_sets = localization.get_app_screenshot_sets
87
+ app_screenshot_sets.each do |app_screenshot_set|
88
+ app_screenshot_sets_map[app_screenshot_set.screenshot_display_type] = app_screenshot_set
89
+
90
+ # Set initial screnshot count
91
+ indized[localization.locale][app_screenshot_set.screenshot_display_type] ||= app_screenshot_set.app_screenshots.size
92
+ end
93
+
50
94
  UI.message("Uploading #{screenshots_for_language.length} screenshots for language #{language}")
51
95
  screenshots_for_language.each do |screenshot|
52
- indized[screenshot.language] ||= {}
53
- indized[screenshot.language][screenshot.formatted_name] ||= 0
54
- indized[screenshot.language][screenshot.formatted_name] += 1 # we actually start with 1... wtf iTC
96
+ display_type = screenshot.device_type
97
+ set = app_screenshot_sets_map[display_type]
55
98
 
56
- index = indized[screenshot.language][screenshot.formatted_name]
99
+ if display_type.nil?
100
+ UI.error("Error... Screenshot size #{screenshot.screen_size} not valid for App Store Connect")
101
+ next
102
+ end
57
103
 
58
- if index > 10
104
+ unless set
105
+ set = localization.create_app_screenshot_set(attributes: {
106
+ screenshotDisplayType: display_type
107
+ })
108
+ app_screenshot_sets_map[display_type] = set
109
+
110
+ indized[localization.locale][set.screenshot_display_type] = 0
111
+ end
112
+
113
+ index = indized[localization.locale][set.screenshot_display_type]
114
+
115
+ if index >= 10
59
116
  UI.error("Too many screenshots found for device '#{screenshot.formatted_name}' in '#{screenshot.language}', skipping this one (#{screenshot.path})")
60
117
  next
61
118
  end
62
119
 
120
+ indized[localization.locale][set.screenshot_display_type] += 1
121
+
122
+ # Also.. what is the messages type even for?
63
123
  UI.message("Uploading '#{screenshot.path}'...")
64
- v.upload_screenshot!(screenshot.path,
65
- index,
66
- screenshot.language,
67
- screenshot.device_type,
68
- screenshot.is_messages?)
124
+ set.upload_screenshot(path: screenshot.path)
69
125
  end
70
- # ideally we should only save once, but itunes server can't cope it seems
71
- # so we save per language. See issue #349
72
- Helper.show_loading_indicator("Saving changes")
73
- v.save!
74
- # Refresh app version to start clean again. See issue #9859
75
- v = app.edit_version
76
- Helper.hide_loading_indicator
77
126
  end
78
127
  UI.success("Successfully uploaded screenshots to App Store Connect")
79
128
  end
@@ -72,7 +72,7 @@
72
72
  <p id="footnote">
73
73
  This is a beta version and is not meant to share with the public.
74
74
  </p>
75
- <img src="https://s3-eu-west-1.amazonaws.com/fastlane.tools/fastlane_medium.png" id="fastlaneLogo" />
75
+ <img src="https://fastlane.tools/assets/img/fastlane_icon.png" id="fastlaneLogo" />
76
76
  </body>
77
77
 
78
78
  <script type='text/javascript'>
@@ -169,10 +169,6 @@ module Fastlane
169
169
 
170
170
  def self.details
171
171
  [
172
- "Crashlytics Beta has been deprecated and replaced with Firebase App Distribution.",
173
- "Beta will continue working until May 4, 2020.",
174
- "Check out the [Firebase App Distribution docs](https://github.com/fastlane/fastlane-plugin-firebase_app_distribution) to get started.",
175
- "",
176
172
  "Additionally, you can specify `notes`, `emails`, `groups` and `notifications`.",
177
173
  "Distributing to Groups: When using the `groups` parameter, it's important to use the group **alias** names for each group you'd like to distribute to. A group's alias can be found in the web UI. If you're viewing the Beta page, you can open the groups dialog by clicking the 'Manage Groups' button.",
178
174
  "This action uses the `submit` binary provided by the Crashlytics framework. If the binary is not found in its usual path, you'll need to specify the path manually by using the `crashlytics_path` option."
@@ -158,7 +158,7 @@ build_app(
158
158
  )
159
159
  ```
160
160
 
161
- **Note**: If you use [_fastlane_](https://fastlane.tools) with [_match_](https://fastlane.tools/match) you don't need to provide those values manually.
161
+ **Note**: If you use [_fastlane_](https://fastlane.tools) with [_match_](https://fastlane.tools/match) you don't need to provide those values manually, unless you pass a plist file into `export_options`
162
162
 
163
163
  For the list of available options run `xcodebuild -help`.
164
164
 
@@ -52,7 +52,25 @@ Ensure that the following permissions exist in your **src/debug/AndroidManifest.
52
52
 
53
53
  ##### Configuring your <a href="#ui-tests">UI Tests</a> for Screenshots
54
54
 
55
- 1. Add `@ClassRule public static final LocaleTestRule localeTestRule = new LocaleTestRule();` to your tests class to handle automatic switching of locales
55
+ 1. Add `LocaleTestRule` to your tests class to handle automatic switching of locales.
56
+ If you're using Java use:
57
+ ```java
58
+ @ClassRule
59
+ public static final LocaleTestRule localeTestRule = new LocaleTestRule();
60
+ ```
61
+ If you're using Kotlin use:
62
+ ```kotlin
63
+ @Rule @JvmField
64
+ val localeTestRule = LocaleTestRule()
65
+ ```
66
+ Important is the `@JvmField` annotation. It won't work like that:
67
+ ```kotlin
68
+ companion object {
69
+ @get:ClassRule
70
+ val localeTestRule = LocaleTestRule()
71
+ }
72
+ ```
73
+
56
74
  2. To capture screenshots, add the following to your tests `Screengrab.screenshot("name_of_screenshot_here");` on the appropriate screens
57
75
 
58
76
  # Generating Screenshots with Screengrab
@@ -137,6 +155,7 @@ fastlane action screengrab
137
155
  Check out [Testing UI for a Single App](http://developer.android.com/training/testing/ui-testing/espresso-testing.html) for an introduction to using Espresso for UI testing.
138
156
 
139
157
  ##### Example UI Test Class (Using JUnit4)
158
+ Java:
140
159
  ```java
141
160
  @RunWith(JUnit4.class)
142
161
  public class JUnit4StyleTests {
@@ -157,6 +176,28 @@ public class JUnit4StyleTests {
157
176
  }
158
177
 
159
178
  ```
179
+ Kotlin:
180
+ ```kotlin
181
+ @RunWith(JUnit4.class)
182
+ class JUnit4StyleTests {
183
+ @get:Rule
184
+ var activityRule = ActivityTestRule(MainActivity::class.java)
185
+
186
+ @Rule @JvmField
187
+ val localeTestRule = LocaleTestRule()
188
+
189
+ @Test
190
+ fun testTakeScreenshot() {
191
+ Screengrab.screenshot("before_button_click")
192
+
193
+ onView(withId(R.id.fab)).perform(click())
194
+
195
+ Screengrab.screenshot("after_button_click")
196
+ }
197
+ }
198
+
199
+ ```
200
+
160
201
  There is an [example project](https://github.com/fastlane/fastlane/tree/master/screengrab/example/src/androidTest/java/tools/fastlane/localetester) showing how to use use JUnit 3 or 4 and Espresso with the screengrab Java library to capture screenshots during a UI test run.
161
202
 
162
203
  Using JUnit 4 is preferable because of its ability to perform actions before and after the entire test class is run. This means you will change the device's locale far fewer times when compared with JUnit 3 running those commands before and after each test method.
@@ -290,4 +331,3 @@ Sit back and enjoy your new screenshots!
290
331
  Note: while this could also be done by creating a new build variant (i.e. debug, release and creating a new one called screengrab), [Android only allows one build type to be tested](http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing) which defaults to debug. That's why we use product flavors.
291
332
 
292
333
  </details>
293
-
@@ -364,7 +364,7 @@ snapshot(launch_arguments: ["SKIP_ANIMATIONS"])
364
364
  ```
365
365
 
366
366
  By default, _snapshot_ will wait for a short time for the animations to finish.
367
- If you're skipping the animations, this is wait time is unnecessary and can be skipped:
367
+ If you're skipping the animations, this wait time is unnecessary and can be skipped:
368
368
 
369
369
  ```swift
370
370
  setupSnapshot(app, waitForAnimations: false)
@@ -4,7 +4,7 @@
4
4
 
5
5
  ###### Easily sync your certificates and profiles across your team
6
6
 
7
- A new approach to iOS code signing: Share one code signing identity across your development team to simplify your codesigning setup and prevent code signing issues.
7
+ A new approach to iOS and macOS code signing: Share one code signing identity across your development team to simplify your codesigning setup and prevent code signing issues.
8
8
 
9
9
  _match_ is the implementation of the [codesigning.guide concept](https://codesigning.guide). _match_ creates all required certificates & provisioning profiles and stores them in a separate git repository, Google Cloud, or Amazon S3. Every team member with access to the selected storage can use those credentials for code signing. _match_ also automatically repairs broken and expired credentials. It's the easiest way to share signing credentials across teams
10
10
 
@@ -49,7 +49,7 @@ For more information about the concept, visit [codesigning.guide](https://codesi
49
49
 
50
50
  | | match |
51
51
  |----------|---------|
52
- 🔄 | Automatically sync your iOS keys and profiles across all your team members using git
52
+ 🔄 | Automatically sync your iOS and macOS keys and profiles across all your team members using git
53
53
  📦 | Handle all the heavy lifting of creating and storing your certificates and profiles
54
54
  💻 | Setup codesigning on a new machine in under a minute
55
55
  🎯 | Designed to work with apps with multiple targets and bundle identifiers
@@ -467,7 +467,7 @@ _deliver_ allows for metadata to be set through `.txt` files in the metadata fol
467
467
 
468
468
  Key | Editable While Live | Directory | Filename
469
469
  ----|--------|--------|--------
470
- <%- (Deliver::UploadMetadata::NON_LOCALISED_VERSION_VALUES + Deliver::UploadMetadata::NON_LOCALISED_APP_VALUES).each do |value| -%>
470
+ <%- (Deliver::UploadMetadata::NON_LOCALISED_VERSION_VALUES.keys + Deliver::UploadMetadata::NON_LOCALISED_APP_VALUES).each do |value| -%>
471
471
  `<%= value %>` | <%= Deliver::UploadMetadata::NON_LOCALISED_LIVE_VALUES.include?(value) ? 'Yes' : 'No' %> | `<metadata_path>` | `<%= value %>.txt`
472
472
  <%- end %>
473
473
 
@@ -475,23 +475,15 @@ Key | Editable While Live | Directory | Filename
475
475
 
476
476
  Key | Editable While Live | Directory | Filename
477
477
  ----|--------|--------|--------
478
- <%- (Deliver::UploadMetadata::LOCALISED_APP_VALUES + Deliver::UploadMetadata::LOCALISED_VERSION_VALUES).each do |value| -%>
478
+ <%- (Deliver::UploadMetadata::LOCALISED_APP_VALUES.keys + Deliver::UploadMetadata::LOCALISED_VERSION_VALUES.keys).each do |value| -%>
479
479
  `<%= value %>` | <%= Deliver::UploadMetadata::LOCALISED_LIVE_VALUES.include?(value) ? 'Yes' : 'No' %> | `<metadata_path>/<lang>/` | `<%= value %>.txt`
480
480
  <%- end %>
481
481
 
482
- ### Trade Representative Contact Information Metadata
483
-
484
- Key | Editable While Live | Directory | Filename
485
- ----|--------|--------|--------
486
- <%- Deliver::UploadMetadata::TRADE_REPRESENTATIVE_CONTACT_INFORMATION_VALUES.each do |key, value| -%>
487
- `<%= value %>` | Yes | `<metadata_path>/<%= Deliver::UploadMetadata::TRADE_REPRESENTATIVE_CONTACT_INFORMATION_DIR %>` | `<%= value %>.txt`
488
- <%- end %>
489
-
490
482
  ### Review Information Metadata
491
483
 
492
484
  Key | Editable While Live | Directory | Filename
493
485
  ----|--------|--------|--------
494
- <%- Deliver::UploadMetadata::REVIEW_INFORMATION_VALUES.each do |key, value| -%>
486
+ <%- Deliver::UploadMetadata::REVIEW_INFORMATION_VALUES_LEGACY.each do |key, value| -%>
495
487
  `<%= value %>` | Yes | `<metadata_path>/<%= Deliver::UploadMetadata::REVIEW_INFORMATION_DIR %>` | `<%= value %>.txt`
496
488
  <%- end %>
497
489
 
@@ -78,6 +78,12 @@ To gradually roll out a new build use
78
78
  fastlane supply --apk path/app.apk --track beta --rollout 0.5
79
79
  ```
80
80
 
81
+ To set the in-app update priority level for a release, set a valid update priority (an integer value from 0 to 5) using option `in_app_update_priority`
82
+
83
+ ```no-highlight
84
+ fastlane supply --apk path/app.apk --track beta --in_app_update_priority 3
85
+ ```
86
+
81
87
  ### Expansion files (`.obb`)
82
88
 
83
89
  Expansion files (obbs) found under the same directory as your APK will also be uploaded together with your APK as long as:
@@ -113,6 +119,12 @@ To gradually roll out a new build use
113
119
  fastlane supply --aab path/app.aab --track beta --rollout 0.5
114
120
  ```
115
121
 
122
+ To set the in-app update priority level for a release, set a valid update priority (an integer value from 0 to 5) using option `in_app_update_priority`
123
+
124
+ ```no-highlight
125
+ fastlane supply --aab path/app.aab --track beta --in_app_update_priority 3
126
+ ```
127
+
116
128
  ## Images and Screenshots
117
129
 
118
130
  After running `fastlane supply init`, you will have a metadata directory. This directory contains one or more locale directories (e.g. en-US, en-GB, etc.), and inside this directory are text files such as `title.txt` and `short_description.txt`.
@@ -159,9 +171,10 @@ A common Play publishing scenario might involve uploading an APK version to a te
159
171
 
160
172
  This can be done using the `--track_promote_to` parameter. The `--track_promote_to` parameter works with the `--track` parameter to command the Play API to promote existing Play track APK version(s) (those active on the track identified by the `--track` param value) to a new track (`--track_promote_to` value).
161
173
 
162
- ## Retrieve Track Version Codes
174
+ ## Retrieve Track Release Names & Version Codes
163
175
 
164
- Before performing a new APK upload you may want to check existing track version codes, or you may simply want to provide an informational lane that displays the currently promoted version codes for the production track. You can use the `google_play_track_version_codes` action to retrieve existing version codes for a package and track. For more information, see `fastlane action google_play_track_version_codes` help output.
176
+ Before performing a new APK upload you may want to check existing track version codes or release names, or you may simply want to provide an informational lane that displays the currently promoted version codes or release name for the production track. You can use the `google_play_track_version_codes` action to retrieve existing version codes for a package and track. You can use the `google_play_track_release_names` action to retrieve existing release names for a package and track.
177
+ For more information, see the `fastlane action google_play_track_version_codes` and `fastlane action google_play_track_release_names` help output.
165
178
 
166
179
  ## Migration from AndroidPublisherV2 to AndroidPublisherV3 in _fastlane_ 2.135.0
167
180
 
@@ -164,7 +164,13 @@ module Fastlane
164
164
 
165
165
  def self.download_file(url)
166
166
  uri = URI.parse(url)
167
- http = Net::HTTP.new(uri.host, uri.port)
167
+ if ENV['http_proxy']
168
+ UI.verbose("Found 'http_proxy' environment variable so connect via proxy")
169
+ proxy_uri = URI.parse(ENV['http_proxy'])
170
+ http = Net::HTTP.new(uri.host, uri.port, proxy_uri.host, proxy_uri.port)
171
+ else
172
+ http = Net::HTTP.new(uri.host, uri.port)
173
+ end
168
174
  http.use_ssl = (uri.scheme == "https")
169
175
  res = http.get(uri.request_uri)
170
176
  res.body
@@ -26,7 +26,7 @@ module Fastlane
26
26
  # Login
27
27
  credentials = JSON.parse(json_key_data)
28
28
  callback_uri = 'https://fastlane.github.io/managed_google_play-callback/callback.html'
29
- uri = "https://play.google.com/apps/publish/delegatePrivateApp?service_account=#{credentials['client_email']}&continueUrl=#{URI.escape(callback_uri)}"
29
+ uri = "https://play.google.com/apps/publish/delegatePrivateApp?service_account=#{credentials['client_email']}&continueUrl=#{URI.encode_www_form_component(callback_uri)}"
30
30
 
31
31
  UI.message("To obtain publishing rights for custom apps on Managed Play Store, open the following URL and log in:")
32
32
  UI.message("")
@@ -0,0 +1,74 @@
1
+ module Fastlane
2
+ module Actions
3
+ class GooglePlayTrackReleaseNamesAction < Action
4
+ # Supply::Options.available_options keys that apply to this action.
5
+ OPTIONS = [
6
+ :package_name,
7
+ :track,
8
+ :key,
9
+ :issuer,
10
+ :json_key,
11
+ :json_key_data,
12
+ :root_url,
13
+ :timeout
14
+ ]
15
+
16
+ def self.run(params)
17
+ require 'supply'
18
+ require 'supply/options'
19
+ require 'supply/reader'
20
+
21
+ Supply.config = params
22
+
23
+ release_names = Supply::Reader.new.track_release_names || []
24
+ return release_names.compact
25
+ end
26
+
27
+ #####################################################
28
+ # @!group Documentation
29
+ #####################################################
30
+
31
+ def self.description
32
+ "Retrieves release names for a Google Play track"
33
+ end
34
+
35
+ def self.details
36
+ "More information: [https://docs.fastlane.tools/actions/supply/](https://docs.fastlane.tools/actions/supply/)"
37
+ end
38
+
39
+ def self.available_options
40
+ require 'supply'
41
+ require 'supply/options'
42
+
43
+ Supply::Options.available_options.select do |option|
44
+ OPTIONS.include?(option.key)
45
+ end
46
+ end
47
+
48
+ def self.output
49
+ end
50
+
51
+ def self.return_value
52
+ "Array of strings representing the release names for the given Google Play track"
53
+ end
54
+
55
+ def self.authors
56
+ ["raldred"]
57
+ end
58
+
59
+ def self.is_supported?(platform)
60
+ platform == :android
61
+ end
62
+
63
+ def self.example_code
64
+ [
65
+ 'google_play_track_release_names'
66
+ ]
67
+ end
68
+
69
+ def self.category
70
+ :misc
71
+ end
72
+ end
73
+ end
74
+ end