pindo 5.9.0 → 5.10.1

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: e26747a73dfa47b5379d698b521f08edfe4daa0fb72d1b298eeacb45db40d0c5
4
- data.tar.gz: 6c1cdd4dd46bdca0107da545916c1f8caf7300eba9883010e383d7897d5472ed
3
+ metadata.gz: cdc8a89f4c819c3b2fb36d8f6ef7a09ab3ff847a9d326afb7fbfaad146f81c4b
4
+ data.tar.gz: 79f7efef8bfa4a2dda00e02f545f52496c770a50f6e99174080f89fb056724e0
5
5
  SHA512:
6
- metadata.gz: 2bfa1a08f4bfca1704f240d4ee4517e1a45684dc38c84b91262f87203cf0768445834b75f2c951950782a93a66beb7e616e5c38329f8c38795d92e4b4c93e1d4
7
- data.tar.gz: 395233f028b3df2350a442ab8ddebbe8514ced5f56f7d14229a6dd09b044dbffc4900848a43fe9b0e3ce8a66f63248e9e9635fe0b8cde32275e799070b644e62
6
+ metadata.gz: 6b571d2e04fe5c1819d0f514c26fb8b0cb0d42f3a08b0543cde030a26cd47e67bd526e3737812d96b31128aeaa61da788982933af09c6f7a52b29411bad7e5dc
7
+ data.tar.gz: 527c09daf610e695b3794c58f723d881a8ef6b7d4d1353a498c6d35d0fe49ab2ca5005174b385b8b015b23e738ceba0d843507e714df1d52ff0fb2aff6ee461e
@@ -172,7 +172,12 @@ module Pindo
172
172
 
173
173
  if !ipa_file_upload.nil? && !app_info_obj.nil? && @args_upload_flag
174
174
  description = nil
