pindo 5.13.2 → 5.13.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: efb0e602f3e0c11eca368669749cfc80c51854a3d7563dfe7d2a66e639507c12
4
- data.tar.gz: 77df00465e5213f16b11241564184a969a43d49385476930a395524a5cf55764
3
+ metadata.gz: 7b8f4e3397e7d22aee8dd0011d92a8eec9c7cfb8b51b3676a78e518b27c71b25
4
+ data.tar.gz: e8eca26bbd129b1f561d09462f5dde5bedf5059172c711ec01da98427a19f446
5
5
  SHA512:
6
- metadata.gz: c3c3826097cdf84681875828afe7c41af58c5422b9371ea7b23ebb994de3131b04d851099abcd91b548356f227422b67800a5fdb599ba9d863a733d5a3662618
7
- data.tar.gz: 4b9275fe85f02ea8438367de51f950dbef8c9ab794d9a541844e4ec7875093e7c89ff0e173fe01dbc087a28ac416c5a1795941dacc22044ef4308544e9587268
6
+ metadata.gz: 2b6e7699071cd70dff2f482105dd93dd3168a962a59b7b477ad4a359f191c0021612ae993d00a024dcf7f38dcd6875a39ef4670131a3c8948038d81d38dbc56c
7
+ data.tar.gz: 20fa09db784a2894e3bc9119f9917a4431031e68fc365b3e77dff1e650b599bfcac8fc5b4914f2e3e87add02ffeec4319c815855fe9e0f77aa1da10288513e87
@@ -251,22 +251,20 @@ module Pindo
251
251
  build_task.dependencies << tasks.last.id if tasks.any?
252
252
  tasks << build_task
253
253
 
254
- # 3. 上传任务(如果需要)
255
- if @args_upload_flag
256
- upload_task = Pindo::TaskSystem::JPSUploadTask.new(
257
- 'ipa',
258
- File.join(ios_project_path, 'build'),
259
- nil,
260
- app_info_obj: config[:app_info_obj],
261
- workflow_info: config[:workflow_info],
262
- project_name: @args_proj_name,
263
- context: {
264
- send_to_chat: @args_send_flag
265
- },
266
- dependencies: [build_task.id]
267
- )
268
- tasks << upload_task
269
- end
254
+ # 3. 上传任务(总是添加)
255
+ upload_task = Pindo::TaskSystem::JPSUploadTask.new(
256
+ 'ipa',
257
+ File.join(ios_project_path, 'build'),
258
+ nil,
259
+ app_info_obj: config[:app_info_obj],
260
+ workflow_info: config[:workflow_info],
261
+ project_name: @args_proj_name,
262
+ context: {
263
+ send_to_chat: @args_send_flag
264
+ },
265
+ dependencies: [build_task.id]
266
+ )
267
+ tasks << upload_task
270
268
 
271
269
  tasks
272
270
  else
@@ -5,39 +5,40 @@ require 'fileutils'
5
5
  require 'json'
6
6
  require 'faraday'
7
7
  require 'xcodeproj'
8
+ require 'pindo/module/xcode/applovin_xcode_helper'
8
9
 
9
10
  module Pindo
10
11
  class Command
11
12
  class Ios < Command
12
13
  class Applovin < Ios
13
-
14
+
14
15
  self.summary = '接入applovin max广告平台时更新Xcode中info.plist'
15
-
16
+
16
17
  self.description = <<-DESC
17
18
  接入applovin max广告平台时更新Xcode中info.plist。
18
-
19
+
19
20
  支持功能:
20
-
21
+
21
22
  * 自动获取applovin广告平台的SKAdNetwork IDs
22
-
23
+
23
24
  * 更新Xcode工程中的info.plist文件
24
-
25
+
25
26
  * 支持保存SKAdNetwork IDs到本地配置
26
-
27
+
27
28
  使用示例:
28
-
29
+
29
30
  $ pindo ios applovin # 更新当前目录下工程的info.plist
30
-
31
+
31
32
  $ pindo ios applovin --appstore # 使用AppStore模式更新
32
-
33
+
33
34
  $ pindo ios applovin --install # 运行applovin安装脚本
34
-
35
+
35
36
  $ pindo ios applovin --upload # 保存SKAdNetwork IDs到本地
36
37
  DESC
37
-
38
+
38
39
  self.arguments = [
39
40
  ]
40
-
41
+
41
42
  def self.options
42
43
  [
43
44
  ['--appstore', 'AppStore模式,一般不使用'],
@@ -45,7 +46,7 @@ module Pindo
45
46
  ['--upload', '保存SKAdNetwork IDs到本地配置'],
46
47
  ].concat(super)
