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.
- checksums.yaml +4 -4
- data/README.md +82 -82
- data/cert/lib/cert/commands_generator.rb +1 -0
- data/credentials_manager/lib/credentials_manager/cli.rb +2 -0
- data/deliver/lib/deliver.rb +0 -1
- data/deliver/lib/deliver/app_screenshot.rb +28 -27
- data/deliver/lib/deliver/commands_generator.rb +1 -0
- data/deliver/lib/deliver/html_generator.rb +2 -2
- data/deliver/lib/deliver/options.rb +6 -11
- data/deliver/lib/deliver/runner.rb +7 -4
- data/deliver/lib/deliver/setup.rb +5 -30
- data/deliver/lib/deliver/submit_for_review.rb +124 -83
- data/deliver/lib/deliver/upload_metadata.rb +284 -143
- data/deliver/lib/deliver/upload_price_tier.rb +15 -8
- data/deliver/lib/deliver/upload_screenshots.rb +86 -37
- data/fastlane/lib/assets/s3_html_template.erb +1 -1
- data/fastlane/lib/fastlane/actions/crashlytics.rb +0 -4
- data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -1
- data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +42 -2
- data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +1 -1
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +2 -2
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +3 -11
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +15 -2
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +7 -1
- data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +1 -1
- data/fastlane/lib/fastlane/actions/google_play_track_release_names.rb +74 -0
- data/fastlane/lib/fastlane/actions/hipchat.rb +1 -1
- data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +1 -1
- data/fastlane/lib/fastlane/actions/slack.rb +2 -2
- data/fastlane/lib/fastlane/actions/slather.rb +8 -1
- data/fastlane/lib/fastlane/actions/spm.rb +7 -0
- data/fastlane/lib/fastlane/actions/swiftlint.rb +14 -0
- data/fastlane/lib/fastlane/actions/sync_code_signing.rb +1 -1
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +3 -34
- data/fastlane/lib/fastlane/actions/xcodebuild.rb +4 -4
- data/fastlane/lib/fastlane/cli_tools_distributor.rb +28 -6
- data/fastlane/lib/fastlane/commands_generator.rb +1 -1
- data/fastlane/lib/fastlane/documentation/actions_list.rb +1 -1
- data/fastlane/lib/fastlane/lane.rb +3 -3
- data/fastlane/lib/fastlane/lane_manager.rb +0 -10
- data/fastlane/lib/fastlane/plugins/plugin_manager.rb +3 -3
- data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +29 -0
- data/fastlane/lib/fastlane/swift_fastlane_function.rb +22 -5
- data/fastlane/lib/fastlane/swift_lane_manager.rb +0 -8
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/ControlCommand.swift +1 -0
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +140 -30
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +3 -9
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +5 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/RubyCommand.swift +29 -6
- data/fastlane/swift/RubyCommandable.swift +1 -0
- data/fastlane/swift/Runner.swift +85 -13
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +10 -2
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +17 -1
- data/fastlane/swift/SocketClient.swift +76 -45
- data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
- data/fastlane/swift/SocketResponse.swift +1 -0
- data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +1 -3
- data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +7 -0
- data/frameit/lib/frameit/commands_generator.rb +1 -0
- data/frameit/lib/frameit/device_types.rb +100 -100
- data/gym/lib/gym/generators/package_command_generator.rb +4 -0
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +4 -0
- data/gym/lib/gym/options.rb +1 -1
- data/gym/lib/gym/runner.rb +14 -0
- data/match/lib/match/commands_generator.rb +1 -0
- data/match/lib/match/generator.rb +2 -1
- data/match/lib/match/nuke.rb +21 -16
- data/match/lib/match/options.rb +18 -1
- data/match/lib/match/storage/git_storage.rb +4 -0
- data/match/lib/match/storage/google_cloud_storage.rb +4 -0
- data/match/lib/match/storage/interface.rb +4 -0
- data/match/lib/match/storage/s3_storage.rb +4 -0
- data/pem/lib/pem/commands_generator.rb +1 -0
- data/pilot/lib/pilot/build_manager.rb +23 -7
- data/pilot/lib/pilot/options.rb +5 -0
- data/produce/lib/produce/commands_generator.rb +1 -0
- data/produce/lib/produce/itunes_connect.rb +20 -20
- data/produce/lib/produce/options.rb +3 -3
- data/scan/lib/scan/detect_values.rb +3 -0
- data/scan/lib/scan/options.rb +20 -2
- data/scan/lib/scan/test_command_generator.rb +6 -1
- data/scan/lib/scan/test_result_parser.rb +9 -2
- data/screengrab/lib/screengrab/runner.rb +10 -9
- data/sigh/lib/assets/resign.sh +7 -7
- data/sigh/lib/sigh/commands_generator.rb +1 -0
- data/sigh/lib/sigh/options.rb +7 -1
- data/sigh/lib/sigh/runner.rb +2 -1
- data/snapshot/lib/assets/SnapshotHelper.swift +16 -37
- data/snapshot/lib/assets/SnapshotHelperXcode8.swift +3 -3
- data/snapshot/lib/snapshot/detect_values.rb +15 -0
- data/snapshot/lib/snapshot/options.rb +31 -0
- data/snapshot/lib/snapshot/reports_generator.rb +8 -1
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +3 -1
- data/snapshot/lib/snapshot/test_command_generator.rb +8 -3
- data/snapshot/lib/snapshot/test_command_generator_base.rb +7 -1
- data/spaceship/lib/spaceship/.DS_Store +0 -0
- data/spaceship/lib/spaceship/client.rb +9 -1
- data/spaceship/lib/spaceship/commands_generator.rb +1 -0
- data/spaceship/lib/spaceship/connect_api.rb +21 -2
- data/spaceship/lib/spaceship/connect_api/client.rb +47 -11
- data/spaceship/lib/spaceship/connect_api/model.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +109 -0
- data/spaceship/lib/spaceship/connect_api/models/app.rb +113 -3
- data/spaceship/lib/spaceship/connect_api/models/app_category.rb +94 -0
- data/spaceship/lib/spaceship/connect_api/models/app_info.rb +74 -0
- data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +38 -0
- data/spaceship/lib/spaceship/connect_api/models/app_price.rb +22 -0
- data/spaceship/lib/spaceship/connect_api/models/app_price_tier.rb +12 -0
- data/spaceship/lib/spaceship/connect_api/models/app_review_attachment.rb +81 -0
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +117 -0
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +101 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +51 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +182 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +70 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_phased_release.rb +36 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/build.rb +8 -0
- data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +40 -0
- data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +10 -3
- data/spaceship/lib/spaceship/connect_api/tunes/client.rb +33 -0
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +703 -0
- data/spaceship/lib/spaceship/errors.rb +3 -0
- data/spaceship/lib/spaceship/spaceauth_runner.rb +2 -2
- data/supply/lib/supply/client.rb +19 -0
- data/supply/lib/supply/commands_generator.rb +1 -0
- data/supply/lib/supply/options.rb +9 -0
- data/supply/lib/supply/reader.rb +16 -0
- data/supply/lib/supply/uploader.rb +4 -0
- metadata +52 -47
- data/deliver/lib/deliver/upload_assets.rb +0 -27
- 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
|
-
|
11
|
-
options[:price_tier] = options[:price_tier].to_s
|
10
|
+
price_tier = options[:price_tier].to_s
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
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.
|
20
|
-
UI.success("Successfully updated the pricing from #{old_price} to #{
|
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
|
-
|
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
|
-
|
17
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
#
|
35
|
-
|
47
|
+
# Finding languages to enable
|
48
|
+
languages = screenshots_per_language.keys
|
49
|
+
locales_to_enable = languages - localizations.map(&:locale)
|
36
50
|
|
37
|
-
|
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
|
42
|
-
Helper.show_loading_indicator("Activating #{lng_text} #{
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
53
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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://
|
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
|
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
|
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::
|
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.
|
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
|
-
|
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.
|
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
|