pindo 4.8.7 → 4.8.8
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/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 +2 -2
- 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
|
+
|