fastlane 2.89.0.beta.20180402050042 → 2.89.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +70 -70
- data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +8 -0
- data/fastlane/lib/fastlane/actions/docs/create_app_online.md +27 -12
- data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +1 -1
- data/fastlane/lib/fastlane/actions/get_version_number.rb +4 -1
- data/fastlane/lib/fastlane/actions/register_devices.rb +33 -12
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +7 -3
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/produce/lib/produce/commands_generator.rb +18 -6
- data/produce/lib/produce/developer_center.rb +8 -6
- data/produce/lib/produce/service.rb +28 -5
- data/snapshot/lib/snapshot/test_command_generator.rb +2 -10
- data/spaceship/lib/spaceship/portal/app_service.rb +7 -5
- data/spaceship/lib/spaceship/test_flight/client.rb +7 -0
- data/spaceship/lib/spaceship/test_flight/group.rb +5 -0
- metadata +32 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dc8f9a337594c7230b0d1aeb872d5810cc7dd33
|
4
|
+
data.tar.gz: 44e891c36ef3aa5e3d404f5b279febef9e357760
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1380d44e688126e1c2973a14f6f08272114e17794a8ff010072bcbd90bee6b015ca47fe6729790e394bde3e0bff9a363a5f2a0349ae29a126c0a2e0cec70a80a
|
7
|
+
data.tar.gz: '043792d70a28425a06674508f975855805fea67bf481030dbdefd35027e36bcb6043150928eb65c51879e41e9b1a4404bffea53af53bafea6fe056615bf8c38e'
|
data/README.md
CHANGED
@@ -32,81 +32,49 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
32
32
|
|
33
33
|
<table id='team'>
|
34
34
|
<tr>
|
35
|
-
<td id='stefan-natchev'>
|
36
|
-
<a href='https://github.com/snatchev'>
|
37
|
-
<img src='https://github.com/snatchev.png?size=140'>
|
38
|
-
</a>
|
39
|
-
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
40
|
-
</td>
|
41
|
-
<td id='josh-holtz'>
|
42
|
-
<a href='https://github.com/joshdholtz'>
|
43
|
-
<img src='https://github.com/joshdholtz.png?size=140'>
|
44
|
-
</a>
|
45
|
-
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
|
46
|
-
</td>
|
47
|
-
<td id='jérôme-lacoste'>
|
48
|
-
<a href='https://github.com/lacostej'>
|
49
|
-
<img src='https://github.com/lacostej.png?size=140'>
|
50
|
-
</a>
|
51
|
-
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
52
|
-
</td>
|
53
|
-
<td id='helmut-januschka'>
|
54
|
-
<a href='https://github.com/hjanuschka'>
|
55
|
-
<img src='https://github.com/hjanuschka.png?size=140'>
|
56
|
-
</a>
|
57
|
-
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
58
|
-
</td>
|
59
|
-
<td id='danielle-tomlinson'>
|
60
|
-
<a href='https://github.com/DanToml'>
|
61
|
-
<img src='https://github.com/DanToml.png?size=140'>
|
62
|
-
</a>
|
63
|
-
<h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
|
64
|
-
</td>
|
65
|
-
</tr>
|
66
|
-
<tr>
|
67
35
|
<td id='iulian-onofrei'>
|
68
36
|
<a href='https://github.com/revolter'>
|
69
37
|
<img src='https://github.com/revolter.png?size=140'>
|
70
38
|
</a>
|
71
39
|
<h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
|
72
40
|
</td>
|
73
|
-
<td id='
|
74
|
-
<a href='https://github.com/
|
75
|
-
<img src='https://github.com/
|
41
|
+
<td id='stefan-natchev'>
|
42
|
+
<a href='https://github.com/snatchev'>
|
43
|
+
<img src='https://github.com/snatchev.png?size=140'>
|
76
44
|
</a>
|
77
|
-
<h4 align='center'>
|
45
|
+
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
78
46
|
</td>
|
79
|
-
<td id='
|
80
|
-
<a href='https://github.com/
|
81
|
-
<img src='https://github.com/
|
47
|
+
<td id='manu-wallner'>
|
48
|
+
<a href='https://github.com/milch'>
|
49
|
+
<img src='https://github.com/milch.png?size=140'>
|
82
50
|
</a>
|
83
|
-
<h4 align='center'><a href='https://twitter.com/
|
51
|
+
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
84
52
|
</td>
|
85
|
-
<td id='
|
86
|
-
<a href='https://github.com/
|
87
|
-
<img src='https://github.com/
|
53
|
+
<td id='kohki-miki'>
|
54
|
+
<a href='https://github.com/giginet'>
|
55
|
+
<img src='https://github.com/giginet.png?size=140'>
|
88
56
|
</a>
|
89
|
-
<h4 align='center'><a href='https://twitter.com/
|
57
|
+
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
90
58
|
</td>
|
91
|
-
<td id='
|
92
|
-
<a href='https://github.com/
|
93
|
-
<img src='https://github.com/
|
59
|
+
<td id='fumiya-nakamura'>
|
60
|
+
<a href='https://github.com/nafu'>
|
61
|
+
<img src='https://github.com/nafu.png?size=140'>
|
94
62
|
</a>
|
95
|
-
<h4 align='center'><a href='https://twitter.com/
|
63
|
+
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
96
64
|
</td>
|
97
65
|
</tr>
|
98
66
|
<tr>
|
99
|
-
<td id='
|
100
|
-
<a href='https://github.com/
|
101
|
-
<img src='https://github.com/
|
67
|
+
<td id='josh-holtz'>
|
68
|
+
<a href='https://github.com/joshdholtz'>
|
69
|
+
<img src='https://github.com/joshdholtz.png?size=140'>
|
102
70
|
</a>
|
103
|
-
<h4 align='center'><a href='https://twitter.com/
|
71
|
+
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
|
104
72
|
</td>
|
105
|
-
<td id='
|
106
|
-
<a href='https://github.com/
|
107
|
-
<img src='https://github.com/
|
73
|
+
<td id='jérôme-lacoste'>
|
74
|
+
<a href='https://github.com/lacostej'>
|
75
|
+
<img src='https://github.com/lacostej.png?size=140'>
|
108
76
|
</a>
|
109
|
-
<h4 align='center'><a href='https://twitter.com/
|
77
|
+
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
110
78
|
</td>
|
111
79
|
<td id='andrew-mcburney'>
|
112
80
|
<a href='https://github.com/AndrewMcBurney'>
|
@@ -114,25 +82,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
114
82
|
</a>
|
115
83
|
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
116
84
|
</td>
|
117
|
-
<td id='kohki-miki'>
|
118
|
-
<a href='https://github.com/giginet'>
|
119
|
-
<img src='https://github.com/giginet.png?size=140'>
|
120
|
-
</a>
|
121
|
-
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
122
|
-
</td>
|
123
85
|
<td id='jan-piotrowski'>
|
124
86
|
<a href='https://github.com/janpio'>
|
125
87
|
<img src='https://github.com/janpio.png?size=140'>
|
126
88
|
</a>
|
127
89
|
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
128
90
|
</td>
|
91
|
+
<td id='joshua-liebowitz'>
|
92
|
+
<a href='https://github.com/taquitos'>
|
93
|
+
<img src='https://github.com/taquitos.png?size=140'>
|
94
|
+
</a>
|
95
|
+
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
96
|
+
</td>
|
129
97
|
</tr>
|
130
98
|
<tr>
|
131
|
-
<td id='
|
132
|
-
<a href='https://github.com/
|
133
|
-
<img src='https://github.com/
|
99
|
+
<td id='luka-mirosevic'>
|
100
|
+
<a href='https://github.com/lmirosevic'>
|
101
|
+
<img src='https://github.com/lmirosevic.png?size=140'>
|
134
102
|
</a>
|
135
|
-
<h4 align='center'><a href='https://twitter.com/
|
103
|
+
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
136
104
|
</td>
|
137
105
|
<td id='jorge-revuelta-h'>
|
138
106
|
<a href='https://github.com/minuscorp'>
|
@@ -140,17 +108,49 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
140
108
|
</a>
|
141
109
|
<h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
|
142
110
|
</td>
|
111
|
+
<td id='helmut-januschka'>
|
112
|
+
<a href='https://github.com/hjanuschka'>
|
113
|
+
<img src='https://github.com/hjanuschka.png?size=140'>
|
114
|
+
</a>
|
115
|
+
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
116
|
+
</td>
|
143
117
|
<td id='aaron-brager'>
|
144
118
|
<a href='https://github.com/getaaron'>
|
145
119
|
<img src='https://github.com/getaaron.png?size=140'>
|
146
120
|
</a>
|
147
121
|
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
148
122
|
</td>
|
149
|
-
<td id='
|
150
|
-
<a href='https://github.com/
|
151
|
-
<img src='https://github.com/
|
123
|
+
<td id='danielle-tomlinson'>
|
124
|
+
<a href='https://github.com/DanToml'>
|
125
|
+
<img src='https://github.com/DanToml.png?size=140'>
|
152
126
|
</a>
|
153
|
-
<h4 align='center'><a href='https://twitter.com/
|
127
|
+
<h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
|
128
|
+
</td>
|
129
|
+
</tr>
|
130
|
+
<tr>
|
131
|
+
<td id='felix-krause'>
|
132
|
+
<a href='https://github.com/KrauseFx'>
|
133
|
+
<img src='https://github.com/KrauseFx.png?size=140'>
|
134
|
+
</a>
|
135
|
+
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
|
136
|
+
</td>
|
137
|
+
<td id='olivier-halligon'>
|
138
|
+
<a href='https://github.com/AliSoftware'>
|
139
|
+
<img src='https://github.com/AliSoftware.png?size=140'>
|
140
|
+
</a>
|
141
|
+
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
142
|
+
</td>
|
143
|
+
<td id='matthew-ellis'>
|
144
|
+
<a href='https://github.com/matthewellis'>
|
145
|
+
<img src='https://github.com/matthewellis.png?size=140'>
|
146
|
+
</a>
|
147
|
+
<h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
|
148
|
+
</td>
|
149
|
+
<td id='jimmy-dee'>
|
150
|
+
<a href='https://github.com/jdee'>
|
151
|
+
<img src='https://github.com/jdee.png?size=140'>
|
152
|
+
</a>
|
153
|
+
<h4 align='center'>Jimmy Dee</h4>
|
154
154
|
</td>
|
155
155
|
<td id='maksym-grebenets'>
|
156
156
|
<a href='https://github.com/mgrebenets'>
|
@@ -40,6 +40,14 @@ module Fastlane
|
|
40
40
|
end
|
41
41
|
if params[:code_sign_identity]
|
42
42
|
build_configuration_list.set_setting("CODE_SIGN_IDENTITY", params[:code_sign_identity])
|
43
|
+
|
44
|
+
# We also need to update the value if it was overriden for a specific SDK
|
45
|
+
build_configuration_list.build_configurations.each do |build_configuration|
|
46
|
+
codesign_build_settings_keys = build_configuration.build_settings.keys.select { |key| key.to_s.match(/CODE_SIGN_IDENTITY.*/) }
|
47
|
+
codesign_build_settings_keys.each do |setting|
|
48
|
+
build_configuration_list.set_setting(setting, params[:code_sign_identity])
|
49
|
+
end
|
50
|
+
end
|
43
51
|
UI.important("Set Code Sign identity to: #{params[:code_sign_identity]} for target: #{found_target[:name]}")
|
44
52
|
end
|
45
53
|
if params[:profile_name]
|
@@ -105,14 +105,20 @@ fastlane produce enable_services --help
|
|
105
105
|
--game-center Enable Game Center
|
106
106
|
--healthkit Enable HealthKit
|
107
107
|
--homekit Enable HomeKit
|
108
|
-
--
|
108
|
+
--hotspot Enable Hotspot
|
109
109
|
--icloud STRING Enable iCloud, suitable values are "legacy" and "cloudkit"
|
110
110
|
--in-app-purchase Enable In-App Purchase
|
111
111
|
--inter-app-audio Enable Inter-App-Audio
|
112
|
-
--
|
112
|
+
--multipath Enable Multipath
|
113
|
+
--network-extension Enable Network Extensions
|
114
|
+
--nfc-tag-reading Enable NFC Tag Reading
|
115
|
+
--personal-vpn Enable Personal VPN
|
116
|
+
--passbook Enable Passbook (deprecated)
|
113
117
|
--push-notification Enable Push notification (only enables the service, does not configure certificates)
|
114
118
|
--sirikit Enable SiriKit
|
115
|
-
--vpn-conf Enable VPN Configuration
|
119
|
+
--vpn-conf Enable VPN Configuration (deprecated)
|
120
|
+
--wallet Enable Wallet
|
121
|
+
--wireless-conf Enable Wireless Accessory Configuration
|
116
122
|
```
|
117
123
|
|
118
124
|
```no-highlight
|
@@ -127,14 +133,20 @@ fastlane produce disable_services --help
|
|
127
133
|
--game-center Disable Game Center
|
128
134
|
--healthkit Disable HealthKit
|
129
135
|
--homekit Disable HomeKit
|
130
|
-
--
|
136
|
+
--hotspot Disable Hotspot
|
131
137
|
--icloud Disable iCloud
|
132
138
|
--in-app-purchase Disable In-App Purchase
|
133
139
|
--inter-app-audio Disable Inter-App-Audio
|
134
|
-
--
|
140
|
+
--multipath Disable Multipath
|
141
|
+
--network-extension Disable Network Extensions
|
142
|
+
--nfc-tag-reading Disable NFC Tag Reading
|
143
|
+
--personal-vpn Disable Personal VPN
|
144
|
+
--passbook Disable Passbook (deprecated)
|
135
145
|
--push-notification Disable Push notifications
|
136
146
|
--sirikit Disable SiriKit
|
137
|
-
--vpn-conf Disable VPN Configuration
|
147
|
+
--vpn-conf Disable VPN Configuration (deprecated)
|
148
|
+
--wallet Disable Wallet
|
149
|
+
--wireless-conf Disable Wireless Accessory Configuration
|
138
150
|
```
|
139
151
|
|
140
152
|
## Creating Apple Pay merchants and associating them with an App ID
|
@@ -197,18 +209,21 @@ lane :release do
|
|
197
209
|
game_center: "on", # Valid values: "on", "off"
|
198
210
|
health_kit: "on", # Valid values: "on", "off"
|
199
211
|
home_kit: "on", # Valid values: "on", "off"
|
200
|
-
|
212
|
+
hotspot: "on", # Valid values: "on", "off"
|
201
213
|
icloud: "cloudkit", # Valid values: "legacy", "cloudkit"
|
202
214
|
in_app_purchase: "on", # Valid values: "on", "off"
|
203
215
|
inter_app_audio: "on", # Valid values: "on", "off"
|
204
216
|
passbook: "on", # Valid values: "on", "off"
|
205
|
-
push_notification: "on", # Valid values: "on", "off"
|
206
|
-
siri_kit: "on", # Valid values: "on", "off"
|
207
|
-
vpn_configuration: "on", # Valid values: "on", "off"
|
208
|
-
network_extension: "on", # Valid values: "on", "off"
|
209
|
-
hotspot: "on", # Valid values: "on", "off"
|
210
217
|
multipath: "on", # Valid values: "on", "off"
|
218
|
+
network_extensions: "on", # Valid values: "on", "off"
|
211
219
|
nfc_tag_reading: "on", # Valid values: "on", "off"
|
220
|
+
personal_vpn: "on", # Valid values: "on", "off"
|
221
|
+
passbook: "on", # Valid values: "on", "off" (deprecated)
|
222
|
+
push_notification: "on", # Valid values: "on", "off"
|
223
|
+
siri_kit: "on", # Valid values: "on", "off"
|
224
|
+
vpn_configuration: "on", # Valid values: "on", "off" (deprecated)
|
225
|
+
wallet: "on", # Valid values: "on", "off"
|
226
|
+
wireless_accessory: "on", # Valid values: "on", "off"
|
212
227
|
}
|
213
228
|
)
|
214
229
|
|
@@ -250,7 +250,7 @@ Check out [_snapshot_](https://docs.fastlane.tools/actions/snapshot/) to automat
|
|
250
250
|
|
251
251
|
## Upload screenshots
|
252
252
|
|
253
|
-
Use [
|
253
|
+
Use [_deliver_](https://docs.fastlane.tools/actions/deliver/) to upload iOS screenshots to iTunes Connect, or [_supply_](https://docs.fastlane.tools/actions/supply/) to upload Android screenshots to Play Store completely automatically 🚀
|
254
254
|
|
255
255
|
## Alternative location to store device_frames
|
256
256
|
|
@@ -38,7 +38,10 @@ module Fastlane
|
|
38
38
|
unless target_name
|
39
39
|
|
40
40
|
# Gets non-test targets
|
41
|
-
non_test_targets = targets.reject
|
41
|
+
non_test_targets = targets.reject do |t|
|
42
|
+
# Not all targets respond to `test_target_type?`
|
43
|
+
t.respond_to?(:test_target_type?) && t.test_target_type?
|
44
|
+
end
|
42
45
|
|
43
46
|
# Returns if only one non-test target
|
44
47
|
if non_test_targets.count == 1
|
@@ -3,10 +3,11 @@ require 'credentials_manager'
|
|
3
3
|
module Fastlane
|
4
4
|
module Actions
|
5
5
|
class RegisterDevicesAction < Action
|
6
|
-
|
6
|
+
UDID_REGEXP_IOS = /^\h{40}$/
|
7
|
+
UDID_REGEXP_MAC = /^[\h\-]{36}$/
|
7
8
|
|
8
9
|
def self.is_supported?(platform)
|
9
|
-
|
10
|
+
[:ios, :mac].include?(platform)
|
10
11
|
end
|
11
12
|
|
12
13
|
def self.run(params)
|
@@ -15,14 +16,21 @@ module Fastlane
|
|
15
16
|
devices = params[:devices]
|
16
17
|
devices_file = params[:devices_file]
|
17
18
|
|
19
|
+
mac = params[:platform] == "mac"
|
20
|
+
udid_regexp = mac ? UDID_REGEXP_MAC : UDID_REGEXP_IOS
|
21
|
+
|
18
22
|
credentials = CredentialsManager::AccountManager.new(user: params[:username])
|
19
23
|
Spaceship.login(credentials.user, credentials.password)
|
20
24
|
Spaceship.select_team
|
21
25
|
|
26
|
+
UI.message("Fetching list of currently registered devices...")
|
27
|
+
existing_devices = Spaceship::Device.all(mac: mac)
|
28
|
+
|
22
29
|
if devices
|
23
30
|
device_objs = devices.map do |k, v|
|
24
|
-
UI.user_error!("Passed invalid UDID: #{v} for device: #{k}") unless
|
25
|
-
|
31
|
+
UI.user_error!("Passed invalid UDID: #{v} for device: #{k}") unless udid_regexp =~ v
|
32
|
+
next if existing_devices.map(&:udid).include?(v)
|
33
|
+
Spaceship::Device.create!(name: k, udid: v, mac: mac)
|
26
34
|
end
|
27
35
|
elsif devices_file
|
28
36
|
require 'csv'
|
@@ -30,16 +38,13 @@ module Fastlane
|
|
30
38
|
devices_file = CSV.read(File.expand_path(File.join(devices_file)), col_sep: "\t")
|
31
39
|
UI.user_error!("Please provide a file according to the Apple Sample UDID file (https://devimages.apple.com.edgekey.net/downloads/devices/Multiple-Upload-Samples.zip)") unless devices_file.first == ['Device ID', 'Device Name']
|
32
40
|
|
33
|
-
UI.message("Fetching list of currently registered devices...")
|
34
|
-
existing_devices = Spaceship::Device.all
|
35
|
-
|
36
41
|
device_objs = devices_file.drop(1).map do |device|
|
37
42
|
next if existing_devices.map(&:udid).include?(device[0])
|
38
43
|
|
39
44
|
UI.user_error!("Invalid device line, please provide a file according to the Apple Sample UDID file (http://devimages.apple.com/downloads/devices/Multiple-Upload-Samples.zip)") unless device.count == 2
|
40
|
-
UI.user_error!("Passed invalid UDID: #{device[0]} for device: #{device[1]}") unless
|
45
|
+
UI.user_error!("Passed invalid UDID: #{device[0]} for device: #{device[1]}") unless udid_regexp =~ device[0]
|
41
46
|
|
42
|
-
Spaceship::Device.create!(name: device[1], udid: device[0])
|
47
|
+
Spaceship::Device.create!(name: device[1], udid: device[0], mac: mac)
|
43
48
|
end
|
44
49
|
else
|
45
50
|
UI.user_error!("You must pass either a valid `devices` or `devices_file`. Please check the readme.")
|
@@ -56,6 +61,7 @@ module Fastlane
|
|
56
61
|
def self.available_options
|
57
62
|
user = CredentialsManager::AppfileConfig.try_fetch_value(:apple_dev_portal_id)
|
58
63
|
user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
|
64
|
+
platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME].to_s
|
59
65
|
|
60
66
|
[
|
61
67
|
FastlaneCore::ConfigItem.new(key: :devices,
|
@@ -95,13 +101,21 @@ module Fastlane
|
|
95
101
|
env_name: "DELIVER_USER",
|
96
102
|
description: "Optional: Your Apple ID",
|
97
103
|
default_value: user,
|
98
|
-
default_value_dynamic: true)
|
104
|
+
default_value_dynamic: true),
|
105
|
+
FastlaneCore::ConfigItem.new(key: :platform,
|
106
|
+
env_name: "REGISTER_DEVICES_PLATFORM",
|
107
|
+
description: "The platform to use (optional)",
|
108
|
+
optional: true,
|
109
|
+
default_value: platform.empty? ? "ios" : platform,
|
110
|
+
verify_block: proc do |value|
|
111
|
+
UI.user_error!("The platform can only be ios or mac") unless %('ios', 'mac').include?(value)
|
112
|
+
end)
|
99
113
|
]
|
100
114
|
end
|
101
115
|
|
102
116
|
def self.details
|
103
117
|
[
|
104
|
-
"This will register iOS devices with the Developer Portal so that you can include them in your provisioning profiles.",
|
118
|
+
"This will register iOS/Mac devices with the Developer Portal so that you can include them in your provisioning profiles.",
|
105
119
|
"This is an optimistic action, in that it will only ever add new devices to the member center, and never remove devices. If a device which has already been registered within the member center is not passed to this action, it will be left alone in the member center and continue to work.",
|
106
120
|
"The action will connect to the Apple Developer Portal using the username you specified in your `Appfile` with `apple_id`, but you can override it using the `username` option, or by setting the env variable `ENV['DELIVER_USER']`."
|
107
121
|
].join("\n")
|
@@ -126,7 +140,14 @@ module Fastlane
|
|
126
140
|
devices_file: "./devices.txt", # You must pass in either `devices_file` or `devices`.
|
127
141
|
team_id: "XXXXXXXXXX", # Optional, if you"re a member of multiple teams, then you need to pass the team ID here.
|
128
142
|
username: "luka@goonbee.com" # Optional, lets you override the Apple Member Center username.
|
129
|
-
)'
|
143
|
+
)',
|
144
|
+
'register_devices(
|
145
|
+
devices: {
|
146
|
+
"Luka MacBook" => "12345678-1234-1234-1234-123456789012",
|
147
|
+
"Felix MacBook Pro" => "ABCDEFGH-ABCD-ABCD-ABCD-ABCDEFGHIJKL"
|
148
|
+
},
|
149
|
+
platform: "mac"
|
150
|
+
) # Register devices for Mac'
|
130
151
|
]
|
131
152
|
end
|
132
153
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.89.0
|
2
|
+
VERSION = '2.89.0'.freeze
|
3
3
|
DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
|
4
4
|
MINIMUM_XCODE_RELEASE = "7.0".freeze
|
5
5
|
RUBOCOP_REQUIREMENT = '0.49.1'.freeze
|
@@ -2487,12 +2487,14 @@ func registerDevices(devices: [String : Any]? = nil,
|
|
2487
2487
|
devicesFile: String? = nil,
|
2488
2488
|
teamId: String? = nil,
|
2489
2489
|
teamName: String? = nil,
|
2490
|
-
username: String
|
2490
|
+
username: String,
|
2491
|
+
platform: String = "ios") {
|
2491
2492
|
let command = RubyCommand(commandID: "", methodName: "register_devices", className: nil, args: [RubyCommand.Argument(name: "devices", value: devices),
|
2492
2493
|
RubyCommand.Argument(name: "devices_file", value: devicesFile),
|
2493
2494
|
RubyCommand.Argument(name: "team_id", value: teamId),
|
2494
2495
|
RubyCommand.Argument(name: "team_name", value: teamName),
|
2495
|
-
RubyCommand.Argument(name: "username", value: username)
|
2496
|
+
RubyCommand.Argument(name: "username", value: username),
|
2497
|
+
RubyCommand.Argument(name: "platform", value: platform)])
|
2496
2498
|
_ = runner.executeCommand(command)
|
2497
2499
|
}
|
2498
2500
|
func resetGitRepo(files: String? = nil,
|
@@ -3314,6 +3316,7 @@ func teamName() {
|
|
3314
3316
|
func testfairy(apiKey: String,
|
3315
3317
|
ipa: String,
|
3316
3318
|
symbolsFile: String? = nil,
|
3319
|
+
uploadUrl: String = "https://upload.testfairy.com",
|
3317
3320
|
testersGroups: [String] = [],
|
3318
3321
|
metrics: [String] = [],
|
3319
3322
|
comment: String = "No comment provided",
|
@@ -3323,6 +3326,7 @@ func testfairy(apiKey: String,
|
|
3323
3326
|
let command = RubyCommand(commandID: "", methodName: "testfairy", className: nil, args: [RubyCommand.Argument(name: "api_key", value: apiKey),
|
3324
3327
|
RubyCommand.Argument(name: "ipa", value: ipa),
|
3325
3328
|
RubyCommand.Argument(name: "symbols_file", value: symbolsFile),
|
3329
|
+
RubyCommand.Argument(name: "upload_url", value: uploadUrl),
|
3326
3330
|
RubyCommand.Argument(name: "testers_groups", value: testersGroups),
|
3327
3331
|
RubyCommand.Argument(name: "metrics", value: metrics),
|
3328
3332
|
RubyCommand.Argument(name: "comment", value: comment),
|
@@ -3917,4 +3921,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
|
|
3917
3921
|
let snapshotfile: Snapshotfile = Snapshotfile()
|
3918
3922
|
// Please don't remove the lines below
|
3919
3923
|
// They are used to detect outdated files
|
3920
|
-
// FastlaneRunnerAPIVersion [0.9.
|
3924
|
+
// FastlaneRunnerAPIVersion [0.9.12]
|
@@ -52,14 +52,20 @@ module Produce
|
|
52
52
|
c.option('--game-center', 'Enable Game Center')
|
53
53
|
c.option('--healthkit', 'Enable HealthKit')
|
54
54
|
c.option('--homekit', 'Enable HomeKit')
|
55
|
-
c.option('--
|
55
|
+
c.option('--hotspot', 'Enable Hotspot')
|
56
56
|
c.option('--icloud STRING', String, 'Enable iCloud, suitable values are "legacy" and "cloudkit"')
|
57
57
|
c.option('--in-app-purchase', 'Enable In-App Purchase')
|
58
58
|
c.option('--inter-app-audio', 'Enable Inter-App-Audio')
|
59
|
-
c.option('--
|
59
|
+
c.option('--multipath', 'Enable Multipath')
|
60
|
+
c.option('--network-extension', 'Enable Network Extensions')
|
61
|
+
c.option('--nfc-tag-reading', 'Enable NFC Tag Reading')
|
62
|
+
c.option('--personal-vpn', 'Enable Personal VPN')
|
63
|
+
c.option('--passbook', 'Enable Passbook (deprecated)')
|
60
64
|
c.option('--push-notification', 'Enable Push notification (only enables the service, does not configure certificates)')
|
61
65
|
c.option('--sirikit', 'Enable SiriKit')
|
62
|
-
c.option('--vpn-conf', 'Enable VPN Configuration')
|
66
|
+
c.option('--vpn-conf', 'Enable VPN Configuration (deprecated)')
|
67
|
+
c.option('--wallet', 'Enable Wallet')
|
68
|
+
c.option('--wireless-conf', 'Enable Wireless Accessory Configuration')
|
63
69
|
|
64
70
|
FastlaneCore::CommanderGenerator.new.generate(Produce::Options.available_options, command: c)
|
65
71
|
|
@@ -85,14 +91,20 @@ module Produce
|
|
85
91
|
c.option('--game-center', 'Disable Game Center')
|
86
92
|
c.option('--healthkit', 'Disable HealthKit')
|
87
93
|
c.option('--homekit', 'Disable HomeKit')
|
88
|
-
c.option('--
|
94
|
+
c.option('--hotspot', 'Disable Hotspot')
|
89
95
|
c.option('--icloud', 'Disable iCloud')
|
90
96
|
c.option('--in-app-purchase', 'Disable In-App Purchase')
|
91
97
|
c.option('--inter-app-audio', 'Disable Inter-App-Audio')
|
92
|
-
c.option('--
|
98
|
+
c.option('--multipath', 'Disable Multipath')
|
99
|
+
c.option('--network-extension', 'Disable Network Extensions')
|
100
|
+
c.option('--nfc-tag-reading', 'Disable NFC Tag Reading')
|
101
|
+
c.option('--personal-vpn', 'Disable Personal VPN')
|
102
|
+
c.option('--passbook', 'Disable Passbook (deprecated)')
|
93
103
|
c.option('--push-notification', 'Disable Push notifications')
|
94
104
|
c.option('--sirikit', 'Disable SiriKit')
|
95
|
-
c.option('--vpn-conf', 'Disable VPN Configuration')
|
105
|
+
c.option('--vpn-conf', 'Disable VPN Configuration (deprecated)')
|
106
|
+
c.option('--wallet', 'Disable Wallet')
|
107
|
+
c.option('--wireless-conf', 'Disable Wireless Accessory Configuration')
|
96
108
|
|
97
109
|
FastlaneCore::CommanderGenerator.new.generate(Produce::Options.available_options, command: c)
|
98
110
|
|
@@ -23,18 +23,20 @@ module Produce
|
|
23
23
|
game_center: [SERVICE_ON, SERVICE_OFF],
|
24
24
|
health_kit: [SERVICE_ON, SERVICE_OFF],
|
25
25
|
home_kit: [SERVICE_ON, SERVICE_OFF],
|
26
|
-
|
26
|
+
hotspot: [SERVICE_ON, SERVICE_OFF],
|
27
27
|
icloud: [SERVICE_LEGACY, SERVICE_CLOUDKIT],
|
28
28
|
in_app_purchase: [SERVICE_ON, SERVICE_OFF],
|
29
29
|
inter_app_audio: [SERVICE_ON, SERVICE_OFF],
|
30
|
+
multipath: [SERVICE_ON, SERVICE_OFF],
|
31
|
+
network_extension: [SERVICE_ON, SERVICE_OFF],
|
32
|
+
nfc_tag_reading: [SERVICE_ON, SERVICE_OFF],
|
33
|
+
personal_vpn: [SERVICE_ON, SERVICE_OFF],
|
30
34
|
passbook: [SERVICE_ON, SERVICE_OFF],
|
31
35
|
push_notification: [SERVICE_ON, SERVICE_OFF],
|
32
36
|
siri_kit: [SERVICE_ON, SERVICE_OFF],
|
33
37
|
vpn_configuration: [SERVICE_ON, SERVICE_OFF],
|
34
|
-
|
35
|
-
|
36
|
-
multipath: [SERVICE_ON, SERVICE_OFF],
|
37
|
-
nfc_tag_reading: [SERVICE_ON, SERVICE_OFF]
|
38
|
+
wallet: [SERVICE_ON, SERVICE_OFF],
|
39
|
+
wireless_accessory: [SERVICE_ON, SERVICE_OFF]
|
38
40
|
}
|
39
41
|
|
40
42
|
def run
|
@@ -98,7 +100,7 @@ module Produce
|
|
98
100
|
enabled_clean_options[app_service.cloud.on.service_id] = app_service.cloud.on
|
99
101
|
enabled_clean_options[app_service.cloud_kit.xcode5_compatible.service_id] = app_service.cloud_kit.xcode5_compatible
|
100
102
|
when SERVICE_CLOUDKIT
|
101
|
-
enabled_clean_options[app_service.
|
103
|
+
enabled_clean_options[app_service.cloud.on.service_id] = app_service.cloud.on
|
102
104
|
enabled_clean_options[app_service.cloud_kit.cloud_kit.service_id] = app_service.cloud_kit.cloud_kit
|
103
105
|
end
|
104
106
|
else
|
@@ -37,8 +37,9 @@ module Produce
|
|
37
37
|
|
38
38
|
def valid_services_for(options)
|
39
39
|
allowed_keys = [:app_group, :apple_pay, :associated_domains, :data_protection, :game_center, :healthkit, :homekit,
|
40
|
-
:
|
41
|
-
:
|
40
|
+
:hotspot, :icloud, :in_app_purchase, :inter_app_audio, :multipath, :network_extension,
|
41
|
+
:nfc_tag_reading, :personal_vpn, :passbook, :push_notification, :sirikit, :vpn_conf,
|
42
|
+
:wallet, :wireless_conf]
|
42
43
|
options.__hash__.select { |key, value| allowed_keys.include?(key) }
|
43
44
|
end
|
44
45
|
|
@@ -125,6 +126,16 @@ module Produce
|
|
125
126
|
end
|
126
127
|
end
|
127
128
|
|
129
|
+
if options.wallet
|
130
|
+
UI.message("\tWallet")
|
131
|
+
|
132
|
+
if on
|
133
|
+
app.update_service(Spaceship.app_service.wallet.on)
|
134
|
+
else
|
135
|
+
app.update_service(Spaceship.app_service.wallet.off)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
128
139
|
if options.wireless_conf
|
129
140
|
UI.message("\tWireless Accessory Configuration")
|
130
141
|
|
@@ -141,16 +152,16 @@ module Produce
|
|
141
152
|
if on
|
142
153
|
case options.icloud
|
143
154
|
when "legacy"
|
144
|
-
app.update_service(Spaceship.app_service.
|
155
|
+
app.update_service(Spaceship.app_service.cloud.on)
|
145
156
|
app.update_service(Spaceship.app_service.cloud_kit.xcode5_compatible)
|
146
157
|
when "cloudkit"
|
147
|
-
app.update_service(Spaceship.app_service.
|
158
|
+
app.update_service(Spaceship.app_service.cloud.on)
|
148
159
|
app.update_service(Spaceship.app_service.cloud_kit.cloud_kit)
|
149
160
|
else
|
150
161
|
UI.user_error!("Unknown service '#{options.icloud}'. Valid values: 'legacy', 'cloudkit'")
|
151
162
|
end
|
152
163
|
else
|
153
|
-
app.update_service(Spaceship.app_service.
|
164
|
+
app.update_service(Spaceship.app_service.cloud.off)
|
154
165
|
end
|
155
166
|
end
|
156
167
|
|
@@ -174,6 +185,17 @@ module Produce
|
|
174
185
|
end
|
175
186
|
end
|
176
187
|
|
188
|
+
if options.personal_vpn
|
189
|
+
UI.message("\tPersonal VPN")
|
190
|
+
|
191
|
+
if on
|
192
|
+
app.update_service(Spaceship.app_service.personal_vpn.on)
|
193
|
+
else
|
194
|
+
app.update_service(Spaceship.app_service.personal_vpn.off)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# deprecated
|
177
199
|
if options.passbook
|
178
200
|
UI.message("\tPassbook")
|
179
201
|
|
@@ -204,6 +226,7 @@ module Produce
|
|
204
226
|
end
|
205
227
|
end
|
206
228
|
|
229
|
+
# deprecated
|
207
230
|
if options.vpn_conf
|
208
231
|
UI.message("\tVPN Configuration")
|
209
232
|
|
@@ -80,22 +80,14 @@ module Snapshot
|
|
80
80
|
|
81
81
|
private
|
82
82
|
|
83
|
-
# Creates an alias for require to prevent `rubocop/require_tools`
|
84
|
-
# from failing. This eventually change it when `simctl` doesn't
|
85
|
-
# execute shell commands at the top-level anymore
|
86
|
-
#
|
87
|
-
# Issue: https://github.com/fastlane/fastlane/issues/12071
|
88
|
-
alias silence_the_horrible_require_checker require
|
89
|
-
|
90
83
|
def get_device_type_with_simctl(device_names)
|
91
84
|
return device_names if Helper.test?
|
92
85
|
|
93
|
-
|
86
|
+
require("simctl")
|
94
87
|
|
95
88
|
# Gets actual simctl device type from device name
|
96
89
|
return device_names.map do |device_name|
|
97
|
-
|
98
|
-
device = SimCtl.device(name: device_name) # rubocop:disable Require/MissingRequireStatement
|
90
|
+
device = SimCtl.device(name: device_name)
|
99
91
|
if device
|
100
92
|
device.devicetype.name
|
101
93
|
end
|
@@ -47,19 +47,21 @@ module Spaceship
|
|
47
47
|
GameCenter = AppService.new_service("gameCenter")
|
48
48
|
HealthKit = AppService.new_service("HK421J6T7P")
|
49
49
|
HomeKit = AppService.new_service("homeKit")
|
50
|
-
|
50
|
+
Hotspot = AppService.new_service("HSC639VEI8")
|
51
51
|
Cloud = AppService.new_service("iCloud")
|
52
52
|
CloudKit = AppService.new_service("cloudKitVersion", values: { xcode5_compatible: 1, cloud_kit: 2 })
|
53
53
|
InAppPurchase = AppService.new_service("inAppPurchase")
|
54
54
|
InterAppAudio = AppService.new_service("IAD53UNK2F")
|
55
|
+
Multipath = AppService.new_service("MP49FN762P")
|
56
|
+
NetworkExtension = AppService.new_service("NWEXT04537")
|
57
|
+
NFCTagReading = AppService.new_service("NFCTRMAY17")
|
58
|
+
PersonalVPN = AppService.new_service("V66P55NK2I")
|
55
59
|
Passbook = AppService.new_service("pass")
|
56
60
|
PushNotification = AppService.new_service("push")
|
57
61
|
SiriKit = AppService.new_service("SI015DKUHP")
|
58
62
|
VPNConfiguration = AppService.new_service("V66P55NK2I")
|
59
|
-
|
60
|
-
|
61
|
-
Multipath = AppService.new_service("MP49FN762P")
|
62
|
-
NFCTagReading = AppService.new_service("NFCTRMAY17")
|
63
|
+
Wallet = AppService.new_service("passbook")
|
64
|
+
WirelessAccessory = AppService.new_service("WC421J6T7P")
|
63
65
|
|
64
66
|
constants.each do |c|
|
65
67
|
name = c.to_s
|
@@ -115,6 +115,13 @@ module Spaceship
|
|
115
115
|
handle_response(response)
|
116
116
|
end
|
117
117
|
|
118
|
+
def delete_group_for_app(app_id: nil, group_id: nil)
|
119
|
+
assert_required_params(__method__, binding)
|
120
|
+
url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}"
|
121
|
+
response = request(:delete, url)
|
122
|
+
handle_response(response)
|
123
|
+
end
|
124
|
+
|
118
125
|
def add_group_to_build(app_id: nil, group_id: nil, build_id: nil)
|
119
126
|
assert_required_params(__method__, binding)
|
120
127
|
|
@@ -30,6 +30,11 @@ module Spaceship::TestFlight
|
|
30
30
|
self.new(data)
|
31
31
|
end
|
32
32
|
|
33
|
+
def self.delete!(app_id: nil, group_name: nil)
|
34
|
+
group = self.find(app_id: app_id, group_name: group_name)
|
35
|
+
client.delete_group_for_app(app_id: app_id, group_id: group.id)
|
36
|
+
end
|
37
|
+
|
33
38
|
def self.all(app_id: nil)
|
34
39
|
groups = client.get_groups(app_id: app_id)
|
35
40
|
groups.map { |g| self.new(g) }
|
metadata
CHANGED
@@ -1,33 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.89.0
|
4
|
+
version: 2.89.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
- Helmut Januschka
|
9
|
-
- Joshua Liebowitz
|
10
|
-
- Jan Piotrowski
|
7
|
+
- Manu Wallner
|
11
8
|
- Jorge Revuelta H
|
12
|
-
- Maksym Grebenets
|
13
|
-
- Danielle Tomlinson
|
14
9
|
- Olivier Halligon
|
15
|
-
- Fumiya Nakamura
|
16
|
-
- Felix Krause
|
17
|
-
- Manu Wallner
|
18
|
-
- Andrew McBurney
|
19
10
|
- Matthew Ellis
|
20
|
-
- Jimmy Dee
|
21
|
-
- Iulian Onofrei
|
22
|
-
- Stefan Natchev
|
23
11
|
- Jérôme Lacoste
|
12
|
+
- Danielle Tomlinson
|
13
|
+
- Helmut Januschka
|
14
|
+
- Felix Krause
|
15
|
+
- Joshua Liebowitz
|
24
16
|
- Josh Holtz
|
25
|
-
-
|
17
|
+
- Iulian Onofrei
|
18
|
+
- Jan Piotrowski
|
26
19
|
- Aaron Brager
|
20
|
+
- Jimmy Dee
|
21
|
+
- Luka Mirosevic
|
22
|
+
- Kohki Miki
|
23
|
+
- Stefan Natchev
|
24
|
+
- Maksym Grebenets
|
25
|
+
- Fumiya Nakamura
|
26
|
+
- Andrew McBurney
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2018-04-
|
30
|
+
date: 2018-04-03 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|
@@ -597,14 +597,14 @@ dependencies:
|
|
597
597
|
requirements:
|
598
598
|
- - "~>"
|
599
599
|
- !ruby/object:Gem::Version
|
600
|
-
version:
|
600
|
+
version: 1.6.3
|
601
601
|
type: :runtime
|
602
602
|
prerelease: false
|
603
603
|
version_requirements: !ruby/object:Gem::Requirement
|
604
604
|
requirements:
|
605
605
|
- - "~>"
|
606
606
|
- !ruby/object:Gem::Version
|
607
|
-
version:
|
607
|
+
version: 1.6.3
|
608
608
|
- !ruby/object:Gem::Dependency
|
609
609
|
name: google-api-client
|
610
610
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1622,24 +1622,24 @@ metadata:
|
|
1622
1622
|
post_install_message:
|
1623
1623
|
rdoc_options: []
|
1624
1624
|
require_paths:
|
1625
|
-
-
|
1626
|
-
- fastlane/lib
|
1625
|
+
- credentials_manager/lib
|
1627
1626
|
- pem/lib
|
1627
|
+
- snapshot/lib
|
1628
|
+
- frameit/lib
|
1629
|
+
- match/lib
|
1628
1630
|
- fastlane_core/lib
|
1629
|
-
-
|
1631
|
+
- deliver/lib
|
1632
|
+
- scan/lib
|
1633
|
+
- supply/lib
|
1630
1634
|
- cert/lib
|
1631
|
-
-
|
1632
|
-
- snapshot/lib
|
1635
|
+
- fastlane/lib
|
1633
1636
|
- spaceship/lib
|
1634
|
-
-
|
1635
|
-
- sigh/lib
|
1636
|
-
- deliver/lib
|
1637
|
+
- pilot/lib
|
1637
1638
|
- gym/lib
|
1639
|
+
- precheck/lib
|
1638
1640
|
- screengrab/lib
|
1641
|
+
- sigh/lib
|
1639
1642
|
- produce/lib
|
1640
|
-
- scan/lib
|
1641
|
-
- supply/lib
|
1642
|
-
- frameit/lib
|
1643
1643
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1644
1644
|
requirements:
|
1645
1645
|
- - ">="
|
@@ -1647,12 +1647,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1647
1647
|
version: 2.0.0
|
1648
1648
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1649
1649
|
requirements:
|
1650
|
-
- - "
|
1650
|
+
- - ">="
|
1651
1651
|
- !ruby/object:Gem::Version
|
1652
|
-
version:
|
1652
|
+
version: '0'
|
1653
1653
|
requirements: []
|
1654
1654
|
rubyforge_project:
|
1655
|
-
rubygems_version: 2.5.2.
|
1655
|
+
rubygems_version: 2.5.2.2
|
1656
1656
|
signing_key:
|
1657
1657
|
specification_version: 4
|
1658
1658
|
summary: The easiest way to automate beta deployments and releases for your iOS and
|