pindo 4.6.9 → 4.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/aeshelper.rb +48 -2
  3. data/lib/pindo/base/funlog.rb +89 -0
  4. data/lib/pindo/base/githelper.rb +30 -12
  5. data/lib/pindo/base/plaininformative.rb +3 -0
  6. data/lib/pindo/base/standarderror.rb +1 -0
  7. data/lib/pindo/base/xcodeconst.rb +251 -0
  8. data/lib/pindo/client/applovinclient.rb +6 -3
  9. data/lib/pindo/client/aws3sclient.rb +33 -46
  10. data/lib/pindo/client/bossclient.rb +1 -1
  11. data/lib/pindo/client/pgyerclient.rb +78 -14
  12. data/lib/pindo/command/appstore/iap.rb +43 -0
  13. data/lib/pindo/command/appstore/itcapp.rb +41 -0
  14. data/lib/pindo/command/appstore/metadata.rb +43 -0
  15. data/lib/pindo/command/appstore/screenshots.rb +43 -0
  16. data/lib/pindo/command/appstore/upload.rb +40 -0
  17. data/lib/pindo/command/appstore.rb +17 -0
  18. data/lib/pindo/command/deploy/build.rb +109 -0
  19. data/lib/pindo/{deploy → command/deploy}/bundleid.rb +1 -1
  20. data/lib/pindo/command/deploy/cert.rb +179 -0
  21. data/lib/pindo/command/deploy/configproj.rb +105 -0
  22. data/lib/pindo/{deploy → command/deploy}/getitcinfo.rb +1 -1
  23. data/lib/pindo/{deploy → command/deploy}/iap.rb +30 -9
  24. data/lib/pindo/{deploy → command/deploy}/itcapp.rb +0 -1
  25. data/lib/pindo/{deploy → command/deploy}/itcinfo.rb +2 -3
  26. data/lib/pindo/{deploy → command/deploy}/pem.rb +3 -2
  27. data/lib/pindo/{deploy → command/deploy}/resign.rb +14 -63
  28. data/lib/pindo/command/deploy.rb +44 -0
  29. data/lib/pindo/{dev → command/dev}/autobuild.rb +17 -80
  30. data/lib/pindo/{dev → command/dev}/autoresign.rb +17 -64
  31. data/lib/pindo/{dev → command/dev}/createbuild.rb +0 -2
  32. data/lib/pindo/{dev → command/dev}/debug.rb +6 -2
  33. data/lib/pindo/command/dev/pgyercert.rb +75 -0
  34. data/lib/pindo/command/dev.rb +25 -0
  35. data/lib/pindo/command/env.rb +17 -0
  36. data/lib/pindo/{ipa → command/ipa}/autoresign.rb +18 -70
  37. data/lib/pindo/{ipa → command/ipa}/import.rb +47 -102
  38. data/lib/pindo/{ipa → command/ipa}/output.rb +38 -135
  39. data/lib/pindo/command/ipa.rb +16 -0
  40. data/lib/pindo/{lib → command/lib}/update.rb +19 -10
  41. data/lib/pindo/command/lib.rb +16 -0
  42. data/lib/pindo/{pgyer → command/pgyer}/apptest.rb +7 -29
  43. data/lib/pindo/{pgyer → command/pgyer}/comment.rb +7 -30
  44. data/lib/pindo/{pgyer → command/pgyer}/download.rb +35 -30
  45. data/lib/pindo/{pgyer → command/pgyer}/login.rb +3 -4
  46. data/lib/pindo/command/pgyer/resign.rb +111 -0
  47. data/lib/pindo/command/pgyer/upload.rb +123 -0
  48. data/lib/pindo/command/pgyer.rb +18 -0
  49. data/lib/pindo/{repo.rb → command/repo.rb} +4 -4
  50. data/lib/pindo/{utils → command/utils}/applovin.rb +43 -33
  51. data/lib/pindo/{utils → command/utils}/boss.rb +3 -3
  52. data/lib/pindo/command/utils/icon.rb +81 -0
  53. data/lib/pindo/{utils → command/utils}/renewproj.rb +1 -0
  54. data/lib/pindo/command/utils.rb +26 -0
  55. data/lib/pindo/command.rb +23 -26
  56. data/lib/pindo/module/build/swarkhelper.rb +95 -0
  57. data/lib/pindo/module/cert/certhelper.rb +176 -0
  58. data/lib/pindo/module/cert/keychainhelper.rb +138 -0
  59. data/lib/pindo/module/{pemcreate.rb → cert/pemhelper.rb} +3 -1
  60. data/lib/pindo/module/cert/provisioninghelper.rb +137 -0
  61. data/lib/pindo/module/cert/xcodecerthelper.rb +301 -0
  62. data/lib/pindo/module/{pgyerhelper.rb → pgyer/pgyerhelper.rb} +246 -35
  63. data/lib/pindo/module/xcode/xcodeappconfig.rb +188 -0
  64. data/lib/pindo/module/xcode/xcodebuildconfig.rb +12 -0
  65. data/lib/pindo/module/xcode/xcodebuildhelper.rb +312 -0
  66. data/lib/pindo/module/xcode/xcoderesconstant.rb +248 -0
  67. data/lib/pindo/module/xcode/xcodereshandler.rb +198 -0
  68. data/lib/pindo/module/xcode/xcodereshelper.rb +120 -0
  69. data/lib/pindo/options/appconfigoptions.rb +1 -0
  70. data/lib/pindo/options/deployoptions.rb +38 -41
  71. data/lib/pindo/version.rb +1 -1
  72. metadata +109 -97
  73. data/lib/pindo/deploy/Fastfile +0 -233
  74. data/lib/pindo/deploy/build.rb +0 -167
  75. data/lib/pindo/deploy/cert.rb +0 -508
  76. data/lib/pindo/deploy/configproj.rb +0 -89
  77. data/lib/pindo/deploy.rb +0 -44
  78. data/lib/pindo/dev.rb +0 -23
  79. data/lib/pindo/env/flutter.rb +0 -59
  80. data/lib/pindo/env/flutter.sh +0 -116
  81. data/lib/pindo/env.rb +0 -17
  82. data/lib/pindo/ipa.rb +0 -22
  83. data/lib/pindo/lib.rb +0 -18
  84. data/lib/pindo/module/buildconfighelper.rb +0 -13
  85. data/lib/pindo/module/buildhelper.rb +0 -76
  86. data/lib/pindo/module/config_project.sh +0 -143
  87. data/lib/pindo/module/configprojhelper.rb +0 -631
  88. data/lib/pindo/module/icon_contents.json +0 -116
  89. data/lib/pindo/module/imessage_icon.json +0 -91
  90. data/lib/pindo/module/imgset_contents.json +0 -21
  91. data/lib/pindo/module/launchimg_contents.json +0 -21
  92. data/lib/pindo/module/xcodebuildpre.rb +0 -258
  93. data/lib/pindo/pgyer/upload.rb +0 -234
  94. data/lib/pindo/pgyer.rb +0 -17
  95. data/lib/pindo/utils/icon.rb +0 -91
  96. data/lib/pindo/utils/icon.sh +0 -133
  97. data/lib/pindo/utils/podindex.rb +0 -56
  98. data/lib/pindo/utils/podindex.sh +0 -30
  99. data/lib/pindo/utils.rb +0 -29
  100. /data/lib/pindo/{deploy → command/deploy}/check.rb +0 -0
  101. /data/lib/pindo/{deploy → command/deploy}/confusecode.rb +0 -0
  102. /data/lib/pindo/{deploy → command/deploy}/confuseproj.rb +0 -0
  103. /data/lib/pindo/{deploy → command/deploy}/fabric.rb +0 -0
  104. /data/lib/pindo/{deploy → command/deploy}/initconfig.rb +0 -0
  105. /data/lib/pindo/{deploy → command/deploy}/pullconfig.rb +0 -0
  106. /data/lib/pindo/{deploy → command/deploy}/pushconfig.rb +0 -0
  107. /data/lib/pindo/{deploy → command/deploy}/quswark.rb +0 -0
  108. /data/lib/pindo/{deploy → command/deploy}/quswauth.rb +0 -0
  109. /data/lib/pindo/{deploy → command/deploy}/reportbug.rb +0 -0
  110. /data/lib/pindo/{deploy → command/deploy}/tag.rb +0 -0
  111. /data/lib/pindo/{deploy → command/deploy}/updateconfig.rb +0 -0
  112. /data/lib/pindo/{deploy → command/deploy}/uploadipa.rb +0 -0
  113. /data/lib/pindo/{dev → command/dev}/confusecode.rb +0 -0
  114. /data/lib/pindo/{dev → command/dev}/confuseproj.rb +0 -0
  115. /data/lib/pindo/{dev → command/dev}/pub.rb +0 -0
  116. /data/lib/pindo/{dev → command/dev}/renewcert.rb +0 -0
  117. /data/lib/pindo/{env → command/env}/dreamstudio.rb +0 -0
  118. /data/lib/pindo/{env → command/env}/quarkenv.rb +0 -0
  119. /data/lib/pindo/{env → command/env}/swarkenv.rb +0 -0
  120. /data/lib/pindo/{env → command/env}/workhard.rb +0 -0
  121. /data/lib/pindo/{lib → command/lib}/forcepush.rb +0 -0
  122. /data/lib/pindo/{lib → command/lib}/lint.rb +0 -0
  123. /data/lib/pindo/{lib → command/lib}/push.rb +0 -0
  124. /data/lib/pindo/{repo → command/repo}/clone.rb +0 -0
  125. /data/lib/pindo/{repo → command/repo}/create.rb +0 -0
  126. /data/lib/pindo/{repo → command/repo}/login.rb +0 -0
  127. /data/lib/pindo/{repo → command/repo}/search.rb +0 -0
  128. /data/lib/pindo/{setup.rb → command/setup.rb} +0 -0
  129. /data/lib/pindo/{upgrade.rb → command/upgrade.rb} +0 -0
  130. /data/lib/pindo/{utils → command/utils}/clearcert.rb +0 -0
  131. /data/lib/pindo/{utils → command/utils}/device.rb +0 -0
  132. /data/lib/pindo/{utils → command/utils}/tgate.rb +0 -0
  133. /data/lib/pindo/{utils → command/utils}/xcassets.rb +0 -0
  134. /data/lib/pindo/{utils → command/utils}/xcassets.sh +0 -0
  135. /data/lib/pindo/module/{appstore_in_app_purchase.rb → appstore/appstore_in_app_purchase.rb} +0 -0
  136. /data/lib/pindo/module/{appstore_metadata_connect_api_helper.rb → appstore/appstore_metadata_connect_api_helper.rb} +0 -0
  137. /data/lib/pindo/module/{appstore_metadata_fastlane_helper.rb → appstore/appstore_metadata_fastlane_helper.rb} +0 -0
  138. /data/lib/pindo/module/{iap_tier.json → appstore/iap_tier.json} +0 -0
  139. /data/lib/pindo/module/{commonconfuseproj.rb → build/commonconfuseproj.rb} +0 -0
  140. /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
