fastlane 2.234.0 → 2.236.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.
- checksums.yaml +4 -4
- data/README.md +102 -102
- data/bin/fastlane +2 -2
- data/deliver/lib/deliver/app_clip_header_image.rb +18 -0
- data/deliver/lib/deliver/commands_generator.rb +17 -0
- data/deliver/lib/deliver/download_app_clip_header_images.rb +64 -0
- data/deliver/lib/deliver/languages.rb +36 -3
- data/deliver/lib/deliver/loader.rb +41 -0
- data/deliver/lib/deliver/options.rb +23 -0
- data/deliver/lib/deliver/runner.rb +8 -0
- data/deliver/lib/deliver/upload_app_clip_default_experience_header_images.rb +188 -0
- data/deliver/lib/deliver/upload_app_clip_default_experience_metadata.rb +229 -0
- data/deliver/lib/deliver/upload_metadata.rb +71 -7
- data/deliver/lib/deliver/upload_screenshots.rb +1 -1
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +100 -0
- data/fastlane/lib/fastlane/actions/get_version_number.rb +2 -12
- data/fastlane/lib/fastlane/actions/increment_version_number.rb +29 -1
- data/fastlane/lib/fastlane/actions/ipa.rb +2 -2
- data/fastlane/lib/fastlane/actions/notarize.rb +1 -148
- data/fastlane/lib/fastlane/actions/slack.rb +9 -3
- data/fastlane/lib/fastlane/actions/testfairy.rb +1 -3
- data/fastlane/lib/fastlane/actions/update_app_age_rating.rb +210 -0
- data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +4 -2
- data/fastlane/lib/fastlane/helper/xcodeproj_helper.rb +155 -0
- data/fastlane/lib/fastlane/notification/slack.rb +9 -4
- data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +36 -1
- data/fastlane/swift/Fastlane.swift +146 -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 +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +8 -1
- data/fastlane_core/lib/fastlane_core/command_executor.rb +13 -5
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +8 -2
- data/frameit/lib/frameit/offsets.rb +3 -2
- data/internal/README.md +11 -0
- data/match/lib/match/nuke.rb +2 -2
- data/pilot/lib/pilot/build_manager.rb +69 -2
- data/pilot/lib/pilot/options.rb +23 -0
- data/screengrab/lib/screengrab/reports_generator.rb +2 -2
- data/screengrab/lib/screengrab/runner.rb +14 -15
- data/sigh/lib/sigh/resign.rb +2 -2
- data/snapshot/lib/snapshot/options.rb +5 -0
- data/snapshot/lib/snapshot/reports_generator.rb +2 -2
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +9 -9
- data/snapshot/lib/snapshot/test_command_generator.rb +8 -6
- data/snapshot/lib/snapshot/test_command_generator_base.rb +4 -0
- data/spaceship/lib/spaceship/commands_generator.rb +9 -2
- data/spaceship/lib/spaceship/connect_api/models/app.rb +14 -1
- data/spaceship/lib/spaceship/connect_api/models/app_clip.rb +18 -0
- data/spaceship/lib/spaceship/connect_api/models/app_clip_app_store_review_detail.rb +34 -0
- data/spaceship/lib/spaceship/connect_api/models/app_clip_default_experience.rb +43 -0
- data/spaceship/lib/spaceship/connect_api/models/app_clip_default_experience_localization.rb +49 -0
- data/spaceship/lib/spaceship/connect_api/models/app_clip_header_image.rb +159 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +5 -1
- data/spaceship/lib/spaceship/connect_api/models/beta_app_clip_invocation.rb +44 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_app_clip_invocation_localization.rb +35 -0
- data/spaceship/lib/spaceship/connect_api/models/build_bundle.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +291 -0
- data/spaceship/lib/spaceship/connect_api.rb +7 -0
- data/spaceship/lib/spaceship/portal/portal_client.rb +1 -1
- data/spaceship/lib/spaceship/two_step_or_factor_client.rb +2 -1
- data/supply/lib/supply/client.rb +14 -19
- data/supply/lib/supply/reader.rb +16 -0
- data/supply/lib/supply/uploader.rb +1 -1
- metadata +60 -33
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f129a659ef224d3a5367a5b69ff6a05e5bb9bf18f4034b8494a891804592438d
|
|
4
|
+
data.tar.gz: dca0b340e8cb13eac6472054edc5750cbdbe572b21180fda9c22c84f4cb8da44
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b24b41096b6ca155d1056a9d9ce9aed33ecd0e9eacc42ad03584fa5a341132a01c0f36e90087b7cfb78c4540e0412098285c06dbb08de3c1c8daf595d8181a29
|
|
7
|
+
data.tar.gz: 3c46b2adb30f65d2649c1ee4510d7f08e612b3fe9ff4c880f587edca2c0e82c1f840b508836ce72ee504bc36adedc9f5391d11bd2c5a548f1a145fe5ca637d7d
|
data/README.md
CHANGED
|
@@ -36,17 +36,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
|
36
36
|
<!-- This table is regenerated and resorted on each release -->
|
|
37
37
|
<table id='team'>
|
|
38
38
|
<tr>
|
|
39
|
-
<td id='
|
|
40
|
-
<a href='https://github.com/
|
|
41
|
-
<img src='https://github.com/
|
|
39
|
+
<td id='fumiya-nakamura'>
|
|
40
|
+
<a href='https://github.com/nafu'>
|
|
41
|
+
<img src='https://github.com/nafu.png' width='140px;'>
|
|
42
42
|
</a>
|
|
43
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
43
|
+
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
|
44
44
|
</td>
|
|
45
|
-
<td id='
|
|
46
|
-
<a href='https://github.com/
|
|
47
|
-
<img src='https://github.com/
|
|
45
|
+
<td id='iulian-onofrei'>
|
|
46
|
+
<a href='https://github.com/revolter'>
|
|
47
|
+
<img src='https://github.com/revolter.png' width='140px;'>
|
|
48
48
|
</a>
|
|
49
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
49
|
+
<h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
|
|
50
|
+
</td>
|
|
51
|
+
<td id='helmut-januschka'>
|
|
52
|
+
<a href='https://github.com/hjanuschka'>
|
|
53
|
+
<img src='https://github.com/hjanuschka.png' width='140px;'>
|
|
54
|
+
</a>
|
|
55
|
+
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
|
50
56
|
</td>
|
|
51
57
|
<td id='josh-holtz'>
|
|
52
58
|
<a href='https://github.com/joshdholtz'>
|
|
@@ -54,37 +60,19 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
|
54
60
|
</a>
|
|
55
61
|
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
|
|
56
62
|
</td>
|
|
57
|
-
<td id='
|
|
58
|
-
<a href='https://github.com/
|
|
59
|
-
<img src='https://github.com/
|
|
60
|
-
</a>
|
|
61
|
-
<h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
|
|
62
|
-
</td>
|
|
63
|
-
<td id='jérôme-lacoste'>
|
|
64
|
-
<a href='https://github.com/lacostej'>
|
|
65
|
-
<img src='https://github.com/lacostej.png' width='140px;'>
|
|
63
|
+
<td id='connor-tumbleson'>
|
|
64
|
+
<a href='https://github.com/ibotpeaches'>
|
|
65
|
+
<img src='https://github.com/ibotpeaches.png' width='140px;'>
|
|
66
66
|
</a>
|
|
67
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
67
|
+
<h4 align='center'><a href='https://twitter.com/ibotpeaches'>Connor Tumbleson</a></h4>
|
|
68
68
|
</td>
|
|
69
69
|
</tr>
|
|
70
70
|
<tr>
|
|
71
|
-
<td id='
|
|
72
|
-
<a href='https://github.com/
|
|
73
|
-
<img src='https://github.com/
|
|
74
|
-
</a>
|
|
75
|
-
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
|
76
|
-
</td>
|
|
77
|
-
<td id='maksym-grebenets'>
|
|
78
|
-
<a href='https://github.com/mgrebenets'>
|
|
79
|
-
<img src='https://github.com/mgrebenets.png' width='140px;'>
|
|
80
|
-
</a>
|
|
81
|
-
<h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
|
|
82
|
-
</td>
|
|
83
|
-
<td id='olivier-halligon'>
|
|
84
|
-
<a href='https://github.com/AliSoftware'>
|
|
85
|
-
<img src='https://github.com/AliSoftware.png' width='140px;'>
|
|
71
|
+
<td id='aaron-brager'>
|
|
72
|
+
<a href='https://github.com/getaaron'>
|
|
73
|
+
<img src='https://github.com/getaaron.png' width='140px;'>
|
|
86
74
|
</a>
|
|
87
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
75
|
+
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
|
88
76
|
</td>
|
|
89
77
|
<td id='matthew-ellis'>
|
|
90
78
|
<a href='https://github.com/matthewellis'>
|
|
@@ -92,63 +80,81 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
|
92
80
|
</a>
|
|
93
81
|
<h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
|
|
94
82
|
</td>
|
|
95
|
-
<td id='
|
|
96
|
-
<a href='https://github.com/
|
|
97
|
-
<img src='https://github.com/
|
|
83
|
+
<td id='danielle-tomlinson'>
|
|
84
|
+
<a href='https://github.com/endocrimes'>
|
|
85
|
+
<img src='https://github.com/endocrimes.png' width='140px;'>
|
|
98
86
|
</a>
|
|
99
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
87
|
+
<h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
|
|
88
|
+
</td>
|
|
89
|
+
<td id='andrew-mcburney'>
|
|
90
|
+
<a href='https://github.com/armcburney'>
|
|
91
|
+
<img src='https://github.com/armcburney.png' width='140px;'>
|
|
92
|
+
</a>
|
|
93
|
+
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
|
94
|
+
</td>
|
|
95
|
+
<td id='olivier-halligon'>
|
|
96
|
+
<a href='https://github.com/AliSoftware'>
|
|
97
|
+
<img src='https://github.com/AliSoftware.png' width='140px;'>
|
|
98
|
+
</a>
|
|
99
|
+
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
|
100
100
|
</td>
|
|
101
101
|
</tr>
|
|
102
102
|
<tr>
|
|
103
|
-
<td id='
|
|
104
|
-
<a href='https://github.com/
|
|
105
|
-
<img src='https://github.com/
|
|
103
|
+
<td id='kohki-miki'>
|
|
104
|
+
<a href='https://github.com/giginet'>
|
|
105
|
+
<img src='https://github.com/giginet.png' width='140px;'>
|
|
106
106
|
</a>
|
|
107
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
107
|
+
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
|
108
108
|
</td>
|
|
109
|
-
<td id='
|
|
110
|
-
<a href='https://github.com/
|
|
111
|
-
<img src='https://github.com/
|
|
109
|
+
<td id='roger-oba'>
|
|
110
|
+
<a href='https://github.com/rogerluan'>
|
|
111
|
+
<img src='https://github.com/rogerluan.png' width='140px;'>
|
|
112
112
|
</a>
|
|
113
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
113
|
+
<h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
|
|
114
114
|
</td>
|
|
115
|
-
<td id='
|
|
116
|
-
<a href='https://github.com/
|
|
117
|
-
<img src='https://github.com/
|
|
115
|
+
<td id='joshua-liebowitz'>
|
|
116
|
+
<a href='https://github.com/taquitos'>
|
|
117
|
+
<img src='https://github.com/taquitos.png' width='140px;'>
|
|
118
118
|
</a>
|
|
119
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
119
|
+
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
|
120
120
|
</td>
|
|
121
|
-
<td id='
|
|
122
|
-
<a href='https://github.com/
|
|
123
|
-
<img src='https://github.com/
|
|
121
|
+
<td id='manish-rathi'>
|
|
122
|
+
<a href='https://github.com/crazymanish'>
|
|
123
|
+
<img src='https://github.com/crazymanish.png' width='140px;'>
|
|
124
124
|
</a>
|
|
125
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
125
|
+
<h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
|
|
126
126
|
</td>
|
|
127
|
+
<td id='jimmy-dee'>
|
|
128
|
+
<a href='https://github.com/jdee'>
|
|
129
|
+
<img src='https://github.com/jdee.png' width='140px;'>
|
|
130
|
+
</a>
|
|
131
|
+
<h4 align='center'>Jimmy Dee</h4>
|
|
132
|
+
</td>
|
|
133
|
+
</tr>
|
|
134
|
+
<tr>
|
|
127
135
|
<td id='luka-mirosevic'>
|
|
128
136
|
<a href='https://github.com/lmirosevic'>
|
|
129
137
|
<img src='https://github.com/lmirosevic.png' width='140px;'>
|
|
130
138
|
</a>
|
|
131
139
|
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
|
132
140
|
</td>
|
|
133
|
-
|
|
134
|
-
<
|
|
135
|
-
<
|
|
136
|
-
<a href='https://github.com/nafu'>
|
|
137
|
-
<img src='https://github.com/nafu.png' width='140px;'>
|
|
141
|
+
<td id='jorge-revuelta-h'>
|
|
142
|
+
<a href='https://github.com/minuscorp'>
|
|
143
|
+
<img src='https://github.com/minuscorp.png' width='140px;'>
|
|
138
144
|
</a>
|
|
139
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
145
|
+
<h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
|
|
140
146
|
</td>
|
|
141
|
-
<td id='
|
|
142
|
-
<a href='https://github.com/
|
|
143
|
-
<img src='https://github.com/
|
|
147
|
+
<td id='manu-wallner'>
|
|
148
|
+
<a href='https://github.com/milch'>
|
|
149
|
+
<img src='https://github.com/milch.png' width='140px;'>
|
|
144
150
|
</a>
|
|
145
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
151
|
+
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
|
146
152
|
</td>
|
|
147
|
-
<td id='
|
|
148
|
-
<a href='https://github.com/
|
|
149
|
-
<img src='https://github.com/
|
|
153
|
+
<td id='łukasz-grabowski'>
|
|
154
|
+
<a href='https://github.com/lucgrabowski'>
|
|
155
|
+
<img src='https://github.com/lucgrabowski.png' width='140px;'>
|
|
150
156
|
</a>
|
|
151
|
-
<h4 align='center'
|
|
157
|
+
<h4 align='center'>Łukasz Grabowski</h4>
|
|
152
158
|
</td>
|
|
153
159
|
<td id='stefan-natchev'>
|
|
154
160
|
<a href='https://github.com/snatchev'>
|
|
@@ -156,57 +162,51 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
|
156
162
|
</a>
|
|
157
163
|
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
|
158
164
|
</td>
|
|
159
|
-
<td id='aaron-brager'>
|
|
160
|
-
<a href='https://github.com/getaaron'>
|
|
161
|
-
<img src='https://github.com/getaaron.png' width='140px;'>
|
|
162
|
-
</a>
|
|
163
|
-
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
|
164
|
-
</td>
|
|
165
165
|
</tr>
|
|
166
166
|
<tr>
|
|
167
|
-
<td id='
|
|
168
|
-
<a href='https://github.com/
|
|
169
|
-
<img src='https://github.com/
|
|
167
|
+
<td id='maksym-grebenets'>
|
|
168
|
+
<a href='https://github.com/mgrebenets'>
|
|
169
|
+
<img src='https://github.com/mgrebenets.png' width='140px;'>
|
|
170
170
|
</a>
|
|
171
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
171
|
+
<h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
|
|
172
172
|
</td>
|
|
173
|
-
<td id='
|
|
174
|
-
<a href='https://github.com/
|
|
175
|
-
<img src='https://github.com/
|
|
173
|
+
<td id='satoshi-namai'>
|
|
174
|
+
<a href='https://github.com/ainame'>
|
|
175
|
+
<img src='https://github.com/ainame.png' width='140px;'>
|
|
176
176
|
</a>
|
|
177
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
177
|
+
<h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
|
|
178
178
|
</td>
|
|
179
|
-
<td id='
|
|
180
|
-
<a href='https://github.com/
|
|
181
|
-
<img src='https://github.com/
|
|
179
|
+
<td id='felix-krause'>
|
|
180
|
+
<a href='https://github.com/KrauseFx'>
|
|
181
|
+
<img src='https://github.com/KrauseFx.png' width='140px;'>
|
|
182
182
|
</a>
|
|
183
|
-
<h4 align='center'
|
|
183
|
+
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
|
|
184
184
|
</td>
|
|
185
|
-
<td id='
|
|
186
|
-
<a href='https://github.com/
|
|
187
|
-
<img src='https://github.com/
|
|
185
|
+
<td id='max-ott'>
|
|
186
|
+
<a href='https://github.com/max-ott'>
|
|
187
|
+
<img src='https://github.com/max-ott.png' width='140px;'>
|
|
188
188
|
</a>
|
|
189
|
-
<h4 align='center'>
|
|
189
|
+
<h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
|
|
190
190
|
</td>
|
|
191
|
-
<td id='
|
|
192
|
-
<a href='https://github.com/
|
|
193
|
-
<img src='https://github.com/
|
|
191
|
+
<td id='daniel-jankowski'>
|
|
192
|
+
<a href='https://github.com/mollyIV'>
|
|
193
|
+
<img src='https://github.com/mollyIV.png' width='140px;'>
|
|
194
194
|
</a>
|
|
195
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
195
|
+
<h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
|
|
196
196
|
</td>
|
|
197
197
|
</tr>
|
|
198
198
|
<tr>
|
|
199
|
-
<td id='
|
|
200
|
-
<a href='https://github.com/
|
|
201
|
-
<img src='https://github.com/
|
|
199
|
+
<td id='jérôme-lacoste'>
|
|
200
|
+
<a href='https://github.com/lacostej'>
|
|
201
|
+
<img src='https://github.com/lacostej.png' width='140px;'>
|
|
202
202
|
</a>
|
|
203
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
203
|
+
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
|
204
204
|
</td>
|
|
205
|
-
<td id='
|
|
206
|
-
<a href='https://github.com/
|
|
207
|
-
<img src='https://github.com/
|
|
205
|
+
<td id='jan-piotrowski'>
|
|
206
|
+
<a href='https://github.com/janpio'>
|
|
207
|
+
<img src='https://github.com/janpio.png' width='140px;'>
|
|
208
208
|
</a>
|
|
209
|
-
<h4 align='center'><a href='https://twitter.com/
|
|
209
|
+
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
|
210
210
|
</td>
|
|
211
211
|
</table>
|
|
212
212
|
|
data/bin/fastlane
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'fastimage'
|
|
2
|
+
|
|
3
|
+
require_relative 'module'
|
|
4
|
+
|
|
5
|
+
module Deliver
|
|
6
|
+
# AppClipHeaderImage represents one app clip header image for one specific locale.
|
|
7
|
+
class AppClipHeaderImage
|
|
8
|
+
attr_accessor :path
|
|
9
|
+
attr_accessor :language
|
|
10
|
+
|
|
11
|
+
# @param path (String) path to the app clip header image file
|
|
12
|
+
# @param language (String) Language of this app clip header image (e.g. en-US)
|
|
13
|
+
def initialize(path, language)
|
|
14
|
+
self.path = path
|
|
15
|
+
self.language = language
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -3,6 +3,7 @@ require 'fastlane/version'
|
|
|
3
3
|
require 'fastlane_core/ui/help_formatter'
|
|
4
4
|
|
|
5
5
|
require_relative 'download_screenshots'
|
|
6
|
+
require_relative 'download_app_clip_header_images'
|
|
6
7
|
require_relative 'options'
|
|
7
8
|
require_relative 'module'
|
|
8
9
|
require_relative 'generate_summary'
|
|
@@ -152,6 +153,22 @@ module Deliver
|
|
|
152
153
|
end
|
|
153
154
|
end
|
|
154
155
|
|
|
156
|
+
command :download_app_clip_header_images do |c|
|
|
157
|
+
c.syntax = 'fastlane deliver download_app_clip_header_images'
|
|
158
|
+
c.description = "Downloads all existing app clip header images from App Store Connect and stores them in the app_clip_header_images folder"
|
|
159
|
+
|
|
160
|
+
FastlaneCore::CommanderGenerator.new.generate(deliverfile_options, command: c)
|
|
161
|
+
|
|
162
|
+
c.action do |args, options|
|
|
163
|
+
options = FastlaneCore::Configuration.create(deliverfile_options(skip_verification: true), options.__hash__)
|
|
164
|
+
options.load_configuration_file("Deliverfile")
|
|
165
|
+
Deliver::Runner.new(options, skip_version: true) # to login...
|
|
166
|
+
containing = FastlaneCore::Helper.fastlane_enabled_folder_path
|
|
167
|
+
path = options[:app_clip_header_images_path] || File.join(containing, 'app_clip_header_images')
|
|
168
|
+
Deliver::DownloadAppClipHeaderImages.run(options, path)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
155
172
|
command :download_metadata do |c|
|
|
156
173
|
c.syntax = 'fastlane deliver download_metadata'
|
|
157
174
|
c.description = "Downloads existing metadata and stores it locally. This overwrites the local files."
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require_relative 'module'
|
|
2
|
+
require 'spaceship'
|
|
3
|
+
|
|
4
|
+
module Deliver
|
|
5
|
+
class DownloadAppClipHeaderImages
|
|
6
|
+
def self.run(options, path)
|
|
7
|
+
UI.message("Downloading all existing app clip header images...")
|
|
8
|
+
download(options, path)
|
|
9
|
+
UI.success("Successfully downloaded all existing app clip header images")
|
|
10
|
+
rescue => ex
|
|
11
|
+
UI.error(ex)
|
|
12
|
+
UI.error("Couldn't download already existing app clip header images from App Store Connect.")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.download(options, folder_path)
|
|
16
|
+
app = Deliver.cache[:app]
|
|
17
|
+
|
|
18
|
+
platform = Spaceship::ConnectAPI::Platform.map(options[:platform])
|
|
19
|
+
if options[:use_live_version]
|
|
20
|
+
version = app.get_live_app_store_version(platform: platform, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES + ",appClipDefaultExperience")
|
|
21
|
+
UI.user_error!("Could not find a live version on App Store Connect. Try using '--use_live_version false'") if version.nil?
|
|
22
|
+
else
|
|
23
|
+
version = app.get_edit_app_store_version(platform: platform, includes: Spaceship::ConnectAPI::AppStoreVersion::ESSENTIAL_INCLUDES + ",appClipDefaultExperience")
|
|
24
|
+
UI.user_error!("Could not find an edit version on App Store Connect. Try using '--use_live_version true'") if version.nil?
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
default_experience = version.app_clip_default_experience
|
|
28
|
+
UI.user_error!("Cannot download app clip header images if no default experience exists for version '#{version.version_string}'") unless default_experience
|
|
29
|
+
|
|
30
|
+
localizations = Spaceship::ConnectAPI::AppClipDefaultExperienceLocalization.find_all(app_clip_default_experience_id: default_experience.id, includes: 'appClipHeaderImage')
|
|
31
|
+
|
|
32
|
+
threads = []
|
|
33
|
+
localizations.each do |localization|
|
|
34
|
+
threads << Thread.new do
|
|
35
|
+
download_app_clip_header_image(folder_path, localization)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
threads.each(&:join)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.download_app_clip_header_image(folder_path, localization)
|
|
42
|
+
language = localization.locale
|
|
43
|
+
app_clip_header_image = localization.app_clip_header_image
|
|
44
|
+
|
|
45
|
+
file_name = app_clip_header_image.file_name
|
|
46
|
+
original_file_extension = File.extname(file_name).strip.downcase[1..-1]
|
|
47
|
+
|
|
48
|
+
url = app_clip_header_image.image_asset_url(type: original_file_extension)
|
|
49
|
+
return if url.nil?
|
|
50
|
+
|
|
51
|
+
UI.message("Downloading existing app clip header image '#{file_name}' for language '#{language}'")
|
|
52
|
+
|
|
53
|
+
containing_folder = File.join(folder_path, language)
|
|
54
|
+
begin
|
|
55
|
+
FileUtils.mkdir_p(containing_folder)
|
|
56
|
+
rescue
|
|
57
|
+
# if it's already there
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
path = File.join(containing_folder, file_name)
|
|
61
|
+
File.binwrite(path, FastlaneCore::Helper.open_uri(url).read)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -1,7 +1,40 @@
|
|
|
1
|
+
require 'fastlane_core/languages'
|
|
2
|
+
|
|
1
3
|
module Deliver
|
|
2
4
|
module Languages
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
ALL_LANGUAGES = FastlaneCore::Languages::ALL_LANGUAGES
|
|
6
|
+
|
|
7
|
+
# Detects all enabled languages from various sources
|
|
8
|
+
# @param options [Hash] The options hash containing language settings
|
|
9
|
+
# @param localized_values_keys [Array<Symbol>] Keys to check for localized values in options
|
|
10
|
+
# @param metadata_path [String, nil] Path to metadata folder to check for language folders
|
|
11
|
+
# @param ignore_validation [Boolean] Whether to ignore language directory validation
|
|
12
|
+
# @return [Array<String>] List of unique enabled language codes
|
|
13
|
+
def self.detect_languages(options:, localized_values_keys: [], metadata_path: nil, ignore_validation: false)
|
|
14
|
+
require_relative 'loader'
|
|
15
|
+
|
|
16
|
+
enabled_languages = options[:languages] || []
|
|
17
|
+
|
|
18
|
+
# Get all languages used in existing localized settings
|
|
19
|
+
localized_values_keys.each do |key|
|
|
20
|
+
current = options[key]
|
|
21
|
+
next unless current && current.kind_of?(Hash)
|
|
22
|
+
current.each do |language, value|
|
|
23
|
+
enabled_languages << language unless enabled_languages.include?(language)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Check folder list if metadata_path is provided (an empty folder signifies a language is required)
|
|
28
|
+
if metadata_path
|
|
29
|
+
Loader.language_folders(metadata_path, ignore_validation).each do |lang_folder|
|
|
30
|
+
enabled_languages << lang_folder.basename unless enabled_languages.include?(lang_folder.basename)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Mapping to strings because :default symbol can be passed in
|
|
35
|
+
enabled_languages
|
|
36
|
+
.map(&:to_s)
|
|
37
|
+
.uniq
|
|
38
|
+
end
|
|
6
39
|
end
|
|
7
40
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require_relative 'module'
|
|
2
2
|
require_relative 'app_screenshot'
|
|
3
3
|
require_relative 'app_screenshot_validator'
|
|
4
|
+
require_relative 'app_clip_header_image'
|
|
4
5
|
require_relative 'upload_metadata'
|
|
5
6
|
require_relative 'languages'
|
|
6
7
|
|
|
@@ -109,6 +110,46 @@ module Deliver
|
|
|
109
110
|
valid_screenshots
|
|
110
111
|
end
|
|
111
112
|
|
|
113
|
+
# Returns the list of valid app clip header images. When detecting invalid header images, this
|
|
114
|
+
# will cause an error. There may only be a max of one image per language and each image must be
|
|
115
|
+
# exactly 1800x1200.
|
|
116
|
+
#
|
|
117
|
+
# @param root [String] A directory path
|
|
118
|
+
# @param ignore_validation [String] Set false not to raise the error when
|
|
119
|
+
# finding invalid folder name @return [Array<Deliver::AppClipHeaderImage>]
|
|
120
|
+
# The list of AppClipHeaderImage that exists under given `root` directory
|
|
121
|
+
def self.load_app_clip_header_images(root, ignore_validation)
|
|
122
|
+
language_folders_list = language_folders(root, ignore_validation, true)
|
|
123
|
+
|
|
124
|
+
# Load images from all language folders (including default)
|
|
125
|
+
app_clip_header_images = language_folders_list.flat_map do |language_folder|
|
|
126
|
+
paths = language_folder.file_paths
|
|
127
|
+
paths.map { |path| AppClipHeaderImage.new(path, language_folder.language) }
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# validate the header images are 1800x1200 in size
|
|
131
|
+
app_clip_header_images.each do |header_image|
|
|
132
|
+
size = FastImage.size(header_image.path)
|
|
133
|
+
if size.nil?
|
|
134
|
+
UI.user_error!("Unable to read app clip header image file: #{header_image.path}")
|
|
135
|
+
end
|
|
136
|
+
size = size.join('x')
|
|
137
|
+
unless size.eql?("1800x1200")
|
|
138
|
+
UI.user_error!("App clip header images must be exactly 1800x1200 in size. Offending image has size #{size}: '#{header_image.path}'")
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# validate there is only one header image per language
|
|
143
|
+
# Filter out nil languages (e.g., from default folder) before validation
|
|
144
|
+
app_clip_header_images.map(&:language).compact.each do |language|
|
|
145
|
+
if app_clip_header_images.find_all { |header_image| header_image.language.eql?(language) }.length > 1
|
|
146
|
+
UI.user_error!("There can only be one app clip header image per language. The language #{language} has more than one image.")
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
app_clip_header_images
|
|
151
|
+
end
|
|
152
|
+
|
|
112
153
|
# Returns the list of language folders
|
|
113
154
|
#
|
|
114
155
|
# @param roort [String] A directory path to get the list of language folders
|
|
@@ -127,6 +127,14 @@ module Deliver
|
|
|
127
127
|
env_name: "DELIVER_SCREENSHOTS_PATH",
|
|
128
128
|
description: "Path to the folder containing the screenshots",
|
|
129
129
|
optional: true),
|
|
130
|
+
FastlaneCore::ConfigItem.new(key: :app_clip_header_images_path,
|
|
131
|
+
env_name: "DELIVER_APP_CLIP_HEADER_IMAGES_PATH",
|
|
132
|
+
description: "Path to the folder containing the app clip header images",
|
|
133
|
+
optional: true),
|
|
134
|
+
FastlaneCore::ConfigItem.new(key: :app_clip_default_experience_metadata_path,
|
|
135
|
+
env_name: "DELIVER_APP_CLIP_DEFAULT_EXPERIENCE_METADATA_PATH",
|
|
136
|
+
description: "Path to the folder containing the app clip default experience metadata",
|
|
137
|
+
optional: true),
|
|
130
138
|
|
|
131
139
|
# app previews (videos)
|
|
132
140
|
FastlaneCore::ConfigItem.new(key: :app_previews_path,
|
|
@@ -404,6 +412,10 @@ module Deliver
|
|
|
404
412
|
description: "Metadata: A hash containing the review information",
|
|
405
413
|
optional: true,
|
|
406
414
|
type: Hash),
|
|
415
|
+
FastlaneCore::ConfigItem.new(key: :app_clip_review_information,
|
|
416
|
+
description: "Metadata: A hash containing the app clip review information",
|
|
417
|
+
optional: true,
|
|
418
|
+
type: Hash),
|
|
407
419
|
FastlaneCore::ConfigItem.new(key: :app_review_attachment_file,
|
|
408
420
|
env_name: "DELIVER_APP_REVIEW_ATTACHMENT_FILE",
|
|
409
421
|
description: "Metadata: Path to the app review attachment file",
|
|
@@ -484,6 +496,17 @@ module Deliver
|
|
|
484
496
|
optional: true,
|
|
485
497
|
default_value: true),
|
|
486
498
|
|
|
499
|
+
# app clip default experience
|
|
500
|
+
FastlaneCore::ConfigItem.new(key: :app_clip_default_experience_subtitle,
|
|
501
|
+
env_name: "DELIVER_APP_CLIP_DEFAULT_EXPERIENCE_SUBTITLE",
|
|
502
|
+
description: "The localized subtitle for the default app clip experience",
|
|
503
|
+
optional: true,
|
|
504
|
+
type: Hash),
|
|
505
|
+
FastlaneCore::ConfigItem.new(key: :app_clip_default_experience_action,
|
|
506
|
+
env_name: "DELIVER_APP_CLIP_DEFAULT_EXPERIENCE_ACTION",
|
|
507
|
+
description: "Action for the default app clip experience (OPEN, VIEW, PLAY)",
|
|
508
|
+
optional: true),
|
|
509
|
+
|
|
487
510
|
# internal
|
|
488
511
|
FastlaneCore::ConfigItem.new(key: :app,
|
|
489
512
|
short_option: "-p",
|
|
@@ -9,6 +9,8 @@ require_relative 'html_generator'
|
|
|
9
9
|
require_relative 'submit_for_review'
|
|
10
10
|
require_relative 'upload_price_tier'
|
|
11
11
|
require_relative 'upload_metadata'
|
|
12
|
+
require_relative 'upload_app_clip_default_experience_metadata'
|
|
13
|
+
require_relative 'upload_app_clip_default_experience_header_images'
|
|
12
14
|
require_relative 'upload_screenshots'
|
|
13
15
|
require_relative 'sync_screenshots'
|
|
14
16
|
require_relative 'sync_app_previews'
|
|
@@ -136,6 +138,12 @@ module Deliver
|
|
|
136
138
|
|
|
137
139
|
# Upload all metadata, screenshots, pricing information, etc. to App Store Connect
|
|
138
140
|
def upload_metadata
|
|
141
|
+
# App clip experience metadata upload must happen before the upload metadata step. The app
|
|
142
|
+
# clip app store review detail upload depends on there being a valid app clip default
|
|
143
|
+
# experience on the edit version.
|
|
144
|
+
UploadAppClipDefaultExperienceMetadata.new.upload_metadata(options)
|
|
145
|
+
UploadAppClipDefaultExperienceHeaderImages.new.find_and_upload(options)
|
|
146
|
+
|
|
139
147
|
upload_metadata = UploadMetadata.new(options)
|
|
140
148
|
upload_screenshots = UploadScreenshots.new
|
|
141
149
|
|