47
48
  end
48
-
49
+
49
50
  def initialize(argv)
50
51
 
51
52
  @args_appstore_flag = argv.flag?('appstore', false)
@@ -55,178 +56,19 @@ module Pindo
55
56
  super(argv)
56
57
  @additional_args = argv.remainder!
57
58
  end
58
-
59
+
59
60
  def validate!
60
61
  super
61
62
  end
62
-
63
- def run
64
-
65
- skadnetwork_id_array = []
66
-
67
- Funlog.instance.fancyinfo_start("正在请求applovin数据...")
68
-
69
- applovin_res_json = req_applovin_json
70
- # puts JSON.pretty_generate(applovin_res_json)
71
-
72
- if !applovin_res_json.nil? && !applovin_res_json["skadnetwork_ids"].nil?
73
- applovin_res_json["skadnetwork_ids"].each do |network_id|
74
- skadnetwork_id_array << network_id["skadnetwork_id"]
75
- end
76
- end
77
-
78
- applovin_media_res_json = req_applovin_mediia_json
79
- # puts JSON.pretty_generate(applovin_media_res_json)
80
- if !applovin_media_res_json.nil? && !applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].nil?
81
- applovin_media_res_json["mediationSKAdnetworkIdsSpecs"].each do |media_item|
82
- skadnetwork_id_array = skadnetwork_id_array + media_item["skAdnetworkIds"]
83
- end
84
- end
85
-
86
- skadnetwork_id_array = skadnetwork_id_array.uniq || []
87
-
88
- Funlog.instance.fancyinfo_success("请求applovin数据,获取到#{skadnetwork_id_array.size}条数据...")
89
-
90
- if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 50
91
- # puts "From Applovin SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
92
- if @args_upload_flag
93
- applovin_config_file = File.join(pindo_single_config.pindo_common_configdir,"applovin_client_config.json")
94
- origin_json = {}
95
- if File.exist?(applovin_config_file)
96
- origin_json = JSON.parse(File.read(applovin_config_file))
97
- end
98
- origin_json["SKAdNetworkItems"] = skadnetwork_id_array
99
- File.write(applovin_config_file, JSON.pretty_generate(origin_json))
100
- git_addpush_repo(path:pindo_single_config.pindo_common_configdir, message:"Applovin SKAdNetworkItems", commit_file_params:["applovin_client_config.json"])
101
- end
102
- else
103
- Funlog.instance.fancyinfo_start("网络拉取applovin数据太少,从缓存中获取数据...")
104
- config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "applovin_client_config.json")
105
- config_json = JSON.parse(File.read(config_file))
106
- skadnetwork_id_array = skadnetwork_id_array + config_json["SKAdNetworkItems"]
107
- # puts "From Config SKAdNetworkItems Size: #{skadnetwork_id_array.size}"
108
- Funlog.instance.fancyinfo_success("网络拉取applovin数据太少,从缓存中获取到#{skadnetwork_id_array.size}条数据...")
109
- end
110
-
111
-
112
- Funlog.instance.fancyinfo_start("正在写入Xcode中...")
113
-
114
- skadnetwork_id_array = skadnetwork_id_array.uniq || []
115
-
116
- project_root_dir = Dir.pwd
117
- xcodeproj_file_name = Dir.glob(File.join(project_root_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
118
-
119
- plist_file_name = File.join(project_root_dir, "AppEntry/Info.plist")
120
- if !xcodeproj_file_name.nil?
121
- proj_name = File.basename(xcodeproj_file_name, ".xcodeproj")
122
- plist_file_name = get_applovin_infoplist(project_dir:project_root_dir, proj_name:proj_name)
123
- end
124
-
125
-
126
- info_plist_dict = {}
127
- if File.exist?(plist_file_name)
128
- info_plist_dict = Xcodeproj::Plist.read_from_path(plist_file_name)
129
- end
130
-
131
-
132
- info_plist_dict["NSAdvertisingAttributionReportEndpoint"] = info_plist_dict["NSAdvertisingAttributionReportEndpoint"] || "https://postbacks-app.com"
133
-
134
- if !info_plist_dict.has_key?("NSAppTransportSecurity")
135
- info_plist_dict["NSAppTransportSecurity"] = {}
136
- info_plist_dict["NSAppTransportSecurity"]["NSAllowsArbitraryLoads"] = true
137
- end
138
-
139
-
140
- if !skadnetwork_id_array.nil? && skadnetwork_id_array.size > 0
141
- info_plist_dict["SKAdNetworkItems"] = []
142
- skadnetwork_id_array.each do |network_id|
143
- item = {}
144
- item["SKAdNetworkIdentifier"] = network_id
145
- info_plist_dict["SKAdNetworkItems"] << item
146
- end
147
- end
148
-
149
- Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file_name)
150
-
151
- Funlog.instance.fancyinfo_success("Xcode中applovin数据修改完成!")
152
-
153
- if @args_install_flag && !xcodeproj_file_name.nil? && File.exist?(xcodeproj_file_name)
154
-
155
- pindo_common_dir = pindo_single_config.pindo_common_configdir
156
-
157
- app_lovin_script = File.join(pindo_common_dir, "AppLovinQualityServiceSetup-ios-dev.rb")
158
- if @args_appstore_flag
159
- app_lovin_script = File.join(pindo_common_dir, "AppLovinQualityServiceSetup-ios.rb")
160
- end
161
-
162
- project_script_file = File.join(project_root_dir, "AppLovinQualityServiceSetup-ios.rb")
163
- FileUtils.cp_r(app_lovin_script, project_script_file)
164
- command = "ruby " + project_script_file
165
- # puts command
166
- system command
167
- end
168
-
169
-
170
- end
171
-
172
-
173
- def get_applovin_infoplist(project_dir:nil, proj_name:nil)
174
-
175
- info_plist_path = File.join(project_dir, "AppEntry/Info.plist")
176
- proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
177
- if File.exist?(proj_fullname)
178
- project_obj = Xcodeproj::Project.open(proj_fullname)
179
- project_obj.targets.each do |target|
180
63
 
181
- if target.product_type.to_s.eql?("com.apple.product-type.application") then
182
- temp_info = target.build_configurations.first.build_settings['INFOPLIST_FILE']
183
- info_plist_path = File.join(project_dir, temp_info)
184
- end
185
- end
186
- end
187
-
188
- return info_plist_path
189
- end
190
-
191
-
192
- def req_applovin_json
193
-
194
- begin
195
- # https://dash.applovin.com/docs/v1/skadnetwork_ids.json
196
- applovin_url = "https://dash.applovin.com/docs/v1/skadnetwork_ids.json"
197
- con = Faraday.new
198
- res = con.get do |req|
199
- req.url applovin_url
200
- req.headers['Content-Type'] = 'application/json'
201
- end
202
-
203
- applovin_res_json = JSON.parse(res.body)
204
-
205
- return applovin_res_json
206
- rescue Exception => e
207
- return nil
208
- end
209
-
210
-
211
-
212
- end
213
-
214
- def req_applovin_mediia_json
215
-
216
-
217
- begin
218
- applovin_url = "https://dash.applovin.com/docs/v1/mediation_sk_adnetwork_ids"
219
- con = Faraday.new
220
- res = con.get do |req|
221
- req.url applovin_url
222
- req.headers['Content-Type'] = 'application/json'
223
- end
224
-
225
- applovin_res_json = JSON.parse(res.body)
226
- return applovin_res_json
227
- rescue Exception => e
228
- return nil
229
- end
64
+ def run
65
+ # 使用 ApplovinXcodeHelper 执行更新操作
66
+ Pindo::ApplovinXcodeHelper.update_applovin_config(
67
+ project_dir: Dir.pwd,
68
+ appstore_mode: @args_appstore_flag,
69
+ install_script: @args_install_flag,
70
+ upload_config: @args_upload_flag
71
+ )
230
72
  end
231
73
 
232
74
  end
@@ -15,6 +15,8 @@ require 'pindo/module/task/model/build_task'
15
15
  require 'pindo/module/task/model/jps_upload_task'
16
16
  require 'pindo/options/options'
17
17
  require 'pindo/options/helpers/bundleid_selector'
18
+ require 'pindo/config/build_info_manager'
19
+ require 'pindo/config/ios_config_parser'
18
20
 
19
21
  module Pindo
20
22
  class Command
@@ -246,6 +248,9 @@ module Pindo
246
248
  # Bundle ID 已经通过 value_block 自动获取
247
249
  bundle_id = @args_bundle_id
248
250
 
251
+ # 拉取并加载配置文件到 IosConfigParser
252
+ load_config_file(pindo_project_dir, bundle_id)
253
+
249
254
  # 获取 JPS 配置
250
255
  app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
251
256
  working_directory: pindo_project_dir,
@@ -261,6 +266,43 @@ module Pindo
261
266
  }
