pindo 4.6.9 → 4.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pindo/base/aeshelper.rb +48 -2
- data/lib/pindo/base/funlog.rb +89 -0
- data/lib/pindo/base/githelper.rb +30 -12
- data/lib/pindo/base/plaininformative.rb +3 -0
- data/lib/pindo/base/standarderror.rb +1 -0
- data/lib/pindo/base/xcodeconst.rb +251 -0
- data/lib/pindo/client/applovinclient.rb +6 -3
- data/lib/pindo/client/aws3sclient.rb +33 -46
- data/lib/pindo/client/bossclient.rb +1 -1
- data/lib/pindo/client/pgyerclient.rb +78 -14
- data/lib/pindo/command/appstore/iap.rb +43 -0
- data/lib/pindo/command/appstore/itcapp.rb +41 -0
- data/lib/pindo/command/appstore/metadata.rb +43 -0
- data/lib/pindo/command/appstore/screenshots.rb +43 -0
- data/lib/pindo/command/appstore/upload.rb +40 -0
- data/lib/pindo/command/appstore.rb +17 -0
- data/lib/pindo/command/deploy/build.rb +109 -0
- data/lib/pindo/{deploy → command/deploy}/bundleid.rb +1 -1
- data/lib/pindo/command/deploy/cert.rb +179 -0
- data/lib/pindo/command/deploy/configproj.rb +105 -0
- data/lib/pindo/{deploy → command/deploy}/getitcinfo.rb +1 -1
- data/lib/pindo/{deploy → command/deploy}/iap.rb +30 -9
- data/lib/pindo/{deploy → command/deploy}/itcapp.rb +0 -1
- data/lib/pindo/{deploy → command/deploy}/itcinfo.rb +2 -3
- data/lib/pindo/{deploy → command/deploy}/pem.rb +3 -2
- data/lib/pindo/{deploy → command/deploy}/resign.rb +14 -63
- data/lib/pindo/command/deploy.rb +44 -0
- data/lib/pindo/{dev → command/dev}/autobuild.rb +17 -80
- data/lib/pindo/{dev → command/dev}/autoresign.rb +17 -64
- data/lib/pindo/{dev → command/dev}/createbuild.rb +0 -2
- data/lib/pindo/{dev → command/dev}/debug.rb +6 -2
- data/lib/pindo/command/dev/pgyercert.rb +75 -0
- data/lib/pindo/command/dev.rb +25 -0
- data/lib/pindo/command/env.rb +17 -0
- data/lib/pindo/{ipa → command/ipa}/autoresign.rb +18 -70
- data/lib/pindo/{ipa → command/ipa}/import.rb +47 -102
- data/lib/pindo/{ipa → command/ipa}/output.rb +38 -135
- data/lib/pindo/command/ipa.rb +16 -0
- data/lib/pindo/{lib → command/lib}/update.rb +19 -10
- data/lib/pindo/command/lib.rb +16 -0
- data/lib/pindo/{pgyer → command/pgyer}/apptest.rb +7 -29
- data/lib/pindo/{pgyer → command/pgyer}/comment.rb +7 -30
- data/lib/pindo/{pgyer → command/pgyer}/download.rb +35 -30
- data/lib/pindo/{pgyer → command/pgyer}/login.rb +3 -4
- data/lib/pindo/command/pgyer/resign.rb +111 -0
- data/lib/pindo/command/pgyer/upload.rb +123 -0
- data/lib/pindo/command/pgyer.rb +18 -0
- data/lib/pindo/{repo.rb → command/repo.rb} +4 -4
- data/lib/pindo/{utils → command/utils}/applovin.rb +43 -33
- data/lib/pindo/{utils → command/utils}/boss.rb +3 -3
- data/lib/pindo/command/utils/icon.rb +81 -0
- data/lib/pindo/{utils → command/utils}/renewproj.rb +1 -0
- data/lib/pindo/command/utils.rb +26 -0
- data/lib/pindo/command.rb +23 -26
- data/lib/pindo/module/build/swarkhelper.rb +95 -0
- data/lib/pindo/module/cert/certhelper.rb +176 -0
- data/lib/pindo/module/cert/keychainhelper.rb +138 -0
- data/lib/pindo/module/{pemcreate.rb → cert/pemhelper.rb} +3 -1
- data/lib/pindo/module/cert/provisioninghelper.rb +137 -0
- data/lib/pindo/module/cert/xcodecerthelper.rb +301 -0
- data/lib/pindo/module/{pgyerhelper.rb → pgyer/pgyerhelper.rb} +246 -35
- data/lib/pindo/module/xcode/xcodeappconfig.rb +188 -0
- data/lib/pindo/module/xcode/xcodebuildconfig.rb +12 -0
- data/lib/pindo/module/xcode/xcodebuildhelper.rb +312 -0
- data/lib/pindo/module/xcode/xcoderesconstant.rb +248 -0
- data/lib/pindo/module/xcode/xcodereshandler.rb +198 -0
- data/lib/pindo/module/xcode/xcodereshelper.rb +120 -0
- data/lib/pindo/options/appconfigoptions.rb +1 -0
- data/lib/pindo/options/deployoptions.rb +38 -41
- data/lib/pindo/version.rb +1 -1
- metadata +109 -97
- data/lib/pindo/deploy/Fastfile +0 -233
- data/lib/pindo/deploy/build.rb +0 -167
- data/lib/pindo/deploy/cert.rb +0 -508
- data/lib/pindo/deploy/configproj.rb +0 -89
- data/lib/pindo/deploy.rb +0 -44
- data/lib/pindo/dev.rb +0 -23
- data/lib/pindo/env/flutter.rb +0 -59
- data/lib/pindo/env/flutter.sh +0 -116
- data/lib/pindo/env.rb +0 -17
- data/lib/pindo/ipa.rb +0 -22
- data/lib/pindo/lib.rb +0 -18
- data/lib/pindo/module/buildconfighelper.rb +0 -13
- data/lib/pindo/module/buildhelper.rb +0 -76
- data/lib/pindo/module/config_project.sh +0 -143
- data/lib/pindo/module/configprojhelper.rb +0 -631
- data/lib/pindo/module/icon_contents.json +0 -116
- data/lib/pindo/module/imessage_icon.json +0 -91
- data/lib/pindo/module/imgset_contents.json +0 -21
- data/lib/pindo/module/launchimg_contents.json +0 -21
- data/lib/pindo/module/xcodebuildpre.rb +0 -258
- data/lib/pindo/pgyer/upload.rb +0 -234
- data/lib/pindo/pgyer.rb +0 -17
- data/lib/pindo/utils/icon.rb +0 -91
- data/lib/pindo/utils/icon.sh +0 -133
- data/lib/pindo/utils/podindex.rb +0 -56
- data/lib/pindo/utils/podindex.sh +0 -30
- data/lib/pindo/utils.rb +0 -29
- /data/lib/pindo/{deploy → command/deploy}/check.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/confusecode.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/confuseproj.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/fabric.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/initconfig.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/pullconfig.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/pushconfig.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/quswark.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/quswauth.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/reportbug.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/tag.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/updateconfig.rb +0 -0
- /data/lib/pindo/{deploy → command/deploy}/uploadipa.rb +0 -0
- /data/lib/pindo/{dev → command/dev}/confusecode.rb +0 -0
- /data/lib/pindo/{dev → command/dev}/confuseproj.rb +0 -0
- /data/lib/pindo/{dev → command/dev}/pub.rb +0 -0
- /data/lib/pindo/{dev → command/dev}/renewcert.rb +0 -0
- /data/lib/pindo/{env → command/env}/dreamstudio.rb +0 -0
- /data/lib/pindo/{env → command/env}/quarkenv.rb +0 -0
- /data/lib/pindo/{env → command/env}/swarkenv.rb +0 -0
- /data/lib/pindo/{env → command/env}/workhard.rb +0 -0
- /data/lib/pindo/{lib → command/lib}/forcepush.rb +0 -0
- /data/lib/pindo/{lib → command/lib}/lint.rb +0 -0
- /data/lib/pindo/{lib → command/lib}/push.rb +0 -0
- /data/lib/pindo/{repo → command/repo}/clone.rb +0 -0
- /data/lib/pindo/{repo → command/repo}/create.rb +0 -0
- /data/lib/pindo/{repo → command/repo}/login.rb +0 -0
- /data/lib/pindo/{repo → command/repo}/search.rb +0 -0
- /data/lib/pindo/{setup.rb → command/setup.rb} +0 -0
- /data/lib/pindo/{upgrade.rb → command/upgrade.rb} +0 -0
- /data/lib/pindo/{utils → command/utils}/clearcert.rb +0 -0
- /data/lib/pindo/{utils → command/utils}/device.rb +0 -0
- /data/lib/pindo/{utils → command/utils}/tgate.rb +0 -0
- /data/lib/pindo/{utils → command/utils}/xcassets.rb +0 -0
- /data/lib/pindo/{utils → command/utils}/xcassets.sh +0 -0
- /data/lib/pindo/module/{appstore_in_app_purchase.rb → appstore/appstore_in_app_purchase.rb} +0 -0
- /data/lib/pindo/module/{appstore_metadata_connect_api_helper.rb → appstore/appstore_metadata_connect_api_helper.rb} +0 -0
- /data/lib/pindo/module/{appstore_metadata_fastlane_helper.rb → appstore/appstore_metadata_fastlane_helper.rb} +0 -0
- /data/lib/pindo/module/{iap_tier.json → appstore/iap_tier.json} +0 -0
- /data/lib/pindo/module/{commonconfuseproj.rb → build/commonconfuseproj.rb} +0 -0
- /data/lib/pindo/module/{xcodehelper.rb → xcode/xcodehelper.rb} +0 -0
@@ -24,6 +24,7 @@ module Pindo
|
|
24
24
|
[
|
25
25
|
['--appstore', 'appstore模式,一般不用'],
|
26
26
|
['--install', '是否运行applovin脚本'],
|
27
|
+
['--upload', '保存ids, 留作applovin网络不好情况使用'],
|
27
28
|
].concat(super)
|
28
29
|
end
|
29
30
|
|
@@ -31,6 +32,7 @@ module Pindo
|
|
31
32
|
|
32
33
|
@args_appstore_flag = argv.flag?('appstore', false)
|
33
34
|
@args_install_flag = argv.flag?('install', false)
|
35
|
+
@args_upload_flag = argv.flag?('upload', false)
|
34
36
|
|
35
37
|
super(argv)
|
36
38
|
@additional_args = argv.remainder!
|
@@ -44,7 +46,11 @@ module Pindo
|
|
44
46
|
|
45
47
|
skadnetwork_id_array = []
|
46
48
|
|
49
|
+
Funlog.instance.fancyinfo_start("正在请求applovin数据...")
|
50
|
+
|
47
51
|
applovin_res_json = req_applovin_json
|
52
|
+
# puts JSON.pretty_generate(applovin_res_json)
|
53
|
+
|
48
54
|
if !applovin_res_json.nil? && !applovin_res_json["skadnetwork_ids"].nil?
|
49
55
|
applovin_res_json["skadnetwork_ids"].each do |network_id|
|
50
56
|
skadnetwork_id_array << network_id["skadnetwork_id"]
|
@@ -52,44 +58,51 @@ module Pindo
|
|
52
58
|
end
|
53
59
|
|
54
60
|
applovin_media_res_json = req_applovin_mediia_json
|
61
|
+
# puts JSON.pretty_generate(applovin_media_res_json)
|
55
62
|
if !applovin_media_res_json.nil? && !applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].nil?
|
56
63
|
applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].each do |media_item|
|
57
64
|
skadnetwork_id_array = skadnetwork_id_array + media_item["skAdnetworkIds"]
|
58
65
|
end
|
59
66
|
end
|
60
67
|
|
61
|
-
skadnetwork_id_array = skadnetwork_id_array.uniq
|
62
|
-
|
63
|
-
|
68
|
+
skadnetwork_id_array = skadnetwork_id_array.uniq || []
|
69
|
+
|
70
|
+
Funlog.instance.fancyinfo_success("请求applovin数据,获取到#{skadnetwork_id_array.size}条数据...")
|
71
|
+
|
72
|
+
if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 50
|
73
|
+
# puts "From Applovin SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
|
74
|
+
if @args_upload_flag
|
75
|
+
applovin_config_file = File.join(pindo_single_config.pindo_common_configdir,"applovin_client_config.json")
|
76
|
+
origin_json = {}
|
77
|
+
if File.exist?(applovin_config_file)
|
78
|
+
origin_json = JSON.parse(File.read(applovin_config_file))
|
79
|
+
end
|
80
|
+
origin_json["SKAdNetworkItems"] = skadnetwork_id_array
|
81
|
+
File.write(applovin_config_file, JSON.pretty_generate(origin_json))
|
82
|
+
git_addpush_repo(path:pindo_single_config.pindo_common_configdir, message:"Applovin SKAdNetworkItems", commit_file_params:["applovin_client_config.json"])
|
83
|
+
end
|
64
84
|
else
|
85
|
+
Funlog.instance.fancyinfo_start("网络拉取applovin数据太少,从缓存中获取数据...")
|
65
86
|
config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "applovin_client_config.json")
|
66
87
|
config_json = JSON.parse(File.read(config_file))
|
67
88
|
skadnetwork_id_array = skadnetwork_id_array + config_json["SKAdNetworkItems"]
|
68
|
-
puts "SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
|
89
|
+
# puts "From Config SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
|
90
|
+
Funlog.instance.fancyinfo_success("网络拉取applovin数据太少,从缓存中获取到#{skadnetwork_id_array.size}条数据...")
|
69
91
|
end
|
70
92
|
|
71
|
-
|
72
|
-
current_dir = Dir.pwd
|
73
|
-
project_fullname = nil
|
74
|
-
Dir.chdir(current_dir)
|
75
|
-
Dir.foreach(current_dir) do |file|
|
76
|
-
if file =~ /(.*).xcodeproj/
|
77
|
-
project_fullname = file
|
78
|
-
break;
|
79
|
-
end
|
80
|
-
end
|
81
|
-
project_root_dir = current_dir
|
82
93
|
|
94
|
+
Funlog.instance.fancyinfo_start("正在写入Xcode中...")
|
95
|
+
|
96
|
+
skadnetwork_id_array = skadnetwork_id_array.uniq || []
|
83
97
|
|
98
|
+
project_root_dir = Dir.pwd
|
99
|
+
xcodeproj_file_name = Dir.glob(File.join(project_root_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
|
84
100
|
|
85
|
-
plist_file_name = File.join(project_root_dir, "
|
86
|
-
if !
|
87
|
-
proj_name = File.basename(
|
101
|
+
plist_file_name = File.join(project_root_dir, "AppEntry/Info.plist")
|
102
|
+
if !xcodeproj_file_name.nil?
|
103
|
+
proj_name = File.basename(xcodeproj_file_name, ".xcodeproj")
|
88
104
|
plist_file_name = get_applovin_infoplist(project_dir:project_root_dir, proj_name:proj_name)
|
89
105
|
end
|
90
|
-
|
91
|
-
|
92
|
-
puts plist_file_name
|
93
106
|
|
94
107
|
|
95
108
|
info_plist_dict = {}
|
@@ -105,9 +118,6 @@ module Pindo
|
|
105
118
|
info_plist_dict["NSAppTransportSecurity"]["NSAllowsArbitraryLoads"] = true
|
106
119
|
end
|
107
120
|
|
108
|
-
# puts JSON.pretty_generate(info_plist_dict["SKAdNetworkItems"])
|
109
|
-
# puts 111
|
110
|
-
# info_plist_dict["NSUserTrackingUsageDescription"] = info_plist_dict["NSUserTrackingUsageDescription"] || "Your data will be used to provide you a better experience. We don't share any data with 3rd parties."
|
111
121
|
|
112
122
|
if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 0
|
113
123
|
info_plist_dict["SKAdNetworkItems"] = []
|
@@ -118,13 +128,11 @@ module Pindo
|
|
118
128
|
end
|
119
129
|
end
|
120
130
|
|
121
|
-
|
122
|
-
|
123
131
|
Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file_name)
|
124
|
-
|
125
132
|
|
133
|
+
Funlog.instance.fancyinfo_success("Xcode中applovin数据修改完成!")
|
126
134
|
|
127
|
-
if @args_install_flag && !
|
135
|
+
if @args_install_flag && !xcodeproj_file_name.nil? && File.exist?(xcodeproj_file_name)
|
128
136
|
|
129
137
|
pindo_common_dir = pindo_single_config.pindo_common_configdir
|
130
138
|
|
@@ -136,15 +144,17 @@ module Pindo
|
|
136
144
|
project_script_file = File.join(project_root_dir, "AppLovinQualityServiceSetup-ios.rb")
|
137
145
|
FileUtils.cp_r(app_lovin_script, project_script_file)
|
138
146
|
command = "ruby " + project_script_file
|
139
|
-
puts command
|
140
|
-
system command
|
141
|
-
|
147
|
+
# puts command
|
148
|
+
system command
|
142
149
|
end
|
150
|
+
|
151
|
+
|
143
152
|
end
|
144
153
|
|
154
|
+
|
145
155
|
def get_applovin_infoplist(project_dir:nil, proj_name:nil)
|
146
156
|
|
147
|
-
info_plist_path = File.join(project_dir, "
|
157
|
+
info_plist_path = File.join(project_dir, "AppEntry/Info.plist")
|
148
158
|
proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
|
149
159
|
if File.exist?(proj_fullname)
|
150
160
|
project_obj = Xcodeproj::Project.open(proj_fullname)
|
@@ -163,7 +173,6 @@ module Pindo
|
|
163
173
|
|
164
174
|
def req_applovin_json
|
165
175
|
|
166
|
-
|
167
176
|
begin
|
168
177
|
# https://dash.applovin.com/docs/v1/skadnetwork_ids.json
|
169
178
|
applovin_url = "https://dash.applovin.com/docs/v1/skadnetwork_ids.json"
|
@@ -174,6 +183,7 @@ module Pindo
|
|
174
183
|
end
|
175
184
|
|
176
185
|
applovin_res_json = JSON.parse(res.body)
|
186
|
+
|
177
187
|
return applovin_res_json
|
178
188
|
rescue Exception => e
|
179
189
|
return nil
|
@@ -110,15 +110,15 @@ module Pindo
|
|
110
110
|
if @platform.nil?
|
111
111
|
@platform = current_config_json["app_setting"]["kGUKeyAppPlatform"]
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
if base_url.nil?
|
115
115
|
base_url = current_config_json["app_setting"]["kGUKeyAppClientHost"]
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
119
|
app_version = @appversion || "1.0.0"
|
120
|
-
bundle_id = @bundleid || "com.heroneverdie101.
|
121
|
-
platform = @platform || "
|
120
|
+
bundle_id = @bundleid || "com.heroneverdie101.fancyapp"
|
121
|
+
platform = @platform || "iOS_Funny_Release"
|
122
122
|
apptype = @apptype || "FunnyApp"
|
123
123
|
|
124
124
|
boss_client = BossClient.new(app_type:apptype, is_dev:false, base_url:base_url)
|
@@ -0,0 +1,81 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require 'highline/import'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'json'
|
6
|
+
require "pindo/base/xcodeconst"
|
7
|
+
require 'pindo/module/xcode/xcodereshelper'
|
8
|
+
|
9
|
+
module Pindo
|
10
|
+
class Command
|
11
|
+
class Utils < Command
|
12
|
+
class Icon < Utils
|
13
|
+
|
14
|
+
extend Executable
|
15
|
+
executable :sips
|
16
|
+
|
17
|
+
|
18
|
+
self.summary = '根据1024*1024icon生成Xcode标准icon文件'
|
19
|
+
|
20
|
+
self.description = <<-DESC
|
21
|
+
根据1024*1024icon生成Xcode标准icon文件,用法:pindo utils icon path/to/demo.png
|
22
|
+
DESC
|
23
|
+
|
24
|
+
|
25
|
+
self.arguments = [
|
26
|
+
CLAide::Argument.new('path/to/demo.png', true),
|
27
|
+
]
|
28
|
+
|
29
|
+
def self.options
|
30
|
+
[
|
31
|
+
['--install', '生成icon后拷贝进Xcode工程里, 用法 pindo utils icon --install'],
|
32
|
+
].concat(super)
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(argv)
|
36
|
+
@icon_name = argv.shift_argument
|
37
|
+
@args_install_flag = argv.flag?('install', false)
|
38
|
+
super(argv)
|
39
|
+
@additional_args = argv.remainder!
|
40
|
+
end
|
41
|
+
|
42
|
+
def validate!
|
43
|
+
super
|
44
|
+
help! 'Need a icon name' if @icon_name.nil? || @icon_name.empty?
|
45
|
+
end
|
46
|
+
|
47
|
+
def run
|
48
|
+
icon_name = @icon_name
|
49
|
+
time = Time.now.strftime('%m%d-%H%M%S')
|
50
|
+
new_icon_dir = File.join(Dir.pwd, "icon_"+time)
|
51
|
+
|
52
|
+
|
53
|
+
Funlog.instance.fancyinfo_start("正在生成icon...")
|
54
|
+
begin
|
55
|
+
XcodeResHelper.create_icons(icon_name: icon_name, new_icon_dir: new_icon_dir)
|
56
|
+
Funlog.instance.fancyinfo_success("生成icon成功!")
|
57
|
+
rescue StandardError => e
|
58
|
+
Funlog.instance.fancyinfo_error("生成icon失败!")
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
if @args_install_flag
|
63
|
+
Funlog.instance.fancyinfo_start("正在给Xcode替换icon...")
|
64
|
+
XcodeResHelper.install_icon(proj_dir: Dir.pwd, new_icon_dir: new_icon_dir)
|
65
|
+
Funlog.instance.fancyinfo_success("Xcode替换icon完成!")
|
66
|
+
begin
|
67
|
+
FileUtils.remove_dir(new_icon_dir)
|
68
|
+
rescue StandardError => e
|
69
|
+
|
70
|
+
end
|
71
|
+
else
|
72
|
+
puts "open #{new_icon_dir}"
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
require 'pindo/command/utils/icon'
|
3
|
+
require 'pindo/command/utils/renewproj'
|
4
|
+
require 'pindo/command/utils/clearcert'
|
5
|
+
require 'pindo/command/utils/xcassets'
|
6
|
+
require 'pindo/command/utils/device'
|
7
|
+
require 'pindo/command/utils/applovin'
|
8
|
+
require 'pindo/command/utils/tgate'
|
9
|
+
require 'pindo/command/utils/boss'
|
10
|
+
|
11
|
+
|
12
|
+
module Pindo
|
13
|
+
class Command
|
14
|
+
|
15
|
+
class Utils < Command
|
16
|
+
|
17
|
+
|
18
|
+
self.abstract_command = true
|
19
|
+
|
20
|
+
self.summary = '其他工具类的相关命令'
|
21
|
+
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
data/lib/pindo/command.rb
CHANGED
@@ -3,11 +3,13 @@
|
|
3
3
|
require 'claide'
|
4
4
|
require 'json'
|
5
5
|
require 'pindo/version'
|
6
|
-
require 'pindo/
|
6
|
+
require 'pindo/base/funlog'
|
7
|
+
require 'pindo/base/hashhelper'
|
7
8
|
require 'pindo/base/plaininformative'
|
8
9
|
require 'pindo/base/githelper'
|
9
10
|
require 'pindo/client/giteeclient'
|
10
|
-
require 'pindo/
|
11
|
+
require 'pindo/config/pindoconfig'
|
12
|
+
|
11
13
|
|
12
14
|
module Pindo
|
13
15
|
class Informative < PlainInformative
|
@@ -20,33 +22,28 @@ module Pindo
|
|
20
22
|
|
21
23
|
include Pindo::Githelper
|
22
24
|
include Pindoconfig::Mixin
|
25
|
+
include Funlog::Mixin
|
23
26
|
|
24
27
|
require 'pindo/options/deployoptions'
|
25
|
-
|
26
|
-
|
27
28
|
require 'pindo/module/appselect'
|
28
|
-
require 'pindo/module/
|
29
|
-
require 'pindo/module/
|
30
|
-
|
31
|
-
require 'pindo/module/
|
32
|
-
require 'pindo/module/
|
33
|
-
require 'pindo/module/
|
34
|
-
|
35
|
-
require 'pindo/
|
36
|
-
require 'pindo/
|
37
|
-
require 'pindo/
|
38
|
-
|
39
|
-
|
40
|
-
require 'pindo/
|
41
|
-
require 'pindo/
|
42
|
-
require 'pindo/
|
43
|
-
require 'pindo/
|
44
|
-
require 'pindo/
|
45
|
-
require 'pindo/
|
46
|
-
require 'pindo/setup'
|
47
|
-
require 'pindo/repo'
|
48
|
-
require 'pindo/upgrade'
|
49
|
-
require 'pindo/ipa'
|
29
|
+
require 'pindo/module/build/commonconfuseproj'
|
30
|
+
require 'pindo/module/cert/xcodecerthelper'
|
31
|
+
|
32
|
+
require 'pindo/module/appstore/appstore_in_app_purchase'
|
33
|
+
require 'pindo/module/appstore/appstore_metadata_fastlane_helper'
|
34
|
+
require 'pindo/module/appstore/appstore_metadata_connect_api_helper'
|
35
|
+
|
36
|
+
require 'pindo/command/deploy'
|
37
|
+
require 'pindo/command/dev'
|
38
|
+
require 'pindo/command/env'
|
39
|
+
require 'pindo/command/lib'
|
40
|
+
require 'pindo/command/utils'
|
41
|
+
require 'pindo/command/pgyer'
|
42
|
+
require 'pindo/command/setup'
|
43
|
+
require 'pindo/command/repo'
|
44
|
+
require 'pindo/command/upgrade'
|
45
|
+
require 'pindo/command/ipa'
|
46
|
+
require 'pindo/command/appstore'
|
50
47
|
|
51
48
|
|
52
49
|
attr_accessor :args_help_flag
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require 'xcodeproj'
|
3
|
+
require 'json'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
|
7
|
+
module Pindo
|
8
|
+
module SwarkHelper
|
9
|
+
|
10
|
+
def check_swark_authorize(config_json:nil, buid_type:nil)
|
11
|
+
if !config_json.nil? && config_json['project_info']['xcode_build_type'] && config_json["project_info"]["xcode_build_type"].include?("swark")
|
12
|
+
|
13
|
+
app_config_dir = File.join(File::expand_path(pindo_single_config.pindo_dir), @deploy_identifier)
|
14
|
+
swark_authorize_file = File.join(app_config_dir, "swark_authorize.json")
|
15
|
+
if File.exist?(swark_authorize_file)
|
16
|
+
swark_authorize_json=JSON.parse(File.read(swark_authorize_file))
|
17
|
+
unless swark_authorize_json && swark_authorize_json['swark_authorize_status']
|
18
|
+
show_swark_authorize_error(swark_authorize_json:swark_authorize_json , buid_type:buid_type)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def show_swark_authorize_error(swark_authorize_json:nil, buid_type:nil)
|
25
|
+
|
26
|
+
puts "++++ +++ Need authorize !!! ++++"
|
27
|
+
puts "+++ Need authorize !!! ++++"
|
28
|
+
puts "+++ Need authorize !!! +++++"
|
29
|
+
puts " =========================="
|
30
|
+
puts
|
31
|
+
|
32
|
+
puts "方法一:"
|
33
|
+
command = " 1. swark authorize "
|
34
|
+
command = command + swark_authorize_json["swark_authorize_teamid"] + "." + swark_authorize_json["swark_authorize_bundleid"]
|
35
|
+
puts command
|
36
|
+
command = " 2. 修改swark_authorize.json 中的 swark_authorize_status = true 并且提交"
|
37
|
+
puts
|
38
|
+
|
39
|
+
puts "方法二:"
|
40
|
+
puts " pindo deploy quswark"
|
41
|
+
if buid_type.downcase.to_s.include?("appstore")
|
42
|
+
raise Informative, "Need swark authorize !!!"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def add_swark_entitlement(entitlements_plist_path:nil, bundle_id_dict:nil)
|
48
|
+
if @config_json['project_info']['xcode_build_type'] && @config_json["project_info"]["xcode_build_type"].include?("swark")
|
49
|
+
if File.exist?(entitlements_plist_path)
|
50
|
+
entitlements_plist_dict = Xcodeproj::Plist.read_from_path(entitlements_plist_path)
|
51
|
+
|
52
|
+
key_value = @team_id_vaule
|
53
|
+
key_value = key_value + "." + @bundle_id
|
54
|
+
entitlements_plist_dict['keychain-access-groups'] = [key_value]
|
55
|
+
|
56
|
+
Xcodeproj::Plist.write_to_path(entitlements_plist_dict, entitlements_plist_path)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_swark_authorize_json
|
62
|
+
if @build_type == "appstore" && @config_json['project_info']['xcode_build_type'] && @config_json["project_info"]["xcode_build_type"].include?("swark")
|
63
|
+
|
64
|
+
app_config_dir = clong_buildconfig_repo(repo_name: @deploy_repo_name)
|
65
|
+
swark_authorize_file = File.join(app_config_dir, "swark_authorize.json")
|
66
|
+
if File.exist?(swark_authorize_file)
|
67
|
+
swark_authorize_json=JSON.parse(File.read(swark_authorize_file))
|
68
|
+
if swark_authorize_json && swark_authorize_json['swark_authorize_status']
|
69
|
+
puts "swark already authorize success !!! "
|
70
|
+
else
|
71
|
+
swark_authorize_json = swark_authorize_json || {}
|
72
|
+
swark_authorize_json['swark_authorize_teamid'] = @team_id_vaule
|
73
|
+
swark_authorize_json['swark_authorize_bundleid'] = @bundle_id
|
74
|
+
swark_authorize_json['swark_authorize_status'] = false
|
75
|
+
File.open(swark_authorize_file, "w") do |f|
|
76
|
+
f.write(JSON.pretty_generate(swark_authorize_json))
|
77
|
+
end
|
78
|
+
git_addpush_repo(path:app_config_dir, message:"add swark authorize json")
|
79
|
+
end
|
80
|
+
else
|
81
|
+
swark_authorize_json = swark_authorize_json || {}
|
82
|
+
swark_authorize_json['swark_authorize_teamid'] = @team_id_vaule
|
83
|
+
swark_authorize_json['swark_authorize_bundleid'] = @bundle_id
|
84
|
+
swark_authorize_json['swark_authorize_status'] = false
|
85
|
+
File.open(swark_authorize_file, "w") do |f|
|
86
|
+
f.write(JSON.pretty_generate(swark_authorize_json))
|
87
|
+
end
|
88
|
+
git_addpush_repo(path:app_config_dir, message:"add swark authorize json")
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
|
2
|
+
require 'match'
|
3
|
+
require 'openssl'
|
4
|
+
require 'pindo/base/aeshelper'
|
5
|
+
require 'pindo/module/cert/keychainhelper'
|
6
|
+
require 'pindo/module/cert/provisioninghelper'
|
7
|
+
|
8
|
+
|
9
|
+
module Pindo
|
10
|
+
|
11
|
+
module CertHelper
|
12
|
+
|
13
|
+
def server_name(keychain_name)
|
14
|
+
["match", keychain_name].join("_")
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_cert_info(cer_certificate)
|
18
|
+
# can receive a certificate path or the file data
|
19
|
+
begin
|
20
|
+
if File.exist?(cer_certificate)
|
21
|
+
cer_certificate = File.binread(cer_certificate)
|
22
|
+
end
|
23
|
+
rescue ArgumentError
|
24
|
+
# cert strings have null bytes; suppressing output
|
25
|
+
end
|
26
|
+
|
27
|
+
cert = OpenSSL::X509::Certificate.new(cer_certificate)
|
28
|
+
|
29
|
+
# openssl output:
|
30
|
+
# subject= /UID={User ID}/CN={Certificate Name}/OU={Certificate User}/O={Organisation}/C={Country}
|
31
|
+
cert_info = cert.subject.to_s.gsub(/\s*subject=\s*/, "").tr("/", "\n")
|
32
|
+
out_array = cert_info.split("\n")
|
33
|
+
openssl_keys_to_readable_keys = {
|
34
|
+
'UID' => 'User ID',
|
35
|
+
'CN' => 'Common Name',
|
36
|
+
'OU' => 'Organisation Unit',
|
37
|
+
'O' => 'Organisation',
|
38
|
+
'C' => 'Country',
|
39
|
+
'notBefore' => 'Start Datetime',
|
40
|
+
'notAfter' => 'End Datetime'
|
41
|
+
}
|
42
|
+
|
43
|
+
return out_array.map { |x| x.split(/=+/) if x.include?("=") }
|
44
|
+
.compact
|
45
|
+
.map { |k, v| [openssl_keys_to_readable_keys.fetch(k, k), v] }
|
46
|
+
.push([openssl_keys_to_readable_keys.fetch("notBefore"), cert.not_before])
|
47
|
+
.push([openssl_keys_to_readable_keys.fetch("notAfter"), cert.not_after])
|
48
|
+
rescue => ex
|
49
|
+
raise Informative, "get_cert_info: #{ex}"
|
50
|
+
return {}
|
51
|
+
end
|
52
|
+
|
53
|
+
def select_cert_or_key(paths:)
|
54
|
+
cert_id_path = ENV['MATCH_CERTIFICATE_ID'] ? paths.find { |path| path.include?(ENV['MATCH_CERTIFICATE_ID']) } : nil
|
55
|
+
cert_id_path || paths.last
|
56
|
+
end
|
57
|
+
|
58
|
+
def is_cert_valid?(cer_certificate_path)
|
59
|
+
cert = OpenSSL::X509::Certificate.new(File.binread(cer_certificate_path))
|
60
|
+
now = Time.now.utc
|
61
|
+
return (now <=> cert.not_after) == -1
|
62
|
+
end
|
63
|
+
|
64
|
+
def isMac?
|
65
|
+
(/darwin/ =~ RUBY_PLATFORM) != nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def install_certs(certs_dir:nil, cert_type:nil)
|
69
|
+
|
70
|
+
|
71
|
+
if !cert_type.downcase.include?("development")
|
72
|
+
cert_type = "distribution"
|
73
|
+
end
|
74
|
+
|
75
|
+
certs = Dir[File.join(certs_dir, "certs", cert_type.to_s, "*.cer")]
|
76
|
+
keys = Dir[File.join(certs_dir, "certs", cert_type.to_s, "*.p12")]
|
77
|
+
|
78
|
+
if certs.count == 0 || keys.count == 0
|
79
|
+
raise Informative, "No certificates found in #{certs_dir}"
|
80
|
+
else
|
81
|
+
output_dir = Dir.mktmpdir
|
82
|
+
decrypt_password = "Gxtest#1"
|
83
|
+
|
84
|
+
Funlog.instance.fancyinfo_start("正在安装证书...")
|
85
|
+
|
86
|
+
cert_path = AESHelper.decrypt_specific_file(src_file: certs.first, password:decrypt_password, output_dir: output_dir)
|
87
|
+
key_path = AESHelper.decrypt_specific_file(src_file: keys.first, password:decrypt_password, output_dir: output_dir)
|
88
|
+
|
89
|
+
unless is_cert_valid?(cert_path)
|
90
|
+
raise Informative, "Your certificate '#{File.basename(cert_path)}' is not valid, please check end date and renew it if necessary"
|
91
|
+
end
|
92
|
+
|
93
|
+
if isMac?
|
94
|
+
|
95
|
+
keychain_name = "login.keychain"
|
96
|
+
|
97
|
+
if FastlaneCore::CertChecker.installed?(cert_path, in_keychain: nil)
|
98
|
+
Funlog.instance.fancyinfo_success("证书#{File.basename(cert_path)}已安装,无需重复安装!")
|
99
|
+
else
|
100
|
+
cert_password = "goodcert1"
|
101
|
+
keychain = 'login.keychain'
|
102
|
+
keychain_path = FastlaneCore::Helper.keychain_path(keychain)
|
103
|
+
|
104
|
+
KeychainHelper.import_file(cert_path, keychain_path, keychain_password: cert_password, certificate_password: "", skip_set_partition_list: false, output: false)
|
105
|
+
KeychainHelper.import_file(key_path, keychain_path, keychain_password: cert_password, certificate_password: "", skip_set_partition_list: false, output: false)
|
106
|
+
|
107
|
+
|
108
|
+
Funlog.instance.fancyinfo_success("证书'#{File.basename(cert_path)}'安装完成!")
|
109
|
+
end
|
110
|
+
else
|
111
|
+
puts "非Mac电脑不支持安装证书."
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
def install_provisionfiles(certs_dir:nil, bundle_id_map:nil, cert_type:nil)
|
117
|
+
|
118
|
+
if cert_type.downcase.include?("development")
|
119
|
+
cert_type = "Development"
|
120
|
+
elsif cert_type.downcase.include?("Adhoc")
|
121
|
+
cert_type = "Adhoc"
|
122
|
+
else
|
123
|
+
cert_type = "AppStore"
|
124
|
+
end
|
125
|
+
|
126
|
+
un_exist_files = []
|
127
|
+
|
128
|
+
provisioning_info_array = []
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
provisioning_info_array = []
|
133
|
+
|
134
|
+
bundle_id_map.each do |type, bundle_id_temp|
|
135
|
+
profile_filename = File.join(certs_dir, "profiles", cert_type.downcase.to_s,[cert_type.to_s, bundle_id_temp].join('_') + '.mobileprovision')
|
136
|
+
|
137
|
+
unless File.exist?(profile_filename)
|
138
|
+
un_exist_files << profile_filename
|
139
|
+
next
|
140
|
+
end
|
141
|
+
puts "正在安装 #{profile_filename}..."
|
142
|
+
decrypt_password = "Gxtest#1"
|
143
|
+
output_dir = Dir.mktmpdir
|
144
|
+
file_decrypt = AESHelper.decrypt_specific_file(src_file: profile_filename, password:decrypt_password, output_dir: output_dir)
|
145
|
+
destpath = Provisioninghelper.install(file_decrypt)
|
146
|
+
parsed_data = Provisioninghelper.parse(destpath)
|
147
|
+
|
148
|
+
provisioning_info = {}
|
149
|
+
provisioning_info['type'] = type
|
150
|
+
provisioning_info['bundle_id'] = bundle_id_temp
|
151
|
+
provisioning_info['profile_name'] = parsed_data['Name']
|
152
|
+
provisioning_info['profile_path'] = destpath
|
153
|
+
|
154
|
+
cert_info = get_cert_info(parsed_data["DeveloperCertificates"].first.string).to_h
|
155
|
+
provisioning_info['signing_identity'] = cert_info["Common Name"]
|
156
|
+
provisioning_info['team_id'] = parsed_data["TeamIdentifier"].first
|
157
|
+
|
158
|
+
puts JSON.pretty_generate(provisioning_info)
|
159
|
+
provisioning_info_array << provisioning_info
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
if un_exist_files.size > 0
|
165
|
+
raise Informative, "The following profiles do not exist: #{un_exist_files.join(', ')}"
|
166
|
+
end
|
167
|
+
|
168
|
+
return provisioning_info_array
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
end
|
176
|
+
end
|