pindo 4.8.6 → 4.8.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pindo/client/pgyerclient.rb +34 -1
- data/lib/pindo/command/android/debug.rb +73 -0
- data/lib/pindo/command/android.rb +14 -0
- data/lib/pindo/command/dev/autobuild.rb +2 -0
- data/lib/pindo/command/dev/build.rb +4 -1
- data/lib/pindo/command/dev/debug.rb +25 -15
- data/lib/pindo/command/gplay/iap.rb +43 -0
- data/lib/pindo/command/gplay/itcapp.rb +41 -0
- data/lib/pindo/command/gplay/metadata.rb +43 -0
- data/lib/pindo/command/gplay/screenshots.rb +43 -0
- data/lib/pindo/command/gplay/upload.rb +40 -0
- data/lib/pindo/command/gplay.rb +17 -0
- data/lib/pindo/command/ios/adhoc.rb +190 -0
- data/lib/pindo/command/ios/applovin.rb +241 -0
- data/lib/pindo/command/ios/autoresign.rb +164 -0
- data/lib/pindo/command/ios/build.rb +115 -0
- data/lib/pindo/command/ios/cert.rb +164 -0
- data/lib/pindo/command/ios/debug.rb +189 -0
- data/lib/pindo/command/ios.rb +18 -0
- data/lib/pindo/command/pgyer/apptest.rb +5 -1
- data/lib/pindo/command/pgyer/upload.rb +4 -4
- data/lib/pindo/command/unity/apk.rb +76 -0
- data/lib/pindo/command/unity/ipa.rb +76 -0
- data/lib/pindo/command/unity.rb +16 -0
- data/lib/pindo/command.rb +3 -1
- data/lib/pindo/module/appselect.rb +4 -0
- data/lib/pindo/module/cert/xcodecerthelper.rb +31 -17
- data/lib/pindo/module/pgyer/pgyerhelper.rb +18 -1
- data/lib/pindo/module/xcode/xcodehelper.rb +1 -1
- data/lib/pindo/options/deployoptions.rb +4 -0
- data/lib/pindo/version.rb +1 -1
- metadata +21 -6
@@ -0,0 +1,241 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require 'highline/import'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'json'
|
6
|
+
require 'faraday'
|
7
|
+
require 'xcodeproj'
|
8
|
+
|
9
|
+
module Pindo
|
10
|
+
class Command
|
11
|
+
class Ios < Command
|
12
|
+
class Applovin < Ios
|
13
|
+
|
14
|
+
self.summary = '接入applovin max广告平台时更新Xcode中info.plist'
|
15
|
+
|
16
|
+
self.description = <<-DESC
|
17
|
+
接入applovin max广告平台时更新Xcode中info.plist。
|
18
|
+
|
19
|
+
支持功能:
|
20
|
+
|
21
|
+
* 自动获取applovin广告平台的SKAdNetwork IDs
|
22
|
+
|
23
|
+
* 更新Xcode工程中的info.plist文件
|
24
|
+
|
25
|
+
* 支持保存SKAdNetwork IDs到本地配置
|
26
|
+
|
27
|
+
使用示例:
|
28
|
+
|
29
|
+
$ pindo ios applovin # 更新当前目录下工程的info.plist
|
30
|
+
|
31
|
+
$ pindo ios applovin --appstore # 使用AppStore模式更新
|
32
|
+
|
33
|
+
$ pindo ios applovin --install # 运行applovin安装脚本
|
34
|
+
|
35
|
+
$ pindo ios applovin --upload # 保存SKAdNetwork IDs到本地
|
36
|
+
DESC
|
37
|
+
|
38
|
+
self.arguments = [
|
39
|
+
]
|
40
|
+
|
41
|
+
def self.options
|
42
|
+
[
|
43
|
+
['--appstore', 'AppStore模式,一般不使用'],
|
44
|
+
['--install', '运行applovin安装脚本'],
|
45
|
+
['--upload', '保存SKAdNetwork IDs到本地配置'],
|
46
|
+
].concat(super)
|
47
|
+
end
|
48
|
+
|
49
|
+
def initialize(argv)
|
50
|
+
|
51
|
+
@args_appstore_flag = argv.flag?('appstore', false)
|
52
|
+
@args_install_flag = argv.flag?('install', false)
|
53
|
+
@args_upload_flag = argv.flag?('upload', false)
|
54
|
+
|
55
|
+
super(argv)
|
56
|
+
@additional_args = argv.remainder!
|
57
|
+
end
|
58
|
+
|
59
|
+
def validate!
|
60
|
+
super
|
61
|
+
end
|
62
|
+
|
63
|
+
def run
|
64
|
+
|
65
|
+
skadnetwork_id_array = []
|
66
|
+
|
67
|
+
Funlog.instance.fancyinfo_start("正在请求applovin数据...")
|
68
|
+
|
69
|
+
applovin_res_json = req_applovin_json
|
70
|
+
# puts JSON.pretty_generate(applovin_res_json)
|
71
|
+
|
72
|
+
if !applovin_res_json.nil? && !applovin_res_json["skadnetwork_ids"].nil?
|
73
|
+
applovin_res_json["skadnetwork_ids"].each do |network_id|
|
74
|
+
skadnetwork_id_array << network_id["skadnetwork_id"]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
applovin_media_res_json = req_applovin_mediia_json
|
79
|
+
# puts JSON.pretty_generate(applovin_media_res_json)
|
80
|
+
if !applovin_media_res_json.nil? && !applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].nil?
|
81
|
+
applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].each do |media_item|
|
82
|
+
skadnetwork_id_array = skadnetwork_id_array + media_item["skAdnetworkIds"]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
skadnetwork_id_array = skadnetwork_id_array.uniq || []
|
87
|
+
|
88
|
+
Funlog.instance.fancyinfo_success("请求applovin数据,获取到#{skadnetwork_id_array.size}条数据...")
|
89
|
+
|
90
|
+
if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 50
|
91
|
+
# puts "From Applovin SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
|
92
|
+
if @args_upload_flag
|
93
|
+
applovin_config_file = File.join(pindo_single_config.pindo_common_configdir,"applovin_client_config.json")
|
94
|
+
origin_json = {}
|
95
|
+
if File.exist?(applovin_config_file)
|
96
|
+
origin_json = JSON.parse(File.read(applovin_config_file))
|
97
|
+
end
|
98
|
+
origin_json["SKAdNetworkItems"] = skadnetwork_id_array
|
99
|
+
File.write(applovin_config_file, JSON.pretty_generate(origin_json))
|
100
|
+
git_addpush_repo(path:pindo_single_config.pindo_common_configdir, message:"Applovin SKAdNetworkItems", commit_file_params:["applovin_client_config.json"])
|
101
|
+
end
|
102
|
+
else
|
103
|
+
Funlog.instance.fancyinfo_start("网络拉取applovin数据太少,从缓存中获取数据...")
|
104
|
+
config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "applovin_client_config.json")
|
105
|
+
config_json = JSON.parse(File.read(config_file))
|
106
|
+
skadnetwork_id_array = skadnetwork_id_array + config_json["SKAdNetworkItems"]
|
107
|
+
# puts "From Config SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
|
108
|
+
Funlog.instance.fancyinfo_success("网络拉取applovin数据太少,从缓存中获取到#{skadnetwork_id_array.size}条数据...")
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
Funlog.instance.fancyinfo_start("正在写入Xcode中...")
|
113
|
+
|
114
|
+
skadnetwork_id_array = skadnetwork_id_array.uniq || []
|
115
|
+
|
116
|
+
project_root_dir = Dir.pwd
|
117
|
+
xcodeproj_file_name = Dir.glob(File.join(project_root_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
|
118
|
+
|
119
|
+
plist_file_name = File.join(project_root_dir, "AppEntry/Info.plist")
|
120
|
+
if !xcodeproj_file_name.nil?
|
121
|
+
proj_name = File.basename(xcodeproj_file_name, ".xcodeproj")
|
122
|
+
plist_file_name = get_applovin_infoplist(project_dir:project_root_dir, proj_name:proj_name)
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
info_plist_dict = {}
|
127
|
+
if File.exist?(plist_file_name)
|
128
|
+
info_plist_dict = Xcodeproj::Plist.read_from_path(plist_file_name)
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
info_plist_dict["NSAdvertisingAttributionReportEndpoint"] = info_plist_dict["NSAdvertisingAttributionReportEndpoint"] || "https://postbacks-app.com"
|
133
|
+
|
134
|
+
if !info_plist_dict.has_key?("NSAppTransportSecurity")
|
135
|
+
info_plist_dict["NSAppTransportSecurity"] = {}
|
136
|
+
info_plist_dict["NSAppTransportSecurity"]["NSAllowsArbitraryLoads"] = true
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 0
|
141
|
+
info_plist_dict["SKAdNetworkItems"] = []
|
142
|
+
skadnetwork_id_array.each do |network_id|
|
143
|
+
item = {}
|
144
|
+
item["SKAdNetworkIdentifier"] = network_id
|
145
|
+
info_plist_dict["SKAdNetworkItems"] << item
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file_name)
|
150
|
+
|
151
|
+
Funlog.instance.fancyinfo_success("Xcode中applovin数据修改完成!")
|
152
|
+
|
153
|
+
if @args_install_flag && !xcodeproj_file_name.nil? && File.exist?(xcodeproj_file_name)
|
154
|
+
|
155
|
+
pindo_common_dir = pindo_single_config.pindo_common_configdir
|
156
|
+
|
157
|
+
app_lovin_script = File.join(pindo_common_dir, "AppLovinQualityServiceSetup-ios-dev.rb")
|
158
|
+
if @args_appstore_flag
|
159
|
+
app_lovin_script = File.join(pindo_common_dir, "AppLovinQualityServiceSetup-ios.rb")
|
160
|
+
end
|
161
|
+
|
162
|
+
project_script_file = File.join(project_root_dir, "AppLovinQualityServiceSetup-ios.rb")
|
163
|
+
FileUtils.cp_r(app_lovin_script, project_script_file)
|
164
|
+
command = "ruby " + project_script_file
|
165
|
+
# puts command
|
166
|
+
system command
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
def get_applovin_infoplist(project_dir:nil, proj_name:nil)
|
174
|
+
|
175
|
+
info_plist_path = File.join(project_dir, "AppEntry/Info.plist")
|
176
|
+
proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
|
177
|
+
if File.exist?(proj_fullname)
|
178
|
+
project_obj = Xcodeproj::Project.open(proj_fullname)
|
179
|
+
project_obj.targets.each do |target|
|
180
|
+
|
181
|
+
if target.product_type.to_s.eql?("com.apple.product-type.application") then
|
182
|
+
temp_info = target.build_configurations.first.build_settings['INFOPLIST_FILE']
|
183
|
+
info_plist_path = File.join(project_dir, temp_info)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
return info_plist_path
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
def req_applovin_json
|
193
|
+
|
194
|
+
begin
|
195
|
+
# https://dash.applovin.com/docs/v1/skadnetwork_ids.json
|
196
|
+
applovin_url = "https://dash.applovin.com/docs/v1/skadnetwork_ids.json"
|
197
|
+
con = Faraday.new
|
198
|
+
res = con.get do |req|
|
199
|
+
req.url applovin_url
|
200
|
+
req.headers['Content-Type'] = 'application/json'
|
201
|
+
end
|
202
|
+
|
203
|
+
applovin_res_json = JSON.parse(res.body)
|
204
|
+
|
205
|
+
return applovin_res_json
|
206
|
+
rescue Exception => e
|
207
|
+
return nil
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
end
|
213
|
+
|
214
|
+
def req_applovin_mediia_json
|
215
|
+
|
216
|
+
|
217
|
+
begin
|
218
|
+
applovin_url = "https://dash.applovin.com/docs/v1/mediation_sk_adnetwork_ids"
|
219
|
+
con = Faraday.new
|
220
|
+
res = con.get do |req|
|
221
|
+
req.url applovin_url
|
222
|
+
req.headers['Content-Type'] = 'application/json'
|
223
|
+
end
|
224
|
+
|
225
|
+
applovin_res_json = JSON.parse(res.body)
|
226
|
+
return applovin_res_json
|
227
|
+
rescue Exception => e
|
228
|
+
return nil
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require 'xcodeproj'
|
3
|
+
require 'find'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'pindo/base/executable'
|
6
|
+
|
7
|
+
module Pindo
|
8
|
+
class Command
|
9
|
+
class Ios < Command
|
10
|
+
class Autoresign < Ios
|
11
|
+
|
12
|
+
include Appselect
|
13
|
+
self.summary = 'IPA包重签名工具'
|
14
|
+
|
15
|
+
self.description = <<-DESC
|
16
|
+
使用最新的证书重签名IPA包。
|
17
|
+
|
18
|
+
支持功能:
|
19
|
+
|
20
|
+
* 使用开发或发布证书重签名
|
21
|
+
|
22
|
+
* 支持指定IPA路径
|
23
|
+
|
24
|
+
* 支持上传到测试平台
|
25
|
+
|
26
|
+
* 支持发送测试通知
|
27
|
+
|
28
|
+
使用示例:
|
29
|
+
|
30
|
+
$ pindo ios autoresign # 使用开发证书重签名当前目录下的IPA
|
31
|
+
|
32
|
+
$ pindo ios autoresign /path/to/demo.ipa # 重签名指定IPA文件
|
33
|
+
|
34
|
+
$ pindo ios autoresign --adhoc # 使用adhoc证书重签名
|
35
|
+
|
36
|
+
$ pindo ios autoresign --deploy # 使用发布bundle id
|
37
|
+
|
38
|
+
$ pindo ios autoresign --upload # 重签名并上传
|
39
|
+
|
40
|
+
$ pindo ios autoresign --send # 重签名上传并发送通知
|
41
|
+
DESC
|
42
|
+
|
43
|
+
self.arguments = [
|
44
|
+
CLAide::Argument.new('path/to/demo.ipa', true),
|
45
|
+
]
|
46
|
+
|
47
|
+
def self.options
|
48
|
+
[
|
49
|
+
['--ipa', '指定要重签名的IPA文件路径'],
|
50
|
+
['--adhoc', '使用adhoc证书重签名(默认使用开发证书)'],
|
51
|
+
['--deploy', '使用发布证书和bundle id重签名(默认使用开发证书)'],
|
52
|
+
['--proj', '指定上传到测试平台的项目名称'],
|
53
|
+
['--upload', '上传重签名后的IPA到测试平台'],
|
54
|
+
['--send', '上传成功后发送测试通知'],
|
55
|
+
].concat(super)
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def initialize(argv)
|
60
|
+
|
61
|
+
@args_ipa_file = argv.shift_argument
|
62
|
+
@args_set_ipa_name = argv.option('ipa')
|
63
|
+
@args_adhoc_flag = argv.flag?('adhoc', false)
|
64
|
+
@args_deploy_flag = argv.flag?('deploy', false)
|
65
|
+
|
66
|
+
@args_upload_flag = argv.flag?('upload', false)
|
67
|
+
@args_send_flag = argv.flag?('send', false)
|
68
|
+
@args_proj_name = argv.option('proj')
|
69
|
+
|
70
|
+
if @args_send_flag
|
71
|
+
@args_upload_flag = true
|
72
|
+
end
|
73
|
+
|
74
|
+
super
|
75
|
+
@additional_args = argv.remainder!
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def run
|
80
|
+
|
81
|
+
ipa_file_name = @args_ipa_file
|
82
|
+
if !@args_set_ipa_name.nil?
|
83
|
+
ipa_file_name = @args_set_ipa_name
|
84
|
+
end
|
85
|
+
|
86
|
+
if !ipa_file_name.nil? && File.exist?(ipa_file_name)
|
87
|
+
else
|
88
|
+
current_dir = Dir.pwd
|
89
|
+
# File.basename(f).include?("_resigned") ? Time.local(0, 0, 0) : File.mtime(f)
|
90
|
+
ipa_file_name = Dir.glob(File.join(current_dir, "/*.ipa")).max_by {|f| File.basename(f).include?("_resigned") ? Time.local(0, 1, 1) : File.mtime(f)}
|
91
|
+
end
|
92
|
+
|
93
|
+
if !ipa_file_name.nil? && File.exist?(ipa_file_name)
|
94
|
+
puts
|
95
|
+
puts "正在重签名的ipa: #{ipa_file_name}"
|
96
|
+
puts "时间: #{File.mtime(ipa_file_name)}"
|
97
|
+
puts
|
98
|
+
else
|
99
|
+
return
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
mainapp_bundleid = nil
|
104
|
+
|
105
|
+
if @args_deploy_flag
|
106
|
+
mainapp_bundleid = get_selected_deploy_bundleid()
|
107
|
+
else
|
108
|
+
mainapp_bundleid = get_selected_dev_bundleid()
|
109
|
+
end
|
110
|
+
puts "mainapp_bundleid: #{mainapp_bundleid}"
|
111
|
+
|
112
|
+
args_temp = []
|
113
|
+
args_temp << mainapp_bundleid
|
114
|
+
|
115
|
+
Pindo::Command::Deploy::Pullconfig::run(args_temp)
|
116
|
+
|
117
|
+
app_info_obj = nil
|
118
|
+
if @args_upload_flag
|
119
|
+
proj_name = @args_proj_name
|
120
|
+
app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
|
121
|
+
end
|
122
|
+
|
123
|
+
args_temp = []
|
124
|
+
if @args_adhoc_flag
|
125
|
+
args_temp << "--adhoc"
|
126
|
+
else
|
127
|
+
args_temp << "--dev"
|
128
|
+
end
|
129
|
+
|
130
|
+
if !ipa_file_name.nil?
|
131
|
+
|
132
|
+
args_temp << "--ipa=#{ipa_file_name}"
|
133
|
+
Pindo::Command::Deploy::Resign::run(args_temp)
|
134
|
+
|
135
|
+
|
136
|
+
ipa_file_name = File::expand_path(ipa_file_name)
|
137
|
+
ipa_base_name = File.basename(ipa_file_name, ".ipa")
|
138
|
+
ipa_dir = File.dirname(ipa_file_name)
|
139
|
+
ipa_file_upload = File.join(ipa_dir, ipa_base_name + "_resigned.ipa")
|
140
|
+
|
141
|
+
if !ipa_file_upload.nil? && !app_info_obj.nil?
|
142
|
+
result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:nil)
|
143
|
+
if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
|
144
|
+
msg_data = PgyerHelper.share_instace.make_msg_data(app_info_obj:app_info_obj, app_version_info_obj:result_data["data"])
|
145
|
+
PgyerHelper.share_instace.print_app_version_info(msg_data:msg_data)
|
146
|
+
if @args_send_flag
|
147
|
+
PgyerHelper.share_instace.send_apptest_wechat_msg(msg_data:msg_data)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
|
156
|
+
#
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'json'
|
4
|
+
require 'xcodeproj'
|
5
|
+
require 'gym'
|
6
|
+
|
7
|
+
module Pindo
|
8
|
+
class Command
|
9
|
+
class Ios < Command
|
10
|
+
class Build < Ios
|
11
|
+
|
12
|
+
# 命令的简要说明 - 编译iOS工程并可选择上传到测试平台
|
13
|
+
self.summary = '编译iOS工程,并支持上传ipa'
|
14
|
+
|
15
|
+
# 命令的详细说明,包含用法示例
|
16
|
+
self.description = <<-DESC
|
17
|
+
编译iOS工程并生成ipa文件。
|
18
|
+
|
19
|
+
支持功能:
|
20
|
+
|
21
|
+
* 编译工程
|
22
|
+
|
23
|
+
* 生成IPA文件
|
24
|
+
|
25
|
+
* 支持上传分发
|
26
|
+
|
27
|
+
使用示例:
|
28
|
+
|
29
|
+
$ pindo ios build # 仅编译
|
30
|
+
|
31
|
+
$ pindo ios build --upload # 编译并上传
|
32
|
+
|
33
|
+
$ pindo ios build --send # 编译并发送通知
|
34
|
+
|
35
|
+
$ pindo ios build --proj=myapp # 指定项目名称
|
36
|
+
DESC
|
37
|
+
|
38
|
+
self.arguments = [
|
39
|
+
|
40
|
+
]
|
41
|
+
|
42
|
+
def self.options
|
43
|
+
[
|
44
|
+
['--proj', '指定上传到测试平台的项目名称'],
|
45
|
+
['--upload', '上传编译后的ipa到测试平台'],
|
46
|
+
['--send', '上传成功后发送测试通知'],
|
47
|
+
].concat(super)
|
48
|
+
end
|
49
|
+
|
50
|
+
def initialize(argv)
|
51
|
+
|
52
|
+
@args_upload_flag = argv.flag?('upload', false)
|
53
|
+
@args_send_flag = argv.flag?('send', false)
|
54
|
+
@args_proj_name = argv.option('proj')
|
55
|
+
|
56
|
+
if @args_send_flag
|
57
|
+
@args_upload_flag = true
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
super
|
62
|
+
@additional_args = argv.remainder!
|
63
|
+
end
|
64
|
+
|
65
|
+
def run
|
66
|
+
|
67
|
+
|
68
|
+
app_info_obj = nil
|
69
|
+
if @args_upload_flag
|
70
|
+
proj_name = @args_proj_name
|
71
|
+
app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
args_temp = []
|
76
|
+
Pindo::Command::Deploy::Build::run(args_temp)
|
77
|
+
|
78
|
+
|
79
|
+
pindo_new_project_dir = Dir.pwd
|
80
|
+
build_path = File.join(pindo_new_project_dir, "build", "*.{ipa,app,apk}")
|
81
|
+
ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
|
82
|
+
|
83
|
+
if !ipa_file_upload.nil? && !app_info_obj.nil?
|
84
|
+
|
85
|
+
description = nil
|
86
|
+
if File.exist?(File.join(pindo_new_project_dir, ".release_info"))
|
87
|
+
description = File.read(File.join(pindo_new_project_dir, ".release_info"))
|
88
|
+
else
|
89
|
+
if File.exist?(File.join(pindo_new_project_dir, ".git"))
|
90
|
+
description = git!(%W(-C #{pindo_new_project_dir} show -s --format=%h::%s)).strip
|
91
|
+
unless !description.nil? && description.length > 10
|
92
|
+
description = nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
|
98
|
+
if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
|
99
|
+
msg_data = PgyerHelper.share_instace.make_msg_data(app_info_obj:app_info_obj, app_version_info_obj:result_data["data"])
|
100
|
+
|
101
|
+
PgyerHelper.share_instace.print_app_version_info(msg_data:msg_data)
|
102
|
+
if @args_send_flag
|
103
|
+
PgyerHelper.share_instace.send_apptest_wechat_msg(msg_data:msg_data)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Pindo
|
4
|
+
class Command
|
5
|
+
class Ios < Command
|
6
|
+
class Cert < Ios
|
7
|
+
|
8
|
+
include Appselect
|
9
|
+
|
10
|
+
include XcodeCertHelper
|
11
|
+
self.summary = '更新iOS证书并使用新证书设置Xcode工程'
|
12
|
+
self.description = <<-DESC
|
13
|
+
更新iOS证书并使用新证书设置Xcode工程。
|
14
|
+
|
15
|
+
支持功能:
|
16
|
+
|
17
|
+
* 更新iOS证书
|
18
|
+
|
19
|
+
* 设置Xcode工程证书
|
20
|
+
|
21
|
+
* 支持开发和发布证书
|
22
|
+
|
23
|
+
使用示例:
|
24
|
+
|
25
|
+
$ pindo ios cert # 更新开发证书
|
26
|
+
|
27
|
+
$ pindo ios cert --deploy # 更新发布bundle id
|
28
|
+
|
29
|
+
$ pindo ios cert --adhoc # 更新adhoc证书
|
30
|
+
|
31
|
+
$ pindo ios cert --macos # 更新macos平台证书
|
32
|
+
|
33
|
+
DESC
|
34
|
+
|
35
|
+
self.arguments = [
|
36
|
+
|
37
|
+
]
|
38
|
+
|
39
|
+
# 命令选项
|
40
|
+
def self.options
|
41
|
+
[
|
42
|
+
['--deploy', '默认使用开发环境的bundle id,使用此选项切换为发布环境的bundle id'],
|
43
|
+
['--adhoc', '默认使用开发证书,使用此选项切换为adhoc证书'],
|
44
|
+
['--macos', '指定为macOS平台的证书'],
|
45
|
+
['--upload', '生成用于上传到蒲公英平台的证书'],
|
46
|
+
].concat(super)
|
47
|
+
end
|
48
|
+
|
49
|
+
def initialize(argv)
|
50
|
+
@args_adhoc_flag = argv.flag?('adhoc', false)
|
51
|
+
@args_deploy_flag = argv.flag?('deploy', false)
|
52
|
+
@args_macos_flag = argv.flag?('macos', false)
|
53
|
+
@upload_flag = argv.flag?('upload', false)
|
54
|
+
super
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def run
|
59
|
+
|
60
|
+
mainapp_bundleid= nil
|
61
|
+
if @args_deploy_flag
|
62
|
+
mainapp_bundleid = get_selected_deploy_bundleid()
|
63
|
+
else
|
64
|
+
mainapp_bundleid = get_selected_dev_bundleid()
|
65
|
+
end
|
66
|
+
|
67
|
+
args_temp = []
|
68
|
+
args_temp << mainapp_bundleid
|
69
|
+
Pindo::Command::Deploy::Pullconfig::run(args_temp)
|
70
|
+
|
71
|
+
|
72
|
+
project_dir = Dir.pwd
|
73
|
+
Dir.chdir(project_dir)
|
74
|
+
config_json_file = File.join(project_dir,"config.json")
|
75
|
+
Cert::modify_cert_with_project(project_dir:project_dir, config_file:config_json_file)
|
76
|
+
|
77
|
+
args_temp = []
|
78
|
+
if @args_adhoc_flag
|
79
|
+
args_temp << "--adhoc"
|
80
|
+
else
|
81
|
+
args_temp << "--dev"
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
|
87
|
+
if !project_fullname.nil?
|
88
|
+
project_obj = Xcodeproj::Project.open(project_fullname)
|
89
|
+
project_build_platform = project_obj.root_object.build_configuration_list.get_setting("SDKROOT")["Release"]
|
90
|
+
if !project_build_platform.nil? && project_build_platform.eql?("macosx")
|
91
|
+
@args_macos_flag = true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
if @args_macos_flag
|
96
|
+
args_temp << "--macos"
|
97
|
+
end
|
98
|
+
|
99
|
+
if @upload_flag
|
100
|
+
args_temp << "--upload"
|
101
|
+
end
|
102
|
+
|
103
|
+
Pindo::Command::Deploy::Cert::run(args_temp)
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
def self.modify_cert_with_project(project_dir:nil, config_file:nil)
|
108
|
+
|
109
|
+
project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
|
110
|
+
if !project_fullname.nil?
|
111
|
+
|
112
|
+
entitlements_plist_path = nil
|
113
|
+
project_obj = Xcodeproj::Project.open(project_fullname)
|
114
|
+
project_obj.targets.each do |target|
|
115
|
+
if target.product_type.to_s.eql?("com.apple.product-type.application") then
|
116
|
+
temp_entitlements_file = target.build_configurations.first.build_settings['CODE_SIGN_ENTITLEMENTS']
|
117
|
+
if !temp_entitlements_file.nil? && !temp_entitlements_file.empty?
|
118
|
+
entitlements_plist_path = File.join(project_dir, temp_entitlements_file)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# puts entitlements_plist_path
|
124
|
+
if !entitlements_plist_path.nil? && File.exist?(entitlements_plist_path)
|
125
|
+
config_json = nil
|
126
|
+
if File.exist?(config_file)
|
127
|
+
config_json = JSON.parse(File.read(config_file))
|
128
|
+
end
|
129
|
+
|
130
|
+
entitlements_plist_dict = Xcodeproj::Plist.read_from_path(entitlements_plist_path)
|
131
|
+
|
132
|
+
if entitlements_plist_dict["com.apple.developer.icloud-container-identifiers"].nil?
|
133
|
+
if !config_json.nil? && !config_json["app_info"]['app_icloud_id'].nil?
|
134
|
+
config_json["app_info"].delete('app_icloud_id')
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
if entitlements_plist_dict["com.apple.security.application-groups"].nil?
|
139
|
+
if !config_json.nil? && !config_json["app_info"]['app_group_id'].nil?
|
140
|
+
config_json["app_info"].delete('app_group_id')
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# puts JSON.pretty_generate(config_json)
|
145
|
+
if !config_json.nil?
|
146
|
+
File.open(config_file, "w") do |f|
|
147
|
+
f.write(JSON.pretty_generate(config_json))
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|