pindo 4.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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