pindo 4.6.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/bin/pindo +35 -0
  3. data/lib/pindo/base/aeshelper.rb +31 -0
  4. data/lib/pindo/base/deviceinfo.rb +90 -0
  5. data/lib/pindo/base/executable.rb +224 -0
  6. data/lib/pindo/base/githelper.rb +489 -0
  7. data/lib/pindo/base/hashhelper.rb +134 -0
  8. data/lib/pindo/base/plaininformative.rb +15 -0
  9. data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
  10. data/lib/pindo/base/standarderror.rb +14 -0
  11. data/lib/pindo/client/applovinclient.rb +156 -0
  12. data/lib/pindo/client/aws3sclient.rb +183 -0
  13. data/lib/pindo/client/bossclient.rb +229 -0
  14. data/lib/pindo/client/bossconfigclient.rb +175 -0
  15. data/lib/pindo/client/giteeclient.rb +65 -0
  16. data/lib/pindo/client/httpclient.rb +40 -0
  17. data/lib/pindo/client/pgyerclient.rb +439 -0
  18. data/lib/pindo/client/tgateclient.rb +103 -0
  19. data/lib/pindo/command.rb +101 -0
  20. data/lib/pindo/config/pindoconfig.rb +439 -0
  21. data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
  22. data/lib/pindo/deploy/Fastfile +233 -0
  23. data/lib/pindo/deploy/build.rb +167 -0
  24. data/lib/pindo/deploy/bundleid.rb +245 -0
  25. data/lib/pindo/deploy/cert.rb +508 -0
  26. data/lib/pindo/deploy/check.rb +79 -0
  27. data/lib/pindo/deploy/configproj.rb +89 -0
  28. data/lib/pindo/deploy/confusecode.rb +248 -0
  29. data/lib/pindo/deploy/confuseproj.rb +112 -0
  30. data/lib/pindo/deploy/fabric.rb +58 -0
  31. data/lib/pindo/deploy/getitcinfo.rb +248 -0
  32. data/lib/pindo/deploy/iap.rb +796 -0
  33. data/lib/pindo/deploy/initconfig.rb +128 -0
  34. data/lib/pindo/deploy/itcapp.rb +147 -0
  35. data/lib/pindo/deploy/itcinfo.rb +369 -0
  36. data/lib/pindo/deploy/pem.rb +55 -0
  37. data/lib/pindo/deploy/pullconfig.rb +46 -0
  38. data/lib/pindo/deploy/pushconfig.rb +83 -0
  39. data/lib/pindo/deploy/quswark.rb +146 -0
  40. data/lib/pindo/deploy/quswauth.rb +67 -0
  41. data/lib/pindo/deploy/reportbug.rb +135 -0
  42. data/lib/pindo/deploy/resign.rb +338 -0
  43. data/lib/pindo/deploy/tag.rb +108 -0
  44. data/lib/pindo/deploy/updateconfig.rb +129 -0
  45. data/lib/pindo/deploy/uploadipa.rb +63 -0
  46. data/lib/pindo/deploy.rb +44 -0
  47. data/lib/pindo/dev/autobuild.rb +204 -0
  48. data/lib/pindo/dev/autoresign.rb +186 -0
  49. data/lib/pindo/dev/confusecode.rb +127 -0
  50. data/lib/pindo/dev/confuseproj.rb +111 -0
  51. data/lib/pindo/dev/createbuild.rb +159 -0
  52. data/lib/pindo/dev/debug.rb +141 -0
  53. data/lib/pindo/dev/pub.rb +171 -0
  54. data/lib/pindo/dev/renewcert.rb +142 -0
  55. data/lib/pindo/dev.rb +23 -0
  56. data/lib/pindo/env/dreamstudio.rb +53 -0
  57. data/lib/pindo/env/flutter.rb +59 -0
  58. data/lib/pindo/env/flutter.sh +116 -0
  59. data/lib/pindo/env/quarkenv.rb +58 -0
  60. data/lib/pindo/env/swarkenv.rb +62 -0
  61. data/lib/pindo/env/workhard.rb +56 -0
  62. data/lib/pindo/env.rb +17 -0
  63. data/lib/pindo/ipa/autoresign.rb +188 -0
  64. data/lib/pindo/ipa/import.rb +261 -0
  65. data/lib/pindo/ipa/output.rb +396 -0
  66. data/lib/pindo/ipa.rb +22 -0
  67. data/lib/pindo/lib/forcepush.rb +159 -0
  68. data/lib/pindo/lib/lint.rb +115 -0
  69. data/lib/pindo/lib/push.rb +143 -0
  70. data/lib/pindo/lib/update.rb +75 -0
  71. data/lib/pindo/lib.rb +18 -0
  72. data/lib/pindo/module/appselect.rb +200 -0
  73. data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
  74. data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
  75. data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
  76. data/lib/pindo/module/buildconfighelper.rb +13 -0
  77. data/lib/pindo/module/buildhelper.rb +76 -0
  78. data/lib/pindo/module/commonconfuseproj.rb +271 -0
  79. data/lib/pindo/module/config_project.sh +143 -0
  80. data/lib/pindo/module/configprojhelper.rb +631 -0
  81. data/lib/pindo/module/iap_tier.json +813 -0
  82. data/lib/pindo/module/icon_contents.json +116 -0
  83. data/lib/pindo/module/imessage_icon.json +91 -0
  84. data/lib/pindo/module/imgset_contents.json +21 -0
  85. data/lib/pindo/module/launchimg_contents.json +21 -0
  86. data/lib/pindo/module/pemcreate.rb +63 -0
  87. data/lib/pindo/module/pgyerhelper.rb +339 -0
  88. data/lib/pindo/module/xcodebuildpre.rb +258 -0
  89. data/lib/pindo/module/xcodehelper.rb +521 -0
  90. data/lib/pindo/options/appconfigoptions.rb +23 -0
  91. data/lib/pindo/options/deployoptions.rb +363 -0
  92. data/lib/pindo/pgyer/apptest.rb +104 -0
  93. data/lib/pindo/pgyer/comment.rb +95 -0
  94. data/lib/pindo/pgyer/download.rb +105 -0
  95. data/lib/pindo/pgyer/login.rb +61 -0
  96. data/lib/pindo/pgyer/upload.rb +234 -0
  97. data/lib/pindo/pgyer.rb +17 -0
  98. data/lib/pindo/repo/clone.rb +78 -0
  99. data/lib/pindo/repo/create.rb +55 -0
  100. data/lib/pindo/repo/login.rb +64 -0
  101. data/lib/pindo/repo/search.rb +60 -0
  102. data/lib/pindo/repo.rb +16 -0
  103. data/lib/pindo/setup.rb +60 -0
  104. data/lib/pindo/upgrade.rb +56 -0
  105. data/lib/pindo/utils/applovin.rb +213 -0
  106. data/lib/pindo/utils/boss.rb +209 -0
  107. data/lib/pindo/utils/clearcert.rb +60 -0
  108. data/lib/pindo/utils/device.rb +279 -0
  109. data/lib/pindo/utils/icon.rb +91 -0
  110. data/lib/pindo/utils/icon.sh +133 -0
  111. data/lib/pindo/utils/podindex.rb +56 -0
  112. data/lib/pindo/utils/podindex.sh +30 -0
  113. data/lib/pindo/utils/renewproj.rb +146 -0
  114. data/lib/pindo/utils/tgate.rb +159 -0
  115. data/lib/pindo/utils/xcassets.rb +46 -0
  116. data/lib/pindo/utils/xcassets.sh +88 -0
  117. data/lib/pindo/utils.rb +29 -0
  118. data/lib/pindo/version.rb +110 -0
  119. data/lib/pindo.rb +34 -0
  120. metadata +364 -0
@@ -0,0 +1,631 @@
1
+
2
+ require 'fileutils'
3
+
4
+ module Pindo
5
+
6
+ module Configprojhelper
7
+
8
+
9
+
10
+ def pull_podfile_lock(project_dir:nil, app_config_dir:nil)
11
+
12
+
13
+ begin
14
+ puts
15
+ puts "获取最新的Podfile.lock..."
16
+ puts
17
+ src_pod_file = File.join(app_config_dir, "Podfile.lock")
18
+ build_verify_file = File.join(app_config_dir, "build_verify.json")
19
+ build_verify_json = nil
20
+ begin
21
+ build_verify_json = JSON.parse(File.read(build_verify_file))
22
+ rescue => error
23
+ end
24
+ build_verify_json = build_verify_json || {}
25
+ build_verify_json["release_code_commit"] = git_latest_commit_id(local_repo_dir:project_dir)
26
+ build_verify_json["release_config_commit"] = git_latest_commit_id(local_repo_dir:app_config_dir)
27
+ bytes = File.binread(src_pod_file)
28
+ checksum = Digest::MD5.hexdigest(bytes)
29
+ build_verify_json["release_podfile_checksum"] = checksum
30
+ build_verify_json["release_time"] = Time.now.strftime('%y/%m/%d %H:%M:%S')
31
+
32
+ File.open(build_verify_file, "w") do |file|
33
+ file.write(JSON.pretty_generate(build_verify_json))
34
+ file.close
35
+ end
36
+
37
+ git_addpush_repo(path:app_config_dir, message:"back release info", commit_file_params:["build_verify.json"])
38
+
39
+ if File.exist?(src_pod_file)
40
+ FileUtils.cp_r(src_pod_file, File.join(project_dir, "Podfile.lock"))
41
+ end
42
+ puts
43
+ puts "获取Podfile.lock完成!!!"
44
+ puts
45
+
46
+ rescue => error
47
+ puts error
48
+ raise Informative, "获取Podfile.lock 文件失败!!!"
49
+ end
50
+
51
+
52
+ end
53
+
54
+ def backup_podfile_lock(project_dir:nil, app_config_dir:nil, appversion:nil)
55
+
56
+ begin
57
+ # if File.exist?(File.join(project_dir, "Podfile.lock"))
58
+ puts
59
+ puts "保存最新的Podfile.lock..."
60
+ puts
61
+
62
+ proj_pod_file = File.join(project_dir, "Podfile.lock")
63
+ FileUtils.cp_r(proj_pod_file, File.join(app_config_dir, "Podfile.lock"))
64
+ git_addpush_repo(path:app_config_dir, message:"#{appversion} backup podfile.lock", commit_file_params:["Podfile.lock"])
65
+
66
+ puts
67
+ puts "保存Podfile.lock完成!!!"
68
+ puts
69
+
70
+ bytes = File.binread(proj_pod_file)
71
+ checksum = Digest::MD5.hexdigest(bytes)
72
+ build_verify_file = File.join(app_config_dir, "build_verify.json")
73
+ build_verify_json = nil
74
+ begin
75
+ build_verify_json = JSON.parse(File.read(build_verify_file))
76
+ rescue => error
77
+ end
78
+ build_verify_json = build_verify_json || {}
79
+ build_verify_json["output_code_commit"] = git_latest_commit_id(local_repo_dir:project_dir)
80
+ build_verify_json["output_config_commit"] = git_latest_commit_id(local_repo_dir:app_config_dir)
81
+ build_verify_json["output_podfile_checksum"] = checksum
82
+ build_verify_json["output_time"] = Time.now.strftime('%y/%m/%d %H:%M:%S')
83
+
84
+ File.open(build_verify_file, "w") do |file|
85
+ file.write(JSON.pretty_generate(build_verify_json))
86
+ file.close
87
+ end
88
+ git_addpush_repo(path:app_config_dir, message:"backup #{appversion} output info", commit_file_params:["build_verify.json"])
89
+
90
+ # end
91
+ rescue => error
92
+ raise Informative, "保存Podfile.lock 文件失败!!!"
93
+ end
94
+
95
+ end
96
+
97
+ def modify_google_plist(project_dir:nil, app_config_dir:nil)
98
+
99
+ if !File.exist?(File.join(project_dir, "AppEntry/GoogleService-Info.plist"))
100
+ puts app_config_dir
101
+ puts "Xcode Missing GoogleService-Info.plist in #{project_dir}!!! Project neead add firebase !!!"
102
+ else
103
+
104
+ if !File.exist?(File.join(app_config_dir, "GoogleService-Info.plist")) && File.exist?(File.join(project_dir, "AppEntry/GoogleService-Info.plist"))
105
+ puts app_config_dir
106
+ raise Informative, "Missing GoogleService-Info.plist in #{app_config_dir}!!! You need creat GoogleService-Info.plist !!!"
107
+ end
108
+
109
+ if File.exist?(File.join(app_config_dir, "GoogleService-Info.plist"))
110
+ FileUtils.cp_r(File.join(app_config_dir, "GoogleService-Info.plist"), File.join(project_dir, "AppEntry/GoogleService-Info.plist"))
111
+ end
112
+
113
+ end
114
+ end
115
+
116
+ def modify_appprefix_plist(project_dir:nil, appprefix_file:nil, config_json:nil)
117
+
118
+ config_json['app_setting'].each do |key, value|
119
+ puts value
120
+ if !value.nil? && value.to_s.include?("__________config")
121
+ raise Informative, "config.json 配置文件key : #{key} 包含初始值未修改, 配置正确的值或者删除!!!"
122
+ end
123
+ end
124
+
125
+ bFind = false
126
+
127
+ Find.find(File.join(project_dir, "PResources")) do |path|
128
+
129
+ if path.to_s.end_with?(appprefix_file) then
130
+ puts ""
131
+ puts "Modify App Config:"
132
+ puts ""
133
+ bFind = true
134
+ if appprefix_file.include?(".plist") then
135
+ info_plist_dict = Xcodeproj::Plist.read_from_path(path)
136
+ if config_json['app_setting']
137
+
138
+ config_json['app_setting'].each { |key,value| puts "#{key} = #{value}"}
139
+
140
+ new_info_plist_dict = {}
141
+
142
+ info_plist_dict.each do |key, value|
143
+ if config_json['app_setting'][key] != "" && config_json['app_setting'][key]
144
+ new_info_plist_dict[key] = config_json['app_setting'][key]
145
+ else
146
+ new_info_plist_dict[key] = value
147
+ end
148
+ end
149
+
150
+ end
151
+ Xcodeproj::Plist.write_to_path(new_info_plist_dict, path)
152
+ else
153
+
154
+ appprefix_file_json=JSON.parse(File.read(path))
155
+
156
+ if config_json['app_setting']
157
+ new_appprefix_file_json = {}
158
+
159
+ config_json['app_setting'].each { |key,value| puts "#{key} = #{value}"}
160
+
161
+ appprefix_file_json.each do |key, value|
162
+ if config_json['app_setting'][key] != "" && config_json['app_setting'][key]
163
+ new_appprefix_file_json[key] = config_json['app_setting'][key]
164
+ else
165
+ new_appprefix_file_json[key] = value
166
+ end
167
+ end
168
+
169
+ File.open(path, "w") do |f|
170
+ f.write(JSON.pretty_generate(new_appprefix_file_json))
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
176
+
177
+ if !bFind
178
+ raise Informative, "工程本地配置未修改,PResources/目录下没有找到对应的配置文件 #{appprefix_file} !!!!"
179
+ end
180
+ end
181
+
182
+ def modify_infoplist_version(plist_file_name:nil, config_json:nil, target_name:nil)
183
+
184
+ if File.exist?(plist_file_name)
185
+ info_plist_dict = Xcodeproj::Plist.read_from_path(plist_file_name)
186
+ info_plist_dict["CFBundleIdentifier"] = "$(PRODUCT_BUNDLE_IDENTIFIER)"
187
+
188
+ exe_binary_name = config_json['app_info']["app_display_name"]
189
+ exe_binary_name = exe_binary_name.gsub(/ /, '');
190
+ exe_binary_name = exe_binary_name.gsub(/\'/, '');
191
+
192
+ info_plist_dict["CFBundleDisplayName"] = config_json['app_info']["app_display_name"]
193
+ if !info_plist_dict["CFBundleName"].nil?
194
+ info_plist_dict["CFBundleName"] = exe_binary_name
195
+ end
196
+
197
+ if config_json['app_info']["imessage_display_name"] && target_name && target_name.end_with?("iMessage")
198
+ info_plist_dict["CFBundleDisplayName"] = config_json['app_info']["imessage_display_name"]
199
+ end
200
+ if config_json['app_info']["extension_display_name"] && target_name && target_name.end_with?("Extension")
201
+ info_plist_dict["CFBundleDisplayName"] = config_json['app_info']["extension_display_name"]
202
+ end
203
+
204
+
205
+ if config_json['app_info']["extensionad_display_name"] && target_name && target_name.end_with?("ExtensionAd")
206
+ info_plist_dict["CFBundleDisplayName"] = config_json['app_info']["extensionad_display_name"]
207
+ end
208
+
209
+ if config_json['app_info']["extensionporn_display_name"] && target_name && target_name.end_with?("ExtensionPorn")
210
+ info_plist_dict["CFBundleDisplayName"] = config_json['app_info']["extensionporn_display_name"]
211
+ end
212
+
213
+ if config_json['app_info']["keyboard_display_name"] && target_name && target_name.end_with?("Keyboard")
214
+ info_plist_dict["CFBundleDisplayName"] = config_json['app_info']["keyboard_display_name"]
215
+ end
216
+
217
+
218
+ if config_json['app_info']["siri_display_name"] && target_name && target_name.end_with?("Keyboard")
219
+ info_plist_dict["CFBundleDisplayName"] = config_json['app_info']["siri_display_name"]
220
+ end
221
+
222
+ if config_json['app_info']["siriui_display_name"] && target_name && target_name.end_with?("iMessage")
223
+ info_plist_dict["CFBundleDisplayName"] = config_json['app_info']["siriui_display_name"]
224
+ end
225
+
226
+
227
+
228
+ unless config_json['app_info']["app_version"]
229
+ raise Informative, "config.json Missing app_info app_version !!!"
230
+ end
231
+
232
+ info_plist_dict["CFBundleShortVersionString"] = config_json['app_info']["app_version"]
233
+
234
+ unless config_json['app_info']["app_build_version"]
235
+ raise Informative, "config.json Missing app_info app_build_version !!!"
236
+ end
237
+ info_plist_dict["CFBundleVersion"] = config_json['app_info']["app_build_version"]
238
+ Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file_name)
239
+ end
240
+ end
241
+
242
+
243
+ def modify_maintarget_info_plist(plist_file_name:nil, config_json:nil, target_name:nil)
244
+ if File.exist?(plist_file_name)
245
+ info_plist_dict = Xcodeproj::Plist.read_from_path(plist_file_name)
246
+
247
+ info_plist_dict.delete("AccountKitClientToken")
248
+
249
+ if info_plist_dict["Fabric"]
250
+ info_plist_dict.delete('Fabric')
251
+ end
252
+
253
+
254
+ if !config_json['app_info']['admob_app_id'].nil? && config_json['app_info']['admob_app_id'].include?("__________config")
255
+ raise Informative, "config.json 配置文件key :admob_app_id 包含初始值未修改, 配置正确的值或者删除!!!"
256
+ end
257
+
258
+ if !info_plist_dict["GADApplicationIdentifier"].nil? && config_json['app_info']['admob_app_id'].nil?
259
+ raise Informative, "工程Info.plist中有 Admob 配置,config.json缺少 Admob 配置参数!!!"
260
+ end
261
+
262
+ if !config_json['app_info']['admob_app_id'].nil?
263
+ info_plist_dict["GADApplicationIdentifier"] = config_json['app_info']['admob_app_id']
264
+ end
265
+
266
+
267
+
268
+
269
+ if !config_json['app_info']['applovin_app_id'].nil? && config_json['app_info']['applovin_app_id'].include?("__________config")
270
+ raise Informative, "config.json 配置文件key :applovin_app_id 包含初始值未修改, 配置正确的值或者删除!!!"
271
+ end
272
+
273
+ if !info_plist_dict["AppLovinSdkKey"].nil? && config_json['app_info']['applovin_app_id'].nil?
274
+ raise Informative, "工程Info.plist中有 AppLovin 配置,config.json缺少 AppLovin 配置参数!!!"
275
+ end
276
+
277
+ if !info_plist_dict["AppLovinSdkKey"].nil? && !config_json['app_info']['applovin_app_id'].nil?
278
+ info_plist_dict["AppLovinSdkKey"] = config_json['app_info']['applovin_app_id']
279
+ else
280
+ info_plist_dict.delete('AppLovinSdkKey')
281
+ end
282
+
283
+ # if config_json['app_setting'] && config_json['app_setting']['applovin_app_id']
284
+ # info_plist_dict["AppLovinSdkKey"] = config_json['app_setting']['applovin_app_id']
285
+ # elsif config_json['app_setting'] && config_json['app_setting']['kGUKeyApplovinAppId']
286
+ # info_plist_dict["AppLovinSdkKey"] = config_json['app_setting']['kGUKeyApplovinAppId']
287
+ # else
288
+ # info_plist_dict.delete('AppLovinSdkKey')
289
+ # end
290
+
291
+
292
+
293
+
294
+
295
+ info_plist_dict["CFBundleURLTypes"] = []
296
+ item0 = {}
297
+ item0["CFBundleTypeRole"] = "Editor"
298
+ item0["CFBundleURLName"] = "$(PRODUCT_BUNDLE_IDENTIFIER)"
299
+ item0["CFBundleURLSchemes"] = []
300
+ item0["CFBundleURLSchemes"] << "$(PRODUCT_BUNDLE_IDENTIFIER)"
301
+ info_plist_dict["CFBundleURLTypes"] << item0
302
+
303
+ if config_json['app_info'] && config_json['app_info']['facebook_app_id']
304
+ info_plist_dict["FacebookAppID"] = config_json['app_info']['facebook_app_id']
305
+ if config_json['app_info']['facebook_client_token'].nil?
306
+ raise Informative, "config.json FB Token 是空的"
307
+ end
308
+ info_plist_dict["FacebookClientToken"] = config_json['app_info']['facebook_client_token']
309
+ info_plist_dict["FacebookDisplayName"] = config_json['app_info']['app_display_name']
310
+ item1 = {}
311
+ item1["CFBundleTypeRole"] = "Editor"
312
+ item1["CFBundleURLSchemes"] = []
313
+ item1["CFBundleURLSchemes"] << "fb" + config_json['app_info']['facebook_app_id']
314
+ info_plist_dict["CFBundleURLTypes"] << item1
315
+ else
316
+ info_plist_dict.delete('FacebookAppID')
317
+ info_plist_dict.delete('FacebookClientToken')
318
+ info_plist_dict.delete('FacebookDisplayName')
319
+ end
320
+
321
+ Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file_name)
322
+ end
323
+
324
+ end
325
+
326
+ def modify_info_plist(project_dir:nil, proj_name:nil, config_json:nil)
327
+
328
+ ## Main Info.plist
329
+ proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
330
+ project_obj = Xcodeproj::Project.open(proj_fullname)
331
+
332
+ info_plist_path = File.join(project_dir, "AppEntry", "Info.plist")
333
+ project_obj.targets.each do |target|
334
+
335
+ temp_info = target.build_configurations.first.build_settings['INFOPLIST_FILE']
336
+ info_plist_path = File.join(project_dir, temp_info)
337
+
338
+ if target.product_type.to_s.eql?("com.apple.product-type.application") && !File.exist?(info_plist_path)
339
+ raise Informative, "Missing Target #{target.name.to_s} Info.plist !!! Modify Info.plist Error !!!"
340
+ end
341
+
342
+ if target.product_type.to_s.eql?("com.apple.product-type.application") then
343
+ modify_maintarget_info_plist(plist_file_name:info_plist_path, config_json:config_json, target_name:proj_name)
344
+ end
345
+
346
+ modify_infoplist_version(plist_file_name:info_plist_path, config_json:config_json, target_name:target.name.to_s)
347
+ end
348
+
349
+ end
350
+
351
+
352
+ def remove_test_pod_modue(project_dir:nil)
353
+
354
+ pod_file = File.join(project_dir, "Podfile")
355
+
356
+ command = 'sed -i "" "/.*' + "FancySettingsPlugin" +'.*/d" ' + pod_file
357
+ system command
358
+
359
+ command = 'sed -i "" "/.*' + "TYSettingsPlugin" +'.*/d" ' + pod_file
360
+ system command
361
+
362
+ command = 'sed -i "" "/.*' + "CSSettingsPlugin" +'.*/d" ' + pod_file
363
+ system command
364
+
365
+ command = 'sed -i "" "/.*' + "FunnySettingsPlugin" +'.*/d" ' + pod_file
366
+ system command
367
+ end
368
+
369
+ def add_pod_modue(project_dir:nil, pod_name:nil, pod_version:nil)
370
+
371
+ puts "Modify App Podfile: "
372
+ # if File.exist?(File.join(project_dir, "Podfile.lock"))
373
+ # FileUtils.rm_rf(File.join(project_dir, "Podfile.lock"))
374
+ # end
375
+
376
+ pod_file = File.join(project_dir, "Podfile")
377
+
378
+ command = 'sed -i "" "/.*' + "AppSource" +'.*/d" ' + pod_file
379
+ system command
380
+
381
+ command = 'sed -i "" "/.*' + "QuarkData" +'.*/d" ' + pod_file
382
+ system command
383
+
384
+ command = 'sed -i "" "/.*' + "VMData" +'.*/d" ' + pod_file
385
+ system command
386
+
387
+ command = 'sed -i "" "/.*' + pod_name +'.*/d" ' + pod_file
388
+ system command
389
+
390
+ if File.exist?(File.join(project_dir, "Podfile"))
391
+ puts " #{pod_name} #{pod_version}"
392
+ text = File.read(File.join(project_dir, "Podfile"))
393
+
394
+ if pod_version.nil? || pod_version == "" || pod_version.empty?
395
+
396
+ if text.include?("FirebaseAnalytics")
397
+ new_contents = text.gsub!(/\'FirebaseAnalytics\'.*$/, "\'FirebaseAnalytics\'\r\n pod \'#{pod_name}\' ")
398
+ elsif text.include?("UMCommon")
399
+ new_contents = text.gsub!(/\'UMCommon\'.*$/, "\'UMCommon\'\r\n pod \'#{pod_name}\' ")
400
+ end
401
+ else
402
+ if text.include?("FirebaseAnalytics")
403
+ new_contents = text.gsub!(/\'FirebaseAnalytics\'.*$/, "\'FirebaseAnalytics\'\r\n pod \'#{pod_name}\', \'#{pod_version}\' ")
404
+ elsif text.include?("UMCommon")
405
+ new_contents = text.gsub!(/\'UMCommon\'.*$/, "\'UMCommon\'\r\n pod \'#{pod_name}\', \'#{pod_version}\' ")
406
+ end
407
+ end
408
+ File.open(File.join(project_dir, "Podfile"), "w") {|file| file.puts new_contents }
409
+ end
410
+ end
411
+
412
+ def copy_img_res(src_dir:nil, src_img_name:nil, dst_dir:nil, dst_img_name:nil, ignore_error:false)
413
+ dst_full_file = File.join(dst_dir, dst_img_name)
414
+ if File.exist?(dst_full_file)
415
+ FileUtils.rm_rf(dst_full_file)
416
+ end
417
+ puts src_img_name
418
+ if File.exist?(File.join(src_dir, src_img_name))
419
+ FileUtils.cp_r(File.join(src_dir, src_img_name), dst_full_file)
420
+ if !File.exist?(dst_full_file)
421
+ puts File.join(src_dir, src_img_name)
422
+ raise Informative, "Missing file #{dst_full_file}"
423
+ end
424
+ end
425
+ end
426
+
427
+ def modify_launch_image_res(project_dir:nil, app_config_dir:nil, proj_name:nil, config_json:nil)
428
+
429
+ img_src_dir = File.join(app_config_dir, 'launch')
430
+ launch_json_dir = File.join(project_dir, "AppEntry/Assets.xcassets/LaunchImage.imageset")
431
+ launch_json_file = File.join(project_dir, "AppEntry/Assets.xcassets/LaunchImage.imageset/Contents.json")
432
+ if File.exist?(launch_json_file)
433
+ default_json_file = File.join(File.expand_path('./', __dir__), 'imgset_contents.json')
434
+ launch_json = JSON.parse(File.read(default_json_file))
435
+ File.open(launch_json_file, "w") do |f|
436
+ f.write(JSON.pretty_generate(launch_json))
437
+ end
438
+ if File.exist?(File.join(launch_json_dir, "w768_h1024@1x.png"))
439
+ FileUtils.rm_rf(File.join(launch_json_dir, "w768_h1024@1x.png"))
440
+ end
441
+ copy_img_res(src_dir:img_src_dir, src_img_name:"w768_h1024@2x.png", dst_dir:launch_json_dir, dst_img_name:"w768_h1024@2x.png")
442
+ end
443
+
444
+ launch_json_dir = File.join(project_dir, "AppEntry/Assets.xcassets/LaunchImage.launchimage")
445
+ launch_json_file = File.join(project_dir, "AppEntry/Assets.xcassets/LaunchImage.launchimage/Contents.json")
446
+ if File.exist?(launch_json_file)
447
+ default_json_file = File.join(File.expand_path('./', __dir__), 'launchimg_contents.json')
448
+ launch_json = JSON.parse(File.read(default_json_file))
449
+ File.open(launch_json_file, "w") do |f|
450
+ f.write(JSON.pretty_generate(launch_json))
451
+ end
452
+ if File.exist?(File.join(launch_json_dir, "w768_h1024@1x.png"))
453
+ FileUtils.rm_rf(File.join(launch_json_dir, "w768_h1024@1x.png"))
454
+ end
455
+ copy_img_res(src_dir:img_src_dir, src_img_name:"w768_h1024@2x.png", dst_dir:launch_json_dir, dst_img_name:"w768_h1024@2x.png")
456
+ end
457
+ end
458
+
459
+
460
+ def modify_icon_res(project_dir:nil, app_config_dir:nil, proj_name:nil, config_json:nil)
461
+
462
+ shellFile = File.join(File.expand_path('./', __dir__), 'config_project.sh')
463
+ iconShellFile = File.join(File.expand_path('../utils', __dir__), 'icon.sh')
464
+ icon_src_file = File.join(app_config_dir, 'fastlane/icon.png')
465
+ imessage_icon_src_file = File.join(app_config_dir, 'fastlane/icon1024_768.png')
466
+ icon_dest_dir = File.join(app_config_dir, 'icon_' +Time.now.strftime('%y%m%d_%H%M%S'))
467
+
468
+ if !File.exist?(icon_dest_dir)
469
+ FileUtils.mkdir(icon_dest_dir)
470
+ end
471
+
472
+ if File.exist?(imessage_icon_src_file)
473
+ command = 'bash ' + iconShellFile + " -i #{icon_src_file}" + " -a #{imessage_icon_src_file}" + " -o #{icon_dest_dir}" + " > /dev/null 2>&1"
474
+ else
475
+ command = 'bash ' + iconShellFile + " -i #{icon_src_file}" + " -o #{icon_dest_dir}" + " > /dev/null 2>&1"
476
+ end
477
+ system command
478
+
479
+
480
+ icon_proj_dir = File.join(project_dir, "AppEntry/Assets.xcassets/AppIcon.appiconset")
481
+ icon_proj_file = File.join(project_dir, "AppEntry/Assets.xcassets/AppIcon.appiconset/Contents.json")
482
+ default_json_file = File.join(File.expand_path('./', __dir__), 'icon_contents.json')
483
+ launch_json = JSON.parse(File.read(default_json_file))
484
+ File.open(icon_proj_file, "w") do |f|
485
+ f.write(JSON.pretty_generate(launch_json))
486
+ end
487
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon20@1x.png", dst_dir:icon_proj_dir, dst_img_name:"icon20@1x.png")
488
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon20@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon20@2x.png")
489
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon20@3x.png", dst_dir:icon_proj_dir, dst_img_name:"icon20@3x.png")
490
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon29@1x.png", dst_dir:icon_proj_dir, dst_img_name:"icon29@1x.png")
491
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon29@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon29@2x.png")
492
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon29@3x.png", dst_dir:icon_proj_dir, dst_img_name:"icon29@3x.png")
493
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon40@1x.png", dst_dir:icon_proj_dir, dst_img_name:"icon40@1x.png")
494
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon40@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon40@2x.png")
495
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon40@3x.png", dst_dir:icon_proj_dir, dst_img_name:"icon40@3x.png")
496
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon60@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon60@2x.png")
497
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon60@3x.png", dst_dir:icon_proj_dir, dst_img_name:"icon60@3x.png")
498
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon76@1x.png", dst_dir:icon_proj_dir, dst_img_name:"icon76@1x.png")
499
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon76@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon76@2x.png")
500
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon83_5@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon83_5@2x.png")
501
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon1024@1x.png", dst_dir:icon_proj_dir, dst_img_name:"icon1024@1x.png")
502
+
503
+ extension_icon_src_dir = File.join(project_dir, proj_name + "Extension/Assets.xcassets/AppIcon.appiconset")
504
+
505
+ puts " +++ extension_icon_src_dir ++++ extension_icon_src_dir "
506
+ puts extension_icon_src_dir
507
+
508
+ if File.exist?(extension_icon_src_dir)
509
+ puts extension_icon_src_dir
510
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon20@1x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon20@1x.png")
511
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon20@2x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon20@2x.png")
512
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon20@3x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon20@3x.png")
513
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon29@1x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon29@1x.png")
514
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon29@2x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon29@2x.png")
515
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon29@3x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon29@3x.png")
516
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon40@1x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon40@1x.png")
517
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon40@2x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon40@2x.png")
518
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon40@3x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon40@3x.png")
519
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon60@2x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon60@2x.png")
520
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon60@3x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon60@3x.png")
521
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon76@1x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon76@1x.png")
522
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon76@2x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon76@2x.png")
523
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon83_5@2x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon83_5@2x.png")
524
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon1024@1x.png", dst_dir:extension_icon_src_dir, dst_img_name:"icon1024@1x.png")
525
+ end
526
+
527
+ if File.exist?(imessage_icon_src_file)
528
+ imessage_icon_dest_dir = File.join(icon_dest_dir,"imessage")
529
+ icon_proj_dir = File.join(project_dir, proj_name + "iMessage/Assets.xcassets/iMessage App Icon.stickersiconset")
530
+ icon_proj_file = File.join(project_dir, proj_name + "iMessage/Assets.xcassets/iMessage App Icon.stickersiconset/Contents.json")
531
+ default_json_file = File.join(File.expand_path('./', __dir__), 'imessage_icon.json')
532
+ launch_json = JSON.parse(File.read(default_json_file))
533
+ File.open(icon_proj_file, "w") do |f|
534
+ f.write(JSON.pretty_generate(launch_json))
535
+ end
536
+
537
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon27_20@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon27_20@2x.png")
538
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon27_20@3x.png", dst_dir:icon_proj_dir, dst_img_name:"icon27_20@3x.png")
539
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon29@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon29@2x.png")
540
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon29@3x.png", dst_dir:icon_proj_dir, dst_img_name:"icon29@3x.png")
541
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon32_24@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon32_24@2x.png")
542
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon32_24@3x.png", dst_dir:icon_proj_dir, dst_img_name:"icon32_24@3x.png")
543
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon60_45@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon60_45@2x.png")
544
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon60_45@3x.png", dst_dir:icon_proj_dir, dst_img_name:"icon60_45@3x.png")
545
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon67_50@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon67_50@2x.png")
546
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon74_55@2x.png", dst_dir:icon_proj_dir, dst_img_name:"icon74_55@2x.png")
547
+ copy_img_res(src_dir:imessage_icon_dest_dir, src_img_name:"icon1024_768@1x.png", dst_dir:icon_proj_dir, dst_img_name:"icon1024_768@1x.png")
548
+ copy_img_res(src_dir:icon_dest_dir, src_img_name:"icon1024@1x.png", dst_dir:icon_proj_dir, dst_img_name:"icon1024@1x.png")
549
+ end
550
+
551
+ if File.exist?(icon_dest_dir)
552
+ FileUtils.rm_rf(icon_dest_dir)
553
+ end
554
+ end
555
+
556
+ def modify_project_config(project_dir:nil, proj_name:nil, config_json:nil)
557
+
558
+ proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
559
+ project_obj = Xcodeproj::Project.open(proj_fullname)
560
+
561
+ ios_deployment_targe = "14.0"
562
+ if config_json && config_json['project_info'] && config_json['project_info']['ios_deployment_targe']
563
+ ios_deployment_targe = config_json['project_info']['ios_deployment_targe']
564
+ end
565
+
566
+ project_obj.targets.each do |target|
567
+
568
+ exe_binary_name = config_json['app_info']['app_display_name']
569
+ exe_binary_name = exe_binary_name.gsub(/ /, '');
570
+ exe_binary_name = exe_binary_name.gsub(/\'/, '');
571
+
572
+ target.build_configurations.each do |config|
573
+ config.build_settings['CURRENT_PROJECT_VERSION'] = config_json['app_info']['app_build_version']
574
+ config.build_settings['MARKETING_VERSION'] = config_json['app_info']['app_version']
575
+ config.build_settings['INFOPLIST_KEY_CFBundleDisplayName'] = config_json['app_info']['app_display_name']
576
+ end
577
+
578
+ if target.name.to_s.end_with?("Content") then
579
+ target.build_configurations.each do |config|
580
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "Content"
581
+ end
582
+ elsif target.name.to_s.end_with?("Service") then
583
+ target.build_configurations.each do |config|
584
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "Service"
585
+ end
586
+ elsif target.name.to_s.end_with?("Keyboard") then
587
+ target.build_configurations.each do |config|
588
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "Keyboard"
589
+ end
590
+ elsif target.name.to_s.end_with?("iMessage") then
591
+ target.build_configurations.each do |config|
592
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "iMessage"
593
+ end
594
+ elsif target.name.to_s.end_with?("Siri") then
595
+ target.build_configurations.each do |config|
596
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "Siri"
597
+ end
598
+ elsif target.name.to_s.end_with?("SiriUI") then
599
+ target.build_configurations.each do |config|
600
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "SiriUI"
601
+ end
602
+ elsif target.name.to_s.end_with?("Widget") then
603
+ target.build_configurations.each do |config|
604
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "Widget"
605
+ end
606
+ elsif target.name.to_s.end_with?("Extension") then
607
+ target.build_configurations.each do |config|
608
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "Extension"
609
+ end
610
+ elsif target.name.to_s.end_with?("ExtensionAd") then
611
+ target.build_configurations.each do |config|
612
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "ExtensionAd"
613
+ end
614
+ elsif target.name.to_s.end_with?("ExtensionPorn") then
615
+ target.build_configurations.each do |config|
616
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name + "ExtensionPorn"
617
+ end
618
+ else
619
+ target.build_configurations.each do |config|
620
+ config.build_settings['PRODUCT_NAME'] = exe_binary_name
621
+ config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = ios_deployment_targe
622
+ end
623
+ end
624
+ end
625
+ project_obj.save
626
+
627
+ end
628
+
629
+ end
630
+
631
+ end