175
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
175
+ result_data = PgyerHelper.share_instace.start_upload(
176
+ app_info_obj: app_info_obj,
177
+ ipa_file_upload: ipa_file_upload,
178
+ description: description,
179
+ workflow_info: workflow_info
180
+ )
176
181
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
177
182
  PgyerHelper.share_instace.print_app_version_info(
178
183
  app_info_obj: app_info_obj,
@@ -124,7 +124,12 @@ module Pindo
124
124
  if !ipa_file_upload.nil? && !app_info_obj.nil?
125
125
 
126
126
  description = nil
127
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
127
+ result_data = PgyerHelper.share_instace.start_upload(
128
+ app_info_obj: app_info_obj,
129
+ ipa_file_upload: ipa_file_upload,
130
+ description: description,
131
+ workflow_info: workflow_info
132
+ )
128
133
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
129
134
  PgyerHelper.share_instace.print_app_version_info(
130
135
  app_info_obj: app_info_obj,
@@ -112,7 +112,12 @@ module Pindo
112
112
 
113
113
  if !ipa_file_upload.nil? && !app_info_obj.nil?
114
114
  description = nil
115
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
115
+ result_data = PgyerHelper.share_instace.start_upload(
116
+ app_info_obj: app_info_obj,
117
+ ipa_file_upload: ipa_file_upload,
118
+ description: description,
119
+ workflow_info: workflow_info
120
+ )
116
121
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
117
122
  PgyerHelper.share_instace.print_app_version_info(
118
123
  app_info_obj: app_info_obj,
@@ -58,9 +58,15 @@ module Pindo
58
58
  def run
59
59
 
60
60
  app_info_obj = nil
61
+ workflow_info = nil
61
62
  if @args_upload_flag
62
63
  proj_name = @args_proj_name
63
- app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
64
+ # 传入 package_type 获取 workflow_info
65
+ app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
66
+ working_directory: Dir.pwd,
67
+ proj_name: proj_name,
68
+ package_type: 'ipa'
69
+ )
64
70
  end
65
71
 
66
72
  new_project_dir = Dir.pwd
@@ -80,9 +86,14 @@ module Pindo
80
86
  ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
81
87
 
82
88
  if !ipa_file_upload.nil? && !app_info_obj.nil?
83
-
89
+
84
90
  description = nil
85
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
91
+ result_data = PgyerHelper.share_instace.start_upload(
92
+ app_info_obj: app_info_obj,
93
+ ipa_file_upload: ipa_file_upload,
94
+ description: description,
95
+ workflow_info: workflow_info
96
+ )
86
97
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
87
98
  PgyerHelper.share_instace.print_app_version_info(
88
99
  app_info_obj: app_info_obj,
@@ -177,6 +177,15 @@ module Pindo
177
177
 
178
178
  Pindo::Command::Deploy::Cert::run(args_temp)
179
179
 
180
+ # 根据证书配置后的实际 Bundle ID 重新更新 URL Schemes
181
+ # 因为 Cert::run 可能会修改 PRODUCT_BUNDLE_IDENTIFIER
182
+ if @args_upload_flag && workflow_info && workflow_info[:package_name]
183
+ Pindo::XcodeBuildConfig.update_url_schemes_with_bundleid(
184
+ project_dir: project_dir,
185
+ package_name: workflow_info[:package_name]
186
+ )
187
+ end
188
+
180
189
  Dir.chdir(project_dir)
181
190
  Pindo::Command::Deploy::Build::run(args_temp)
182
191
 
@@ -185,7 +194,7 @@ module Pindo
185
194
  build_path = File.join(pindo_new_project_dir, "build", "*.{ipa,app}")
186
195
  ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
187
196
 
188
- if !ipa_file_upload.nil? && !app_info_obj.nil?
197
+ if !ipa_file_upload.nil? && !app_info_obj.nil?
189
198
  description = nil
190
199
  if File.exist?(File.join(pindo_new_project_dir, ".release_info"))
191
200
  description = File.read(File.join(pindo_new_project_dir, ".release_info"))
@@ -194,7 +203,12 @@ module Pindo
194
203
  description = git!(%W(-C #{pindo_new_project_dir} show -s --format=%h::%s)).strip
195
204
  end
196
205
  end
197
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
206
+ result_data = PgyerHelper.share_instace.start_upload(
207
+ app_info_obj: app_info_obj,
208
+ ipa_file_upload: ipa_file_upload,
209
+ description: description,
210
+ workflow_info: workflow_info
211
+ )
198
212
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
199
213
  PgyerHelper.share_instace.print_app_version_info(
200
214
  app_info_obj: app_info_obj,
@@ -268,6 +268,13 @@ module Pindo
268
268
 
269
269
  Pindo::Command::Deploy::Cert::run(args_temp)
270
270
 
271
+ # 根据证书配置后的实际 Bundle ID 重新更新 URL Schemes
272
+ # 因为 Cert::run 可能会修改 PRODUCT_BUNDLE_IDENTIFIER
273
+ Pindo::XcodeBuildConfig.update_url_schemes_with_bundleid(
274
+ project_dir: pindo_project_dir,
275
+ package_name: package_name
276
+ )
277
+
271
278
  Dir.chdir(pindo_project_dir)
272
279
  Pindo::Command::Deploy::Build::run(args_temp)
273
280
 
@@ -276,7 +283,12 @@ module Pindo
276
283
 
277
284
  if !ipa_file_upload.nil? && !app_info_obj.nil? && @args_upload_flag
278
285
  description = nil
279
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
286
+ result_data = PgyerHelper.share_instace.start_upload(
287
+ app_info_obj: app_info_obj,
288
+ ipa_file_upload: ipa_file_upload,
289
+ description: description,
290
+ workflow_info: workflow_info
291
+ )
280
292
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
281
293
  PgyerHelper.share_instace.print_app_version_info(
282
294
  app_info_obj: app_info_obj,
@@ -115,9 +115,15 @@ module Pindo
115
115
  Pindo::Command::Deploy::Pullconfig::run(args_temp)
116
116
 
117
117
  app_info_obj = nil
118
- if @args_upload_flag
118
+ workflow_info = nil
119
+ if @args_upload_flag
119
120
  proj_name = @args_proj_name
120
- app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
121
+ # 传入 package_type 获取 workflow_info
122
+ app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
123
+ working_directory: Dir.pwd,
124
+ proj_name: proj_name,
125
+ package_type: 'ipa'
126
+ )
121
127
  end
122
128
 
123
129
  args_temp = []
@@ -138,8 +144,13 @@ module Pindo
138
144
  ipa_dir = File.dirname(ipa_file_name)
139
145
  ipa_file_upload = File.join(ipa_dir, ipa_base_name + "_resigned.ipa")
140
146
 
141
- if !ipa_file_upload.nil? && !app_info_obj.nil?
142
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:nil)
147
+ if !ipa_file_upload.nil? && !app_info_obj.nil?
148
+ result_data = PgyerHelper.share_instace.start_upload(
149
+ app_info_obj: app_info_obj,
150
+ ipa_file_upload: ipa_file_upload,
151
+ description: nil,
152
+ workflow_info: workflow_info
153
+ )
143
154
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
144
155
  PgyerHelper.share_instace.print_app_version_info(
145
156
  app_info_obj: app_info_obj,
@@ -135,6 +135,12 @@ module Pindo
135
135
  package_name: package_name,
136
136
  project_id: project_id
137
137
  )
138
+
139
+ # 根据实际的 Bundle ID 更新 URL Schemes
140
+ Pindo::XcodeBuildConfig.update_url_schemes_with_bundleid(
141
+ project_dir: pindo_project_dir,
142
+ package_name: package_name
143
+ )
138
144
  else
139
145
  raise Informative, "未获取到工作流信息"
140
146
  end
@@ -149,10 +155,15 @@ module Pindo
149
155
  build_path = File.join(pindo_project_dir, "build", "*.{ipa,app}")
150
156
  ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
151
157
 
152
- if !ipa_file_upload.nil? && !app_info_obj.nil?
158
+ if !ipa_file_upload.nil? && !app_info_obj.nil?
153
159
 
154
160
  description = nil
155
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
161
+ result_data = PgyerHelper.share_instace.start_upload(
162
+ app_info_obj: app_info_obj,
163
+ ipa_file_upload: ipa_file_upload,
164
+ description: description,
165
+ workflow_info: workflow_info
166
+ )
156
167
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
157
168
  PgyerHelper.share_instace.print_app_version_info(
158
169
  app_info_obj: app_info_obj,
@@ -1,8 +1,6 @@
1
1
 
2
2
  require 'pindo/command/ios/debug'
3
- require 'pindo/command/ios/build'
4
3
  require 'pindo/command/ios/autobuild'
5
- require 'pindo/command/ios/adhoc'
6
4
  require 'pindo/command/ios/autoresign'
7
5
  require 'pindo/command/ios/applovin'
8
6
 
@@ -110,8 +110,14 @@ module Pindo
110
110
  Pindo::Command::Deploy::Pullconfig::run(args_temp)
111
111
 
112
112
  app_info_obj = nil
113
+ workflow_info = nil
113
114
  if @args_upload_flag || @args_send_flag
114
- app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:@args_proj_name)
115
+ # 传入 package_type 获取 workflow_info
116
+ app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
117
+ working_directory: Dir.pwd,
118
+ proj_name: @args_proj_name,
119
+ package_type: 'ipa'
120
+ )
115
121
  end
116
122
 
117
123
 
@@ -133,9 +139,14 @@ module Pindo
133
139
  ipa_dir = File.dirname(ipa_file_name)
134
140
  ipa_file_upload = File.join(ipa_dir, ipa_base_name + "_resigned.ipa")
135
141
 
136
- if !ipa_file_upload.nil? && !app_info_obj.nil?
142
+ if !ipa_file_upload.nil? && !app_info_obj.nil?
137
143
  description = "提交包重签名"
138
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
144
+ result_data = PgyerHelper.share_instace.start_upload(
145
+ app_info_obj: app_info_obj,
146
+ ipa_file_upload: ipa_file_upload,
147
+ description: description,
148
+ workflow_info: workflow_info
149
+ )
139
150
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
140
151
  PgyerHelper.share_instace.print_app_version_info(
141
152
  app_info_obj: app_info_obj,
@@ -99,9 +99,15 @@ module Pindo
99
99
  end
100
100
 
101
101
  app_info_obj = nil
102
+ workflow_info = nil
102
103
  if @args_upload_flag || @args_send_flag
103
104
  proj_name = @args_proj_name
104
- app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
105
+ # 传入 package_type 获取 workflow_info
106
+ app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
107
+ working_directory: Dir.pwd,
108
+ proj_name: proj_name,
109
+ package_type: 'ipa'
110
+ )
105
111
  end
106
112
 
107
113
 
@@ -112,8 +118,13 @@ module Pindo
112
118
  build_path = File.join(pindo_new_project_dir, "build", "*.ipa")
113
119
  ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
114
120
 
115
- if !ipa_file_upload.nil? && !app_info_obj.nil?
116
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:nil)
121
+ if !ipa_file_upload.nil? && !app_info_obj.nil?
122
+ result_data = PgyerHelper.share_instace.start_upload(
123
+ app_info_obj: app_info_obj,
124
+ ipa_file_upload: ipa_file_upload,
125
+ description: nil,
126
+ workflow_info: workflow_info
127
+ )
117
128
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
118
129
  PgyerHelper.share_instace.print_app_version_info(
119
130
  app_info_obj: app_info_obj,
@@ -192,14 +192,39 @@ module Pindo
192
192
  raise Informative, "#{@args_ipa_file} 文件不存在"
193
193
  end
194
194
 
195
+ # 根据文件后缀确定 package_type
196
+ package_type = nil
197
+ ext = File.extname(@args_ipa_file).downcase
198
+ case ext
199
+ when '.ipa'
200
+ package_type = 'ipa'
201
+ when '.apk'
202
+ package_type = 'apk'
203
+ when '.html'
204
+ package_type = 'zip'
205
+ when '.app'
206
+ package_type = 'mac'
207
+ else
208
+ raise Informative, "不支持的文件类型: #{ext},支持的类型:.ipa, .apk, .html, .app"
209
+ end
210
+
195
211
  PgyerHelper.share_instace.setForeLogin(beforeLogin:@args_login_flag)
196
- app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:@args_proj_name)
212
+ app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
213
+ working_directory: Dir.pwd,
214
+ proj_name: @args_proj_name,
215
+ package_type: package_type
216
+ )
197
217
 
198
218
  if app_info_obj.nil?
199
219
  raise Informative, "#{@args_proj_name} 错误, 请输入正确的App代号名称, jps网站没有该App"
200
220
  end
201
221
 
202
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:@args_ipa_file, description:@args_upload_desc)
222
+ result_data = PgyerHelper.share_instace.start_upload(
223
+ app_info_obj: app_info_obj,
224
+ ipa_file_upload: @args_ipa_file,
225
+ description: @args_upload_desc,
226
+ workflow_info: workflow_info
227
+ )
203
228
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
204
229
  PgyerHelper.share_instace.print_app_version_info(
205
230
  app_info_obj: app_info_obj,
@@ -188,7 +188,7 @@ module Pindo
188
188
  # 4. 提交到 JPS 项目
189
189
  puts "📋 提交到 JPS 项目..."
190
190
 
191
- result = jps_client.upload_project_package(
191
+ result = jps_client.upload_nuget_package(
192
192
  projectId: nuget_project['id'],
193
193
  params: {
194
194
  packageUrl: file_url,
@@ -192,7 +192,12 @@ module Pindo
192
192
 
193
193
  if !html_file_upload.nil? && !app_info_obj.nil? && @args_upload_flag
194
194
  description = nil
195
- result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:html_file_upload, description:description)
195
+ result_data = PgyerHelper.share_instace.start_upload(
196
+ app_info_obj: app_info_obj,
197
+ ipa_file_upload: html_file_upload,
198
+ description: description,
199
+ workflow_info: workflow_info
200
+ )
196
201
  if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
197
202
  PgyerHelper.share_instace.print_app_version_info(
198
203
  app_info_obj: app_info_obj,
@@ -430,22 +430,11 @@ module Pindo
430
430
  app_info_obj
431
431
  end
432
432
 
433
- def start_upload(app_info_obj:nil, ipa_file_upload:nil, description:nil)
434
-
435
- # 根据文件扩展名判断包类型
436
- package_type = nil
437
- if ipa_file_upload
438
- ext = File.extname(ipa_file_upload).downcase
439
- case ext
440
- when '.ipa'
441
- package_type = 'ipa'
442
- when '.apk'
443
- package_type = 'apk'
444
- when '.aab'
445
- package_type = 'apk' # AAB也归类为apk类型
446
- when '.zip', '.html', '.app'
447
- package_type = 'zip'
448
- end
433
+ def start_upload(app_info_obj:nil, ipa_file_upload:nil, description:nil, workflow_info:nil)
434
+
435
+ # 验证 workflow_info 必传
436
+ if workflow_info.nil? || workflow_info[:workflow_id].nil?
437
+ raise Informative, "workflow_info 和 workflow_id 是必传参数,请确保调用 prepare_upload 时传入了 package_type"
449
438
  end
450
439
 
451
440
  if !ipa_file_upload.nil? &&
@@ -568,16 +557,18 @@ module Pindo
568
557
 
569
558
  puts attachFileUrls
570
559
 
571
- result_data = @pgyer_client.upload_project_package(projectId:app_info_obj["id"], params:{
560
+ # 准备上传参数(workflowId 必传)
561
+ upload_params = {
572
562
  description: description,
573
563
  packageUrl: upload_res,
574
- attachFileUrls:attachFileUrls
575
- })
576
-
577
- # 将package_type信息附加到返回结果中
578
- if result_data && result_data["data"]
579
- result_data["package_type"] = package_type
580
- end
564
+ attachFileUrls: attachFileUrls,
565
+ workflowId: workflow_info[:workflow_id] # workflowId 必传
566
+ }
567
+
568
+ result_data = @pgyer_client.upload_project_package(
569
+ projectId: app_info_obj["id"],
570
+ params: upload_params
571
+ )
581
572
 
582
573
  return result_data
583
574
  else
@@ -8,8 +8,10 @@ module Pindo
8
8
 
9
9
  class XcodeBuildConfig
10
10
 
11
- # 使用package_name一次性更新Display Name、Bundle ID和URL Schemes
11
+ # 使用package_name一次性更新Display Name、Bundle ID和URL Schemes(基于package_name)
12
12
  # 优化版本:只读写一次plist文件,提高性能
13
+ # 注意:此函数只添加基于package_name的URL Scheme,基于实际Bundle ID的URL Scheme
14
+ # 将在update_url_schemes_with_bundleid函数中统一添加(在证书配置之后)
13
15
  # @param project_dir [String] iOS项目目录路径
14
16
  # @param package_name [String] 工作流的package_name(如:"Test Demo")
15
17
  # @param project_id [String] JPS项目ID(可选,用于添加快捷操作)
@@ -23,7 +25,6 @@ module Pindo
23
25
  bundle_id_suffix = package_name.gsub(/[^a-zA-Z0-9]/, '').downcase
24
26
  final_bundle_id = "com.heroneverdie101.#{bundle_id_suffix}"
25
27
  package_scheme = package_name.gsub(/[^a-zA-Z0-9]/, '').downcase
26
- bundle_scheme = final_bundle_id.gsub(/[^a-zA-Z0-9]/, '').downcase
27
28
 
28
29
  project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
29
30
  return false if project_fullname.nil?
@@ -58,15 +59,11 @@ module Pindo
58
59
  info_plist_dict["CFBundleURLTypes"] ||= []
59
60
 
60
61
  # 添加基于 package_name 的 URL Scheme
62
+ # 注意:基于 Bundle ID 的 URL Scheme 将在 update_url_schemes_with_bundleid 函数中统一添加
61
63
  if add_single_scheme(info_plist_dict, package_scheme)
62
64
  puts " ✓ 已添加URL Scheme: #{package_scheme} (基于 Package Name)"
63
65
  end
64
66
 
65
- # 添加基于 Bundle ID 的 URL Scheme
66
- if add_single_scheme(info_plist_dict, bundle_scheme)
67
- puts " ✓ 已添加URL Scheme: #{bundle_scheme} (基于 Bundle ID)"
68
- end
69
-
70
67
  # 4. 添加 JPS 快捷操作(UIApplicationShortcutItems)
71
68
  if project_id && !project_id.to_s.empty?
72
69
  # 创建或获取 UIApplicationShortcutItems 数组
@@ -74,22 +71,33 @@ module Pindo
74
71
 
75
72
  # 构建快捷操作类型
76
73
  shortcut_type = "jps_project?#{project_id}"
74
+ jps_title = "访问 JPS 详情"
77
75
 
78
- # 检查是否已存在相同的快捷操作
76
+ # 先查找是否存在标题为"访问 JPS 详情"的快捷操作(无论其 type 是什么)
79
77
  existing_shortcut = info_plist_dict["UIApplicationShortcutItems"].find do |item|
80
- item["UIApplicationShortcutItemType"] == shortcut_type
78
+ item["UIApplicationShortcutItemTitle"] == jps_title
81
79
  end
82
80
 
83
- unless existing_shortcut
81
+ if existing_shortcut
82
+ # 如果存在,检查 type 是否一致
83
+ if existing_shortcut["UIApplicationShortcutItemType"] == shortcut_type
84
+ puts " ✓ JPS 快捷操作已存在: #{shortcut_type}"
85
+ else
86
+ # type 不一致,更新为新的 type
87
+ old_type = existing_shortcut["UIApplicationShortcutItemType"]
88
+ existing_shortcut["UIApplicationShortcutItemType"] = shortcut_type
89
+ existing_shortcut["UIApplicationShortcutItemIconType"] = "UIApplicationShortcutIconTypeBookmark"
90
+ puts " ✓ 已更新 JPS 快捷操作: #{old_type} -> #{shortcut_type}"
91
+ end
92
+ else
93
+ # 不存在,添加新的快捷操作
84
94
  jps_shortcut = {
85
95
  "UIApplicationShortcutItemType" => shortcut_type,
86
- "UIApplicationShortcutItemTitle" => "访问 JPS 详情",
96
+ "UIApplicationShortcutItemTitle" => jps_title,
87
97
  "UIApplicationShortcutItemIconType" => "UIApplicationShortcutIconTypeBookmark"
88
98
  }
89
99
  info_plist_dict["UIApplicationShortcutItems"] << jps_shortcut
90
100
  puts " ✓ 已添加 JPS 快捷操作: #{shortcut_type}"
91
- else
92
- puts " ✓ JPS 快捷操作已存在: #{shortcut_type}"
93
101
  end
94
102
  end
95
103
 
@@ -109,6 +117,76 @@ module Pindo
109
117
  return true
110
118
  end
111
119
 
120
+ # 根据当前项目中的实际 Bundle ID 重新更新 URL Schemes
121
+ # 此函数用于在证书配置后更新 URL Schemes,确保与最终的 Bundle ID 匹配
122
+ # @param project_dir [String] iOS项目目录路径
123
+ # @param package_name [String] 工作流的package_name(如:"Test Demo")
124
+ # @return [Boolean] 是否成功更新
125
+ def self.update_url_schemes_with_bundleid(project_dir: nil, package_name: nil)
126
+ raise ArgumentError, "项目目录不能为空" if project_dir.nil?
127
+
128
+ project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
129
+ return false if project_fullname.nil?
130
+
131
+ info_plist_path = nil
132
+ current_bundle_id = nil
133
+
134
+ project_obj = Xcodeproj::Project.open(project_fullname)
135
+ project_obj.targets.each do |target|
136
+ if target.product_type.to_s.eql?("com.apple.product-type.application")
137
+ temp_info_file = target.build_configurations.first.build_settings['INFOPLIST_FILE']
138
+ if temp_info_file && !temp_info_file.empty?
139
+ info_plist_path = File.join(project_dir, temp_info_file)
140
+ end
141
+ # 获取当前实际的 Bundle ID
142
+ current_bundle_id = target.build_configurations.first.build_settings['PRODUCT_BUNDLE_IDENTIFIER']
143
+ break # 找到第一个application target即可
144
+ end
145
+ end
146
+
147
+ return false unless info_plist_path && File.exist?(info_plist_path)
148
+ return false unless current_bundle_id && !current_bundle_id.empty?
149
+
150
+ puts "\n根据更新后的 Bundle ID 重新配置 URL Schemes:"
151
+ puts " 当前 Bundle ID: #{current_bundle_id}"
152
+
153
+ # 读取 plist
154
+ info_plist_dict = Xcodeproj::Plist.read_from_path(info_plist_path)
155
+ info_plist_dict["CFBundleURLTypes"] ||= []
156
+
157
+ # 生成 schemes
158
+ package_scheme = package_name ? package_name.gsub(/[^a-zA-Z0-9]/, '').downcase : nil
159
+ bundle_scheme = current_bundle_id.gsub(/[^a-zA-Z0-9]/, '').downcase
160
+
161
+ schemes_updated = []
162
+
163
+ # 添加基于 package_name 的 URL Scheme(如果提供了 package_name)
164
+ if package_scheme && !package_scheme.empty?
165
+ if add_single_scheme(info_plist_dict, package_scheme)
166
+ schemes_updated << package_scheme
167
+ puts " ✓ 已更新 URL Scheme: #{package_scheme} (基于 Package Name)"
168
+ else
169
+ puts " ✓ URL Scheme 已存在: #{package_scheme} (基于 Package Name)"
170
+ end
171
+ end
172
+
173
+ # 添加基于实际 Bundle ID 的 URL Scheme
174
+ if add_single_scheme(info_plist_dict, bundle_scheme)
175
+ schemes_updated << bundle_scheme
176
+ puts " ✓ 已更新 URL Scheme: #{bundle_scheme} (基于更新后的 Bundle ID)"
177
+ else
178
+ puts " ✓ URL Scheme 已存在: #{bundle_scheme} (基于更新后的 Bundle ID)"
179
+ end
180
+
181
+ # 写入 plist
182
+ if schemes_updated.any?
183
+ Xcodeproj::Plist.write_to_path(info_plist_dict, info_plist_path)
184
+ puts " ✓ URL Schemes 更新完成"
185
+ end
186
+
187
+ return true
188
+ end
189
+
112
190
  # 添加URL Schemes到iOS工程的Info.plist
113
191
  # @param project_dir [String] iOS项目目录路径
114
192
  # @param scheme_name [String] 要添加的scheme名称(可选)
data/lib/pindo/version.rb CHANGED
@@ -6,7 +6,7 @@ require 'time'
6
6
 
7
7
  module Pindo
8
8
 
9
- VERSION = "5.9.0"
9
+ VERSION = "5.10.1"
10
10
 
11
11
  class VersionCheck
12
12
  RUBYGEMS_API = 'https://rubygems.org/api/v1/gems/pindo.json'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pindo
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.9.0
4
+ version: 5.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade
@@ -115,20 +115,20 @@ dependencies:
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '1.4'
118
+ version: '1.5'
119
119
  - - ">="
120
120
  - !ruby/object:Gem::Version
121
- version: 1.4.0
121
+ version: 1.5.0
122
122
  type: :runtime
123
123
  prerelease: false
124
124
  version_requirements: !ruby/object:Gem::Requirement
125
125
  requirements:
126
126
  - - "~>"
127
127
  - !ruby/object:Gem::Version
128
- version: '1.4'
128
+ version: '1.5'
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: 1.4.0
131
+ version: 1.5.0
132
132
  - !ruby/object:Gem::Dependency
133
133
  name: rqrcode
134
134
  requirement: !ruby/object:Gem::Requirement