262
267
  end
263
268
 
269
+ # 拉取并加载配置文件
270
+ def load_config_file(project_dir, bundle_id)
271
+ if bundle_id && !bundle_id.empty?
272
+ # 如果指定了 Bundle ID,拉取配置
273
+ puts "\n拉取 Bundle ID 配置: #{bundle_id}"
274
+
275
+ build_info_manager = Pindo::BuildInfoManager.share_instance
276
+ success = build_info_manager.pull_appconfig_with_reponame(
277
+ repo_name: bundle_id,
278
+ target_dir: project_dir
279
+ )
280
+
281
+ unless success
282
+ raise Informative, "拉取配置失败: #{bundle_id}"
283
+ end
284
+
285
+ # 加载拉取的配置到 IosConfigParser
286
+ config_file = File.join(project_dir, "config.json")
287
+ if File.exist?(config_file)
288
+ puts " ✓ 加载配置文件: #{config_file}"
289
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
290
+ else
291
+ raise Informative, "配置文件不存在: #{config_file}"
292
+ end
293
+ else
294
+ # 如果没有指定 Bundle ID,使用当前目录的 config.json
295
+ config_file = File.join(project_dir, "config.json")
296
+
297
+ if File.exist?(config_file)
298
+ puts "\n使用当前目录配置文件: #{config_file}"
299
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
300
+ else
301
+ raise Informative, "当前目录未找到 config.json 文件,请使用 --bundleid 参数指定 Bundle ID"
302
+ end
303
+ end
304
+ end
305
+
264
306
  end
265
307
  end
266
308
  end
@@ -1,6 +1,7 @@
1
1
  require 'highline/import'
2
2
  require 'fileutils'
3
3
  require 'json'
4
+ require 'pindo/module/xcode/cocoapods_helper'
4
5
 
5
6
  module Pindo
6
7
  class Command
@@ -52,43 +53,11 @@ module Pindo
52
53
  end
53
54
 
54
55
  def run
55
-
56
- working_dir = @project_dir
57
-
58
- pod_array = pindo_single_config.pod_repo_dict
59
- pod_index_url = nil
60
- if !pod_array.nil?
61
- pod_index_url = pod_array['podindex']
62
- else
63
- raise Informative, '私有Pod索引地址未知!!'
64
- end
65
- sources = Pod::Config.instance.sources_manager.all
66
- repos_path = File.expand_path("~/.cocoapods/repos")
67
-
68
- private_source = sources.select { |s| s.git? && s.url.to_s.eql?(pod_index_url)}.first
69
- if !private_source.nil?
70
-
71
- puts "私有Pod地址:#{pod_index_url}"
72
- puts "私有Pod目录:~/.cocoapods"
73
- getcode_to_dir(reponame:File.basename(private_source.repo), remote_url: pod_index_url, path:repos_path)
74
- else
75
- puts "私有Pod地址:#{pod_index_url}"
76
- puts "私有Pod目录:~/.cocoapods"
77
- repository_name = pod_index_url.split("/").last.chomp(".git")
78
- getcode_to_dir(reponame:repository_name, remote_url: pod_index_url, path:repos_path)
79
- end
80
-
81
-
82
- if @args_install_flag
83
- begin
84
- if File.exist?("#{working_dir}/Podfile")
85
- Pod::Command::Install::run(['--clean-install'])
86
- end
87
- rescue => e
88
- puts e.message
89
- end
90
- end
91
-
56
+ # 使用 CocoaPodsHelper 执行更新操作
57
+ Pindo::CocoaPodsHelper.update_pod_repo(
58
+ install: @args_install_flag,
59
+ project_dir: @project_dir
60
+ )
92
61
  end
93
62
 
94
63
 
@@ -12,6 +12,8 @@ require 'pindo/module/task/model/build_task'
12
12
  require 'pindo/module/task/model/unity_export_task'
13
13
  require 'pindo/module/task/model/jps_upload_task'
14
14
  require 'pindo/module/task/model/git_tag_task'
15
+ require 'pindo/config/build_info_manager'
16
+ require 'pindo/config/ios_config_parser'
15
17
 
16
18
  module Pindo
17
19
  class Command
@@ -393,6 +395,9 @@ module Pindo
393
395
  end
394
396
  puts " Bundle ID: #{platform_config["bundle_id"]}"
395
397
 
398
+ # 拉取并加载 iOS 配置文件
399
+ prepare_ios_config(platform_config["bundle_id"])
400
+
396
401
  when 'android'
397
402
  # 获取 Android Package Name
398
403
  if @args_bundle_name
@@ -420,6 +425,46 @@ module Pindo
420
425
 
421
426
  private
422
427
 