- if !skadnetwork_id_array.nil? && skadnetwork_id_array.size.size > 50
63
- puts "SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
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, "Applovin-info.plist")
86
- if !project_fullname.nil?
87
- proj_name = File.basename(project_fullname, ".xcodeproj")
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 && !project_fullname.nil?
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, "Applovin-info.plist")
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.fancyapptest"
121
- platform = @platform || "iOS_Funny_Test"
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
@@ -2,6 +2,7 @@
2
2
  require 'xcodeproj'
3
3
  require 'find'
4
4
  require 'fileutils'
5
+ require 'pindo/module/xcode/xcodehelper'
5
6
 
6
7
  module Pindo
7
8
  class Command
@@ -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/config/pindoconfig'
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/base/hashhelper'
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/buildconfighelper'
29
- require 'pindo/module/buildhelper'
30
- require 'pindo/module/pemcreate'
31
- require 'pindo/module/commonconfuseproj'
32
- require 'pindo/module/xcodebuildpre'
33
- require 'pindo/module/xcodehelper'
34
- require 'pindo/module/configprojhelper'
35
- require 'pindo/module/appstore_in_app_purchase'
36
- require 'pindo/module/appstore_metadata_fastlane_helper'
37
- require 'pindo/module/appstore_metadata_connect_api_helper'
38
-
39
-
40
- require 'pindo/deploy'
41
- require 'pindo/dev'
42
- require 'pindo/env'
43
- require 'pindo/lib'
44
- require 'pindo/utils'
45
- require 'pindo/pgyer'
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