fastlane-plugin-schindler 1.0.1 → 1.1.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 +149 -5
- data/lib/fastlane/plugin/schindler/actions/schindler_action.rb +110 -75
- data/lib/fastlane/plugin/schindler/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d7583e26bfcb742720ddd40b67925bfdbf24b727bdd95d8a217a9d7848d9a92
|
4
|
+
data.tar.gz: eb8be5ad671c3b58ea8fbbd4e342202fecee2fed6515d0d3bb98f60f2464e1f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13641045bedca00ebf8f966c9675189271f71e6b3eb0ad5915c008239b2cf6abc4823424eab05a55760100e1269d3bfd95b549a0228dac3ad6f10e78b97aeab1
|
7
|
+
data.tar.gz: bb7b2c68347141637d668b485f4e298324af081390d4c5816ab5e9a43d7a5b19379d0c9266f98a964a68c5427e63eff625d0c662e4ff4680ae3541de50850e0e
|
data/README.md
CHANGED
@@ -7,12 +7,23 @@
|
|
7
7
|
|
8
8
|
Schindler is a TestFlight automatic processing tool, which is used to maintain the number of TestFlight quota, eliminate useless testers, and improve the external gray effect of iOS.
|
9
9
|
|
10
|
+
## Change Log
|
11
|
+
|
12
|
+
| Date | Version | Content |
|
13
|
+
|--|--|-------|
|
14
|
+
| 2023-08-10 |1.1.0| 1. Adapts to App Store Connect API 2.4|
|
15
|
+
||| 2. Remove only Publick link testers, as email tester cannot be removed|
|
16
|
+
||| 3. No more deleting Unused testers|
|
17
|
+
||| 4. Multi-group account friendly, providing optional parameters Developer Portal Team ID, App Store Connect Team ID|
|
18
|
+
||| 5. Full English log|
|
19
|
+
| 2022-09-30 |1.0.1| 1. Remove TestFlight testers that are not actually testing your app, support the following 3 categories: Uninstall, Expired, Unused|
|
20
|
+
|
10
21
|
|
11
22
|
## Getting Started
|
12
23
|
|
13
24
|
This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. To get started with `fastlane-plugin-schindler`, add it to your project by running:
|
14
25
|
|
15
|
-
```
|
26
|
+
```shell
|
16
27
|
fastlane add_plugin schindler
|
17
28
|
```
|
18
29
|
|
@@ -23,7 +34,7 @@ fastlane add_plugin schindler
|
|
23
34
|
|
24
35
|
## Example
|
25
36
|
### 1. Fastlane Ready
|
26
|
-
```
|
37
|
+
```shell
|
27
38
|
# install fastlane
|
28
39
|
gem install fastlane
|
29
40
|
# create a workspace
|
@@ -40,11 +51,13 @@ Edit ./fastlane/Fastfile,for example:
|
|
40
51
|
# A sample Fastfile
|
41
52
|
lane :delete do
|
42
53
|
schindler(
|
43
|
-
filter_type: "
|
54
|
+
filter_type: "3", # Optional, '1'-Not installed, '2'-Expired, '7'-All(1 | 2), default 3
|
44
55
|
auto_confirm: "auto", # Optional, 'auto'-skip, default no. Skip the second confirmation, or wait for user confirmation before deleting after scanning
|
45
56
|
user_id: "xjk_001@163.com", # Your AppID for login App Store Connect
|
46
|
-
user_password: "********", #
|
47
|
-
ios_app_id: "11112222"
|
57
|
+
user_password: "********", # Optional, AppID password
|
58
|
+
ios_app_id: "11112222", # The ID of the app in the Apple Store
|
59
|
+
portal_team_id: "my_team_id", # Optional, Developer Portal Team ID
|
60
|
+
itc_team_id: "my_itc_team_id" # Optional, App Store Connect Team ID
|
48
61
|
)
|
49
62
|
end
|
50
63
|
|
@@ -69,6 +82,137 @@ To automatically fix many of the styling issues, use
|
|
69
82
|
rubocop -a
|
70
83
|
```
|
71
84
|
|
85
|
+
## Extras(important by 08/10/2023)
|
86
|
+
Due to changes in App Store Connect API 2.4, beta_tester_metrics for betaTesters in Spaceship are invalid, resulting in Tester status information no longer being available.
|
87
|
+
|
88
|
+
Based on the betaTesters interface (appstoreconnect.apple.com/iris/v1/betaTesters), I updated this repository. And submitted the commit to fastlane.
|
89
|
+
|
90
|
+
Consider that it takes time and days for the commit to go through, so while waiting for it to go through, if you get an error running this script, scroll down.
|
91
|
+
|
92
|
+
### Find local fastlane
|
93
|
+
First, we need to find the betaTesters file in the local fastlane
|
94
|
+
|
95
|
+
```shell
|
96
|
+
# Get local gem folder path
|
97
|
+
which fastlane
|
98
|
+
# Assuming that the previous step yields '/Users/hongtao/.mtl-cli-env/gems/bin/fastlane'
|
99
|
+
|
100
|
+
# Further find the specific fastlane version, note that here you need to open the gem folder by deleting the path to fastlane (replace '/bin/fastlane' at the end with '/gems') and then append the path to gems (/gems).
|
101
|
+
open /Users/hongtao/.mtl-cli-env/gems/gems
|
102
|
+
|
103
|
+
# After opening finder, find the latest local version of fastlane, for example, the author's local is fastlane-2.214.0, drag this folder to the terminal window and append '/spaceship/lib/spaceship/connect_api/models/beta_tester.rb' to the end. , and then open this file
|
104
|
+
open /Users/hongtao/.mtl-cli-env/gems/gems/fastlane-2.214.0/spaceship/lib/spaceship/connect_api/models/beta_tester.rb
|
105
|
+
```
|
106
|
+
|
107
|
+
### Modify local fastlane
|
108
|
+
Second, we need to manually modify the betaTesters property in the local fastlane
|
109
|
+
|
110
|
+
before modification
|
111
|
+
```ruby
|
112
|
+
require_relative '../model'
|
113
|
+
module Spaceship
|
114
|
+
class ConnectAPI
|
115
|
+
class BetaTester
|
116
|
+
include Spaceship::ConnectAPI::Model
|
117
|
+
|
118
|
+
attr_accessor :first_name
|
119
|
+
attr_accessor :last_name
|
120
|
+
attr_accessor :email
|
121
|
+
attr_accessor :invite_type
|
122
|
+
attr_accessor :invitation
|
123
|
+
|
124
|
+
attr_accessor :apps
|
125
|
+
attr_accessor :beta_groups
|
126
|
+
attr_accessor :beta_tester_metrics
|
127
|
+
attr_accessor :builds
|
128
|
+
|
129
|
+
attr_mapping({
|
130
|
+
"firstName" => "first_name",
|
131
|
+
"lastName" => "last_name",
|
132
|
+
"email" => "email",
|
133
|
+
"inviteType" => "invite_type",
|
134
|
+
"invitation" => "invitation",
|
135
|
+
|
136
|
+
"apps" => "apps",
|
137
|
+
"betaGroups" => "beta_groups",
|
138
|
+
"betaTesterMetrics" => "beta_tester_metrics",
|
139
|
+
"builds" => "builds"
|
140
|
+
})
|
141
|
+
|
142
|
+
......
|
143
|
+
```
|
144
|
+
|
145
|
+
after modification
|
146
|
+
```ruby
|
147
|
+
require_relative '../model'
|
148
|
+
module Spaceship
|
149
|
+
class ConnectAPI
|
150
|
+
class BetaTester
|
151
|
+
include Spaceship::ConnectAPI::Model
|
152
|
+
|
153
|
+
attr_accessor :first_name
|
154
|
+
attr_accessor :last_name
|
155
|
+
attr_accessor :email
|
156
|
+
attr_accessor :invite_type
|
157
|
+
attr_accessor :invitation
|
158
|
+
|
159
|
+
attr_accessor :apps
|
160
|
+
attr_accessor :beta_groups
|
161
|
+
attr_accessor :beta_tester_metrics
|
162
|
+
attr_accessor :builds
|
163
|
+
|
164
|
+
# add by xjkstar 2023-08-09
|
165
|
+
attr_accessor :isDeleted
|
166
|
+
attr_accessor :beta_tester_state
|
167
|
+
attr_accessor :last_modified_date
|
168
|
+
attr_accessor :installedCfBundleShortVersionString
|
169
|
+
attr_accessor :installedCfBundleVersion
|
170
|
+
attr_accessor :removeAfterDate
|
171
|
+
attr_accessor :latestExpiringCfBundleShortVersionString
|
172
|
+
attr_accessor :latestExpiringCfBundleVersionString
|
173
|
+
attr_accessor :installedDevice
|
174
|
+
attr_accessor :installedOsVersion
|
175
|
+
attr_accessor :installedDevicePlatform
|
176
|
+
attr_accessor :installedAppPlatform
|
177
|
+
|
178
|
+
attr_mapping({
|
179
|
+
"firstName" => "first_name",
|
180
|
+
"lastName" => "last_name",
|
181
|
+
"email" => "email",
|
182
|
+
"inviteType" => "invite_type",
|
183
|
+
"invitation" => "invitation",
|
184
|
+
|
185
|
+
"apps" => "apps",
|
186
|
+
"betaGroups" => "beta_groups",
|
187
|
+
"betaTesterMetrics" => "beta_tester_metrics",
|
188
|
+
"builds" => "builds",
|
189
|
+
|
190
|
+
# add by xjkstar 2023-08-09
|
191
|
+
"isDeleted" => "isDeleted",
|
192
|
+
"betaTesterState" => "beta_tester_state",
|
193
|
+
"lastModifiedDate" => "last_modified_date",
|
194
|
+
"installedCfBundleShortVersionString" => "installedCfBundleShortVersionString",
|
195
|
+
"installedCfBundleVersion" => "installedCfBundleVersion",
|
196
|
+
"removeAfterDate" => "removeAfterDate",
|
197
|
+
"latestExpiringCfBundleShortVersionString" => "latestExpiringCfBundleShortVersionString",
|
198
|
+
"latestExpiringCfBundleVersionString" => "latestExpiringCfBundleVersionString",
|
199
|
+
"installedDevice" => "installedDevice",
|
200
|
+
"installedOsVersion" => "installedOsVersion",
|
201
|
+
"installedDevicePlatform" => "installedDevicePlatform",
|
202
|
+
"installedAppPlatform" => "installedAppPlatform"
|
203
|
+
})
|
204
|
+
|
205
|
+
......
|
206
|
+
```
|
207
|
+
|
208
|
+
### Let's go
|
209
|
+
Changes complete, up and running
|
210
|
+
|
211
|
+
```shell
|
212
|
+
fastlane delete
|
213
|
+
```
|
214
|
+
|
215
|
+
|
72
216
|
## Issues and Feedback
|
73
217
|
|
74
218
|
For any other issues and feedback about this plugin, please submit it to this repository.
|
@@ -11,7 +11,7 @@ module Fastlane
|
|
11
11
|
Filter_UnUse = 1 << 2
|
12
12
|
|
13
13
|
def self.run(params)
|
14
|
-
UI.message('The schindler plugin is working
|
14
|
+
UI.message('The schindler plugin is working!🚀🚀🚀')
|
15
15
|
|
16
16
|
ARGV.clear
|
17
17
|
|
@@ -20,18 +20,19 @@ module Fastlane
|
|
20
20
|
user_id = params[:user_id].to_s
|
21
21
|
user_password = params[:user_password].to_s
|
22
22
|
ios_app_id = params[:ios_app_id].to_s
|
23
|
-
|
23
|
+
portal_team_id = params[:portal_team_id].to_s
|
24
|
+
itc_team_id = params[:itc_team_id].to_s
|
25
|
+
puts "================================\nNew task begin, initialize parameter information: \nFilter type (bit operation): #{filter_type} (#{Filter_Uninstall}-Uninstall,#{Filter_Expire}-Expire,#{Filter_UnUse}-UnUse)\nSkip secondary confirmation: #{auto_confirm}\nUserID: #{user_id}\nPassword: ******\nAppID: #{ios_app_id}\nPortal Team ID: #{portal_team_id}\nITC Team ID: #{itc_team_id}\n================================"
|
24
26
|
|
25
27
|
# 先扫描未安装、已过期
|
26
28
|
if (filter_type & Filter_Uninstall > 0) || (filter_type & Filter_Expire > 0)
|
27
|
-
add_process_uninstall_expired(filter_type: filter_type, auto_confirm: auto_confirm,
|
28
|
-
user_id: user_id, user_password: user_password)
|
29
|
+
add_process_uninstall_expired(filter_type: filter_type, auto_confirm: auto_confirm, params: params)
|
29
30
|
end
|
30
31
|
# 再扫描未使用,因为未使用需要全量查询,耗时1小时起步,容易超时
|
31
|
-
if filter_type & Filter_UnUse > 0
|
32
|
-
|
33
|
-
|
34
|
-
end
|
32
|
+
# if filter_type & Filter_UnUse > 0
|
33
|
+
# add_process_unused(auto_confirm: auto_confirm, ios_app_id: ios_app_id, user_id: user_id,
|
34
|
+
# user_password: user_password)
|
35
|
+
# end
|
35
36
|
end
|
36
37
|
|
37
38
|
def self.exec_process(testers, filter_type, auto_confirm)
|
@@ -47,58 +48,63 @@ module Fastlane
|
|
47
48
|
testers.each do |tester|
|
48
49
|
# puts "测试员信息:#{tester.to_json}"
|
49
50
|
|
50
|
-
unless tester.respond_to?(:
|
51
|
-
puts "\n\n~~~~~~~~~~
|
51
|
+
unless tester.respond_to?(:beta_tester_state)
|
52
|
+
puts "\n\n~~~~~~~~~~ 🏃Exception skip: illegal BetaTester data ~~~~~~~~~~"
|
53
|
+
next
|
54
|
+
end
|
55
|
+
|
56
|
+
unless tester.invite_type == 'PUBLIC_LINK'
|
57
|
+
puts "\n\n~~~~~~~~~~ 🏃Ignore: Only delete testers invited by the public link ~~~~~~~~~~"
|
52
58
|
next
|
53
59
|
end
|
54
60
|
|
55
61
|
id = tester.id.to_s
|
56
|
-
|
57
|
-
|
58
|
-
puts "测试员:#{tester.id} 状态-#{tester_state}"
|
62
|
+
tester_state = tester.beta_tester_state
|
63
|
+
puts "TesterID:#{tester.id} state-#{tester_state}"
|
59
64
|
|
60
|
-
if
|
61
|
-
modified_date = string2date(
|
65
|
+
if tester.beta_tester_state == "INSTALLED"
|
66
|
+
modified_date = string2date(tester.last_modified_date)
|
62
67
|
next if modified_date.nil?
|
63
68
|
|
64
69
|
last_date = modified_date.getlocal.to_i
|
65
|
-
puts "
|
70
|
+
puts "last_modified_date:#{modified_date}"
|
66
71
|
# 在sevenDaySessionCount支持前,暂时用session_count + lastModifiedDate
|
67
|
-
|
72
|
+
# session_count被苹果废弃, by hongtao 2023/08/09
|
73
|
+
# count = tester.session_count.to_i
|
68
74
|
|
69
75
|
if (filter_type & Filter_Expire) > 0 && last_date < expiredtime
|
70
76
|
# 过期
|
71
77
|
ids << id
|
72
78
|
|
73
|
-
puts '=====
|
74
|
-
elsif (filter_type & Filter_UnUse) > 0 && count < 1 && last_date < sevendaytime
|
75
|
-
|
76
|
-
|
79
|
+
puts '===== 🐷Expire +1 ====='
|
80
|
+
# elsif (filter_type & Filter_UnUse) > 0 && count < 1 && last_date < sevendaytime
|
81
|
+
# # 超过7天未使用
|
82
|
+
# ids << id
|
77
83
|
|
78
|
-
|
84
|
+
# puts '===== 🐷未使用 +1 ====='
|
79
85
|
end
|
80
86
|
elsif filter_type & Filter_Uninstall > 0
|
81
87
|
ids << id
|
82
88
|
|
83
|
-
puts '=====
|
89
|
+
puts '===== 🐷Uninstall +1 ====='
|
84
90
|
end
|
85
91
|
end
|
86
92
|
|
87
|
-
puts "\n
|
93
|
+
puts "\nTester screening completed\n================================"
|
88
94
|
if ids.size < 1
|
89
|
-
puts "
|
95
|
+
puts "🎉Under the current rules, the testers have deleted🎉\n================================"
|
90
96
|
return []
|
91
97
|
end
|
92
98
|
|
93
99
|
unless auto_confirm
|
94
|
-
puts "
|
100
|
+
puts "Delete TestFlight tester count: #{ids.size}? (Y/n)"
|
95
101
|
if gets.chomp != 'Y'
|
96
|
-
puts "Cancel
|
102
|
+
puts "Cancel,Task cancel, this task is over\n================================"
|
97
103
|
return []
|
98
104
|
end
|
99
105
|
end
|
100
106
|
|
101
|
-
ids
|
107
|
+
return ids
|
102
108
|
end
|
103
109
|
|
104
110
|
def self.string2date(origin_date_string)
|
@@ -131,54 +137,71 @@ module Fastlane
|
|
131
137
|
modified_date
|
132
138
|
end
|
133
139
|
|
134
|
-
def self.add_process_unused(auto_confirm: false, ios_app_id: nil, user_id: nil, user_password: nil)
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
140
|
+
# def self.add_process_unused(auto_confirm: false, ios_app_id: nil, user_id: nil, user_password: nil)
|
141
|
+
# # 查询全量数据,但容易超时,未使用的用户只能全量查询
|
142
|
+
# puts "#{DateTime.now.to_time} 开始获取App数据……"
|
143
|
+
# app = Spaceship::ConnectAPI::App.get(app_id: ios_app_id)
|
144
|
+
|
145
|
+
# puts "#{DateTime.now.to_time} 开始获取测试人员列表,带薪喝茶时间……"
|
146
|
+
# testers = nil
|
147
|
+
# if app
|
148
|
+
# puts 'App get_beta_testers'
|
149
|
+
# testers = app.get_beta_testers(filter: { apps: ios_app_id, isDeleted: false }, includes: 'betaTesterMetrics',
|
150
|
+
# sort: 'betaTesterMetrics.betaTesterState', limit: 20)
|
151
|
+
# else
|
152
|
+
# puts 'Spaceship::ConnectAPI::BetaTester'
|
153
|
+
# testers = Spaceship::ConnectAPI::BetaTester.all(filter: { apps: ios_app_id, isDeleted: false },
|
154
|
+
# includes: 'betaTesterMetrics', sort: 'betaTesterMetrics.betaTesterState', limit: 200)
|
155
|
+
# end
|
156
|
+
# puts "#{DateTime.now.to_time} 获取测试人员列表成功,共#{testers.count}个"
|
157
|
+
|
158
|
+
# ids = exec_process(testers, Filter_UnUse, auto_confirm)
|
159
|
+
# return if ids.size < 1
|
160
|
+
|
161
|
+
# itc_team_id = '82324800'
|
162
|
+
# team_id = "9SR35Y6UHD"
|
163
|
+
# # 每次查询Top 50,直到没有符合的记录,适合按状态排序后的扫描
|
164
|
+
# client = Spaceship::ConnectAPI::Client.login(user_id, user_password, portal_team_id: team_id, tunes_team_id: itc_team_id)
|
165
|
+
# puts '登录成功'
|
166
|
+
# client.delete_beta_testers_from_app(beta_tester_ids: ids, app_id: ios_app_id)
|
167
|
+
# puts "Success,删除#{ids.size}个测试人员成功\n================================"
|
168
|
+
# end
|
169
|
+
|
170
|
+
def self.add_process_uninstall_expired(filter_type: (Filter_Uninstall | Filter_Expire), auto_confirm: false, params: nil)
|
171
|
+
user_id = params[:user_id].to_s
|
172
|
+
user_password = params[:user_password].to_s
|
173
|
+
ios_app_id = params[:ios_app_id].to_s
|
174
|
+
team_id = params[:portal_team_id].to_s
|
175
|
+
itc_team_id = params[:itc_team_id].to_s
|
162
176
|
# 每次查询Top 50,直到没有符合的记录,适合按状态排序后的扫描
|
163
|
-
client = Spaceship::ConnectAPI::Client.login(user_id, user_password)
|
164
|
-
puts '
|
177
|
+
client = Spaceship::ConnectAPI::Client.login(user_id, user_password, portal_team_id: team_id, tunes_team_id: itc_team_id)
|
178
|
+
puts 'ConnectAPI login success🎉'
|
165
179
|
|
180
|
+
deleteCount = 0
|
166
181
|
while true
|
167
|
-
puts "#{DateTime.now.to_time}
|
182
|
+
puts "#{DateTime.now.to_time} Start getting a list of testers, take a cup of tea🍵……"
|
168
183
|
testers = client.get_beta_testers(filter: { apps: ios_app_id, isDeleted: false },
|
169
|
-
includes: 'betaTesterMetrics',
|
184
|
+
includes: 'betaTesterMetrics',
|
185
|
+
sort: 'betaTesterMetrics.betaTesterState',
|
186
|
+
limit: 100)
|
170
187
|
|
171
|
-
puts "#{DateTime.now.to_time}
|
188
|
+
puts "#{DateTime.now.to_time} Get tester list complete, #{testers.count} in count"
|
172
189
|
|
173
190
|
ids = exec_process(testers, filter_type, auto_confirm)
|
174
191
|
if ids.size < 1
|
175
|
-
puts "
|
176
|
-
|
192
|
+
puts "Uninstall or Expired Tester cleared🎉🎉🎉\n================================"
|
193
|
+
break
|
177
194
|
end
|
178
195
|
|
179
|
-
|
180
|
-
|
196
|
+
begin
|
197
|
+
client.delete_beta_testers_from_app(beta_tester_ids: ids, app_id: ios_app_id)
|
198
|
+
rescue => e
|
199
|
+
puts "delete error, but the program continues to execute🤔. exception detail: #{e}"
|
200
|
+
end
|
201
|
+
deleteCount = deleteCount + ids.size
|
181
202
|
end
|
203
|
+
|
204
|
+
puts "Success,deletion of #{deleteCount} testers successful🦋\n================================"
|
182
205
|
end
|
183
206
|
|
184
207
|
#####################################################
|
@@ -199,20 +222,20 @@ module Fastlane
|
|
199
222
|
|
200
223
|
def self.details
|
201
224
|
# Optional:
|
202
|
-
'Schindler is a TestFlight automatic processing tool, which is used to maintain the number of TestFlight quota, eliminate useless testers, and improve the external gray effect of iOS.'
|
225
|
+
'Remove TestFlight testers that are not actually testing your app. Schindler is a TestFlight automatic processing tool, which is used to maintain the number of TestFlight quota, eliminate useless testers, and improve the external gray effect of iOS App.'
|
203
226
|
end
|
204
227
|
|
205
228
|
def self.available_options
|
206
229
|
[
|
207
230
|
FastlaneCore::ConfigItem.new(key: :filter_type,
|
208
231
|
env_name: 'SCHINDLER_FILTER_TYPE',
|
209
|
-
description: "'1'-Not installed, '2'-Expired, '
|
232
|
+
description: "'1'-Not installed, '2'-Expired, '3'-All(1 | 2), default 7",
|
210
233
|
optional: true,
|
211
|
-
default_value: '
|
234
|
+
default_value: '3',
|
212
235
|
type: String),
|
213
236
|
FastlaneCore::ConfigItem.new(key: :auto_confirm,
|
214
237
|
env_name: 'SCHINDLER_AUTO_CONFIRM',
|
215
|
-
description: "'auto'-skip, default no. Skip the second confirmation, or wait for user confirmation before deleting after scanning",
|
238
|
+
description: "'auto'-skip, default no. Skip the second confirmation, or wait for user confirmation before deleting after scanning (optional)",
|
216
239
|
optional: true,
|
217
240
|
default_value: 'none',
|
218
241
|
type: String),
|
@@ -223,14 +246,24 @@ module Fastlane
|
|
223
246
|
type: String),
|
224
247
|
FastlaneCore::ConfigItem.new(key: :user_password,
|
225
248
|
env_name: 'SCHINDLER_PASSWORD',
|
226
|
-
description: 'AppID password, support App private password',
|
227
|
-
optional:
|
249
|
+
description: 'AppID password, support App private password (optional)',
|
250
|
+
optional: true,
|
228
251
|
type: String),
|
229
252
|
FastlaneCore::ConfigItem.new(key: :ios_app_id,
|
230
253
|
env_name: 'SCHINDLER_APP_ID',
|
231
254
|
description: 'The ID of the app in the Apple Store',
|
232
255
|
optional: false,
|
233
|
-
type: String)
|
256
|
+
type: String),
|
257
|
+
FastlaneCore::ConfigItem.new(key: :portal_team_id,
|
258
|
+
env_name: 'SCHINDLER_PORTAL_TEAM_ID',
|
259
|
+
description: 'Developer Portal Team ID (optional)',
|
260
|
+
optional: true,
|
261
|
+
type: String),
|
262
|
+
FastlaneCore::ConfigItem.new(key: :itc_team_id,
|
263
|
+
env_name: 'SCHINDLER_ITC_TEAM_ID',
|
264
|
+
description: 'App Store Connect Team ID (optional)',
|
265
|
+
optional: true,
|
266
|
+
type: String)
|
234
267
|
]
|
235
268
|
end
|
236
269
|
|
@@ -245,11 +278,13 @@ module Fastlane
|
|
245
278
|
def self.example_code
|
246
279
|
[
|
247
280
|
'schindler(
|
248
|
-
filter_type: "
|
281
|
+
filter_type: "3", # Optional, eliminate useless testers
|
249
282
|
auto_confirm: "auto", # Optional, Skip the second confirmation
|
250
283
|
user_id: "my_username", # My AppID
|
251
|
-
user_password: "my_password", # My password
|
252
|
-
ios_app_id: "my_ios_app"
|
284
|
+
user_password: "my_password", # Optional, My password
|
285
|
+
ios_app_id: "my_ios_app", # The App which to be eliminated
|
286
|
+
portal_team_id: "my_team_id", # Optional, Developer Portal Team ID
|
287
|
+
itc_team_id: "my_itc_team_id" # Optional, App Store Connect Team ID
|
253
288
|
)'
|
254
289
|
]
|
255
290
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-schindler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xjkstar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -181,10 +181,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: '0'
|
183
183
|
requirements: []
|
184
|
-
rubygems_version: 3.1
|
184
|
+
rubygems_version: 3.0.3.1
|
185
185
|
signing_key:
|
186
186
|
specification_version: 4
|
187
|
-
summary:
|
188
|
-
|
189
|
-
gray effect
|
187
|
+
summary: Remove TestFlight testers that are not actually testing your app. Schindler
|
188
|
+
is a TestFlight automatic processing tool, which is used to maintain the number
|
189
|
+
of TestFlight quota, eliminate useless testers, and improve the external gray effect
|
190
|
+
of iOS.
|
190
191
|
test_files: []
|