428
+ # 准备 iOS 配置文件
429
+ # 参考 appstore autobuild 的 prepare_config 方法
430
+ def prepare_ios_config(bundle_id)
431
+ pindo_project_dir = Dir.pwd
432
+
433
+ if bundle_id && !bundle_id.empty?
434
+ # 拉取配置到 Unity 根目录
435
+ puts "\n拉取 iOS Bundle ID 配置: #{bundle_id}"
436
+
437
+ build_info_manager = Pindo::BuildInfoManager.share_instance
438
+ success = build_info_manager.pull_appconfig_with_reponame(
439
+ repo_name: bundle_id,
440
+ target_dir: pindo_project_dir
441
+ )
442
+
443
+ unless success
444
+ raise Informative, "拉取 iOS 配置失败: #{bundle_id}"
445
+ end
446
+
447
+ # 加载拉取的配置到 IosConfigParser
448
+ config_file = File.join(pindo_project_dir, "config.json")
449
+ if File.exist?(config_file)
450
+ puts " ✓ 加载配置文件: #{config_file}"
451
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
452
+ else
453
+ raise Informative, "配置文件不存在: #{config_file}"
454
+ end
455
+ else
456
+ # 如果没有指定 Bundle ID,使用当前目录的 config.json
457
+ config_file = File.join(pindo_project_dir, "config.json")
458
+
459
+ if File.exist?(config_file)
460
+ puts "\n使用当前目录配置文件: #{config_file}"
461
+ Pindo::IosConfigParser.instance.load_config(config_file: config_file)
462
+ else
463
+ raise Informative, "当前目录未找到 config.json 文件,请使用 --bundleid 参数指定 Bundle ID"
464
+ end
465
+ end
466
+ end
467
+
423
468
  # 获取 WebGL 包序号
424
469
  def fetch_webgl_index_no(app_info_obj:, workflow_info:)
425
470
  index_count = -1
@@ -28,7 +28,7 @@ module Pindo
28
28
  # @param build_type [String, Symbol] 构建类型 ('dev', 'adhoc', 'release' 或 'development', 'adhoc', 'appstore')
29
29
  # @param platform_type [String] 平台类型 ('ios', 'macos')
30
30
  # @param project_dir [String] 项目目录
31
- # @param config_file [String, nil] 配置文件路径(可选,默认从 project_dir 加载)
31
+ # @param config_file [String, nil] 配置文件路径(可选,仅当单例未加载时使用)
32
32
  # @param skip_xcode_config [Boolean] 是否跳过 Xcode 配置
33
33
  # @return [Hash] 返回证书信息 { provisioning_info_array:, team_id: }
34
34
  def install_and_config_certs(
@@ -41,11 +41,14 @@ module Pindo
41
41
  # 标准化构建类型
42
42
  cert_type = normalize_build_type(build_type)
43
43
 
44
- # 配置加载
44
+ # 使用 IosConfigParser 单例(应该已经在命令层加载)
45
45
  require 'pindo/config/ios_config_parser'
46
46
  config_parser = Pindo::IosConfigParser.instance
47
- config_path = config_file || File.join(project_dir, 'config.json')
48
- config_parser.load_config(config_file: config_path)
47
+
48
+ # 检查配置是否已加载
49
+ if config_parser.config_json.nil?
50
+ raise Informative, "install_and_config_certs 函数中, 配置未加载config.json"
51
+ end
49
52
 
50
53
  apple_id = config_parser.apple_id
51
54
  bundle_id_map = config_parser.get_bundle_id_map
@@ -313,12 +313,20 @@ module Pindo
313
313
 
314
314
  proj_name_array_append = []
315
315
 
316
- if File.exist?(File.join(working_directory, "config.json"))
317
- config_json = JSON.parse(File.read(File.join(working_directory, "config.json")))
318
- new_proj_string = config_json["project_info"]["project_name"]
319
- if !new_proj_string.nil? && !new_proj_string.empty?
320
- proj_name_array_append << config_json["project_info"]["project_name"]
316
+ # 尝试从 IosConfigParser 单例获取项目名称
317
+ begin
318
+ require 'pindo/config/ios_config_parser'
319
+ config_parser = Pindo::IosConfigParser.instance
320
+
321
+ # 如果单例中有配置,使用配置中的项目名称
322
+ if !config_parser.config_json.nil?
323
+ new_proj_string = config_parser.config_json.dig("project_info", "project_name")
324
+ if !new_proj_string.nil? && !new_proj_string.empty?
325
+ proj_name_array_append << new_proj_string
326
+ end
321
327
  end
328
+ rescue => e
329
+ # 忽略错误,继续使用其他方式获取项目名称
322
330
  end
323
331
 
324
332
  xcodeproj_file_name = Dir.glob(File.join(Dir.pwd, "/*.xcodeproj")).max_by {|f| File.mtime(f)}