pindo 5.7.1 → 5.8.0

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: c4b964e18c3af71f1705355cf695575e282d71366ee055223d17c1c6cb23c5ca
4
- data.tar.gz: 833b6f3986ecba29006bb12e8b2f8fd831c904d877f0eb774699b89b0bf9a7b0
3
+ metadata.gz: 981c02bf9dc73206866a586598642619054b8a82929a8ed54607ab2edf15604e
4
+ data.tar.gz: fedcbff7e32b5db93492161228b293ec5d7f3558767fb5fb474c788959e527a3
5
5
  SHA512:
6
- metadata.gz: 8a73e0cb705390f6e967e397c20531282e1115ba23950092d43912b1ce27becaa323fb4fcb789fd076021964f044a5e822a7a6520a1c0805f2c764a70e96cd26
7
- data.tar.gz: d7f02cf4fe210cecdd19a7e36221ff0747047d572103a8e21d6cc230135878229b3151de0f16c1af8988f5ed3eb6e025c0d3e7f24df9582b28dbc8c383ebd962
6
+ metadata.gz: 991ecbda504689b9f31c01a8a8a65991ca6193126c14525afc2fee081f039c39f5814076ea4047946e4846421d10964f0d4f3899774196e13f27f2a33fef5f57
7
+ data.tar.gz: 578a35ce8f1840e366d3f2b7c4646c5d6c92a6729993acff3b6770f4603e5c22351e67640e4ae2fe17cea3f7dc291b3ec80bc72db99cb48919a1f478cd0dd724
@@ -49,6 +49,20 @@ module Pindo
49
49
  @spinner_log =nil
50
50
  end
51
51
 
52
+ # 输出静态成功信息(不使用spinner,对应 fancyinfo_success)
53
+ # @param args [Array] 要输出的消息
54
+ def info(*args)
55
+ message = args.join(" ")
56
+ puts " ✓ #{message}"
57
+ end
58
+
59
+ # 输出静态警告信息(不使用spinner,对应 fancyinfo_error)
60
+ # @param args [Array] 要输出的消息
61
+ def warning(*args)
62
+ message = args.join(" ")
63
+ puts "\e[33m ⚠ #{message}\e[0m"
64
+ end
65
+
52
66
  #-------------------------------------------------------------------------#
53
67
  #-------------------------------------------------------------------------#
54
68
  # @!group Singleton
@@ -72,6 +86,33 @@ module Pindo
72
86
  #
73
87
  class << self
74
88
  attr_writer :instance
89
+
90
+ # 类方法委托,简化调用方式
91
+ # 使用 Funlog.info("消息") 代替 Funlog.instance.info("消息")
92
+
93
+ def fancyinfo_start(*args)
94
+ instance.fancyinfo_start(*args)
95
+ end
96
+
97
+ def fancyinfo_update(*args)
98
+ instance.fancyinfo_update(*args)
99
+ end
100
+
101
+ def fancyinfo_success(*args)
102
+ instance.fancyinfo_success(*args)
103
+ end
104
+
105
+ def fancyinfo_error(*args)
106
+ instance.fancyinfo_error(*args)
107
+ end
108
+
109
+ def info(*args)
110
+ instance.info(*args)
111
+ end
112
+
113
+ def warning(*args)
114
+ instance.warning(*args)
115
+ end
75
116
  end
76
117
 
77
118
  # Provides support for accessing the configuration instance in other
@@ -111,27 +111,15 @@ module Pindo
111
111
  package_type: 'apk'
112
112
  )
113
113
 
114
- # ===== 使用 workflow 配置修改 Android 配置 =====
114
+ # ===== 使用 workflow 配置更新 Android 项目 =====
115
115
  if workflow_info && workflow_info[:package_name]
116
116
  package_name = workflow_info[:package_name]
117
117
 
118
- puts "\n使用工作流配置更新 Android 配置:"
118
+ puts "\n使用工作流配置更新 Android 项目:"
119
119
  puts " Package Name: #{package_name}"
120
120
 
121
- # 修改 App Name
122
- Pindo::AndroidBuildConfigHelper.update_app_name_with_packagename(
123
- project_dir: pindo_project_dir,
124
- package_name: package_name
125
- )
126
-
127
- # 修改 Application ID
128
- Pindo::AndroidBuildConfigHelper.update_applicationid_with_packagename(
129
- project_dir: pindo_project_dir,
130
- package_name: package_name
131
- )
132
-
133
- # 添加基于 package_name 的 Scheme
134
- Pindo::AndroidBuildConfigHelper.add_scheme_packagename(
121
+ # 一次性更新 App Name、Application ID 和 URL Schemes
122
+ Pindo::AndroidBuildConfigHelper.update_project_with_packagename(
135
123
  project_dir: pindo_project_dir,
136
124
  package_name: package_name
137
125
  )
@@ -139,31 +127,17 @@ module Pindo
139
127
  raise Informative, "未获取到工作流信息"
140
128
  end
141
129
 
142
- build_helper = Pindo::BuildHelper.share_instance
143
- if @args_upload_flag
144
- is_need_add_tag,tag_action_parms = build_helper.check_is_need_add_tag?(pindo_project_dir)
145
- if is_need_add_tag
146
- Pindo::Command::Dev::Tag::run(tag_action_parms)
147
- end
148
- end
149
-
150
- scheme_name = @args_proj_name if @args_proj_name
151
- if !app_info_obj.nil? && !app_info_obj["scheme"].nil? && !app_info_obj["scheme"].empty?
152
- scheme_name = app_info_obj["scheme"]
153
- end
154
- if scheme_name.nil? || scheme_name.empty? && is_git_directory?(local_repo_dir:pindo_project_dir)
155
- current_git_root_path = git_root_directory(local_repo_dir: pindo_project_dir)
156
- if current_git_root_path && !current_git_root_path.empty?
157
- git_repo_name = File.basename(current_git_root_path)
158
- if !git_repo_name.nil? && !git_repo_name.empty?
159
- scheme_name = git_repo_name
160
- end
161
- end
130
+ # ===== 从 JPS 下载并替换项目 Icon =====
131
+ if app_info_obj && app_info_obj["projectIcon"] && !app_info_obj["projectIcon"].empty?
132
+ Pindo::AndroidBuildConfigHelper.download_and_replace_icon_from_url(
133
+ project_dir: pindo_project_dir,
134
+ icon_url: app_info_obj["projectIcon"]
135
+ )
136
+ else
137
+ Funlog.warning("未配置 Icon URL,跳过 Icon 替换")
162
138
  end
163
139
 
164
- android_build_helper = Pindo::AndroidBuildHelper.share_instance
165
-
166
- # 更新版本号和Build号(仅在Git仓库中)
140
+ # ===== 更新版本号和Build号(仅在Git仓库中)=====
167
141
  version_helper = Pindo::VersionHelper.share_instance
168
142
  version_info = version_helper.get_version_info(project_dir: pindo_project_dir)
169
143
 
@@ -175,22 +149,19 @@ module Pindo
175
149
  version_code: version_info[:build_number]
176
150
  )
177
151
  else
178
- puts "非Git仓库,保持工程原有版本号"
152
+ Funlog.warning("非Git仓库,保持工程原有版本号")
179
153
  end
180
154
 
181
- # 添加以项目名称为 scheme 的配置
182
- Pindo::AndroidBuildConfigHelper.add_test_scheme(project_dir: pindo_project_dir, scheme_name: scheme_name)
183
-
184
- # 获取 bundle ID 并添加以 bundle ID 为 scheme 的配置
185
- bundle_id = android_build_helper.get_application_id(pindo_project_dir)
186
- if !bundle_id.nil? && !bundle_id.empty?
187
- puts "获取到 Bundle ID: #{bundle_id}"
188
- Pindo::AndroidBuildConfigHelper.add_test_scheme(project_dir: pindo_project_dir, scheme_name: bundle_id)
189
- else
190
- puts "警告: 未能获取到 Bundle ID,跳过添加 Bundle ID scheme"
155
+ build_helper = Pindo::BuildHelper.share_instance
156
+ if @args_upload_flag
157
+ is_need_add_tag,tag_action_parms = build_helper.check_is_need_add_tag?(pindo_project_dir)
158
+ if is_need_add_tag
159
+ Pindo::Command::Dev::Tag::run(tag_action_parms)
160
+ end
191
161
  end
192
-
162
+
193
163
  begin
164
+ android_build_helper = Pindo::AndroidBuildHelper.share_instance
194
165
  apk_path = android_build_helper.auto_build_apk(pindo_project_dir, !@args_release_flag)
195
166
  ipa_file_upload = Dir.glob(apk_path).max_by {|f| File.mtime(f)}
196
167
 
@@ -97,27 +97,15 @@ module Pindo
97
97
  package_type: 'apk'
98
98
  )
99
99
 
100
- # ===== 使用 workflow 配置修改 Android 配置 =====
100
+ # ===== 使用 workflow 配置更新 Android 项目 =====
101
101
  if workflow_info && workflow_info[:package_name]
102
102
  package_name = workflow_info[:package_name]
103
103
 
104
- puts "\n使用工作流配置更新 Android 配置:"
104
+ puts "\n使用工作流配置更新 Android 项目:"
105
105
  puts " Package Name: #{package_name}"
106
106
 
107
- # 修改 App Name
108
- Pindo::AndroidBuildConfigHelper.update_app_name_with_packagename(
109
- project_dir: pindo_project_dir,
110
- package_name: package_name
111
- )
112
-
113
- # 修改 Application ID
114
- Pindo::AndroidBuildConfigHelper.update_applicationid_with_packagename(
115
- project_dir: pindo_project_dir,
116
- package_name: package_name
117
- )
118
-
119
- # 添加基于 package_name 的 Scheme
120
- Pindo::AndroidBuildConfigHelper.add_scheme_packagename(
107
+ # 一次性更新 App Name、Application ID 和 URL Schemes
108
+ Pindo::AndroidBuildConfigHelper.update_project_with_packagename(
121
109
  project_dir: pindo_project_dir,
122
110
  package_name: package_name
123
111
  )
@@ -89,27 +89,15 @@ module Pindo
89
89
  package_type: 'apk'
90
90
  )
91
91
 
92
- # ===== 使用 workflow 配置修改 Android 配置 =====
92
+ # ===== 使用 workflow 配置更新 Android 项目 =====
93
93
  if workflow_info && workflow_info[:package_name]
94
94
  package_name = workflow_info[:package_name]
95
95
 
96
- puts "\n使用工作流配置更新 Android 配置:"
96
+ puts "\n使用工作流配置更新 Android 项目:"
97
97
  puts " Package Name: #{package_name}"
98
98
 
99
- # 修改 App Name
100
- Pindo::AndroidBuildConfigHelper.update_app_name_with_packagename(
101
- project_dir: pindo_project_dir,
102
- package_name: package_name
103
- )
104
-
105
- # 修改 Application ID
106
- Pindo::AndroidBuildConfigHelper.update_applicationid_with_packagename(
107
- project_dir: pindo_project_dir,
108
- package_name: package_name
109
- )
110
-
111
- # 添加基于 package_name 的 Scheme
112
- Pindo::AndroidBuildConfigHelper.add_scheme_packagename(
99
+ # 一次性更新 App Name、Application ID 和 URL Schemes
100
+ Pindo::AndroidBuildConfigHelper.update_project_with_packagename(
113
101
  project_dir: pindo_project_dir,
114
102
  package_name: package_name
115
103
  )
@@ -90,21 +90,15 @@ module Pindo
90
90
  package_type: 'ipa'
91
91
  )
92
92
 
93
- # ===== 使用 workflow 配置修改 plist =====
93
+ # ===== 使用 workflow 配置更新项目 =====
94
94
  if workflow_info && workflow_info[:package_name]
95
95
  package_name = workflow_info[:package_name]
96
96
 
97
- puts "\n使用工作流配置更新 Info.plist:"
97
+ puts "\n使用工作流配置更新 iOS 项目:"
98
98
  puts " Package Name: #{package_name}"
99
99
 
100
- # 修改 Display Name
101
- Pindo::XcodeBuildConfig.update_display_name_with_packagename(
102
- project_dir: project_dir,
103
- package_name: package_name
104
- )
105
-
106
- # 修改 Bundle ID
107
- Pindo::XcodeBuildConfig.update_bundleid_with_packagename(
100
+ # 一次性更新 Display Name、Bundle ID 和 URL Schemes
101
+ Pindo::XcodeBuildConfig.update_project_with_packagename(
108
102
  project_dir: project_dir,
109
103
  package_name: package_name
110
104
  )
@@ -130,23 +124,6 @@ module Pindo
130
124
  # 处理entitlements配置
131
125
  Pindo::XcodeBuildConfig.update_entitlements_config(project_dir: project_dir, config_file: config_json_file)
132
126
 
133
- # 添加URL Scheme(基于 package_name)
134
- if @args_upload_flag && workflow_info && workflow_info[:package_name]
135
- Pindo::XcodeBuildConfig.add_url_scheme_packagename(
136
- project_dir: project_dir,
137
- package_name: workflow_info[:package_name]
138
- )
139
- end
140
-
141
- # 添加URL Schemes(基于 scheme_name 和 Bundle ID)
142
- if @args_upload_flag
143
- scheme_name = @args_proj_name
144
- Pindo::XcodeBuildConfig.add_url_schemes(
145
- project_dir: project_dir,
146
- scheme_name: scheme_name
147
- )
148
- end
149
-
150
127
  if File.exist?(File.join(project_dir, "Podfile"))
151
128
 
152
129
  args_temp = []
@@ -157,26 +157,45 @@ module Pindo
157
157
  package_type: 'ipa'
158
158
  )
159
159
 
160
- # ===== 使用 workflow 配置修改 plist =====
160
+ # ===== 使用 workflow 配置更新项目 =====
161
161
  if workflow_info && workflow_info[:package_name]
162
162
  package_name = workflow_info[:package_name]
163
163
 
164
- puts "\n使用工作流配置更新 Info.plist:"
164
+ puts "\n使用工作流配置更新 iOS 项目:"
165
165
  puts " Package Name: #{package_name}"
166
166
 
167
- # 修改 Display Name
168
- Pindo::XcodeBuildConfig.update_display_name_with_packagename(
167
+ # 一次性更新 Display Name、Bundle ID 和 URL Schemes
168
+ Pindo::XcodeBuildConfig.update_project_with_packagename(
169
169
  project_dir: pindo_project_dir,
170
170
  package_name: package_name
171
171
  )
172
+ else
173
+ raise Informative, "未获取到工作流信息"
174
+ end
172
175
 
173
- # 修改 Bundle ID
174
- Pindo::XcodeBuildConfig.update_bundleid_with_packagename(
176
+ # ===== JPS 下载并替换项目 Icon =====
177
+ if app_info_obj && app_info_obj["projectIcon"] && !app_info_obj["projectIcon"].empty?
178
+ Pindo::XcodeBuildConfig.download_and_replace_icon_from_url(
175
179
  project_dir: pindo_project_dir,
176
- package_name: package_name
180
+ icon_url: app_info_obj["projectIcon"]
177
181
  )
178
182
  else
179
- raise Informative, "未获取到工作流信息"
183
+ Funlog.warning("未配置 Icon URL,跳过 Icon 替换")
184
+ end
185
+
186
+ # ===== 更新版本号和Build号(仅在Git仓库中)=====
187
+ version_helper = Pindo::VersionHelper.share_instance
188
+ version_info = version_helper.get_version_info(project_dir: pindo_project_dir)
189
+
190
+ if version_info[:is_git_repo]
191
+ # 更新iOS工程版本
192
+ Pindo::XcodeBuildConfig.update_ios_project_version(
193
+ project_dir: pindo_project_dir,
194
+ version: version_info[:version],
195
+ build_number: version_info[:build_number]
196
+ )
197
+ else
198
+ Funlog.warning("非Git仓库,保持工程原有版本号")
180
199
  end
181
200
 
182
201
  args_temp = []
@@ -186,37 +205,9 @@ module Pindo
186
205
  Dir.chdir(pindo_project_dir)
187
206
  config_json_file = File.join(pindo_project_dir,"config.json")
188
207
 
189
- scheme_name = @args_proj_name if @args_proj_name
190
- if !app_info_obj.nil? && !app_info_obj["scheme"].nil? && !app_info_obj["scheme"].empty?
191
- scheme_name = app_info_obj["scheme"]
192
- end
193
- if scheme_name.nil? || scheme_name.empty? && is_git_directory?(local_repo_dir:pindo_project_dir)
194
- current_git_root_path = git_root_directory(local_repo_dir: pindo_project_dir)
195
- if current_git_root_path && !current_git_root_path.empty?
196
- git_repo_name = File.basename(current_git_root_path)
197
- if !git_repo_name.nil? && !git_repo_name.empty?
198
- scheme_name = git_repo_name
199
- end
200
- end
201
- end
202
-
203
208
  # 处理entitlements配置
204
209
  Pindo::XcodeBuildConfig.update_entitlements_config(project_dir: pindo_project_dir, config_file: config_json_file)
205
210
 
206
- # 添加URL Scheme(基于 package_name)
207
- if workflow_info && workflow_info[:package_name]
208
- Pindo::XcodeBuildConfig.add_url_scheme_packagename(
209
- project_dir: pindo_project_dir,
210
- package_name: workflow_info[:package_name]
211
- )
212
- end
213
-
214
- # 添加URL Schemes(基于 scheme_name 和 Bundle ID)
215
- Pindo::XcodeBuildConfig.add_url_schemes(
216
- project_dir: pindo_project_dir,
217
- scheme_name: scheme_name
218
- )
219
-
220
211
  if File.exist?(File.join(pindo_project_dir, "Podfile"))
221
212
 
222
213
  args_temp = []
@@ -270,21 +261,6 @@ module Pindo
270
261
 
271
262
  Pindo::Command::Deploy::Cert::run(args_temp)
272
263
 
273
- # 更新版本号和Build号(仅在Git仓库中)
274
- version_helper = Pindo::VersionHelper.share_instance
275
- version_info = version_helper.get_version_info(project_dir: pindo_project_dir)
276
-
277
- if version_info[:is_git_repo]
278
- # 更新iOS工程版本
279
- Pindo::XcodeBuildConfig.update_ios_project_version(
280
- project_dir: pindo_project_dir,
281
- version: version_info[:version],
282
- build_number: version_info[:build_number]
283
- )
284
- else
285
- puts "非Git仓库,保持工程原有版本号"
286
- end
287
-
288
264
  Dir.chdir(pindo_project_dir)
289
265
  Pindo::Command::Deploy::Build::run(args_temp)
290
266
 
@@ -121,37 +121,18 @@ module Pindo
121
121
  package_type: 'ipa'
122
122
  )
123
123
 
124
- # ===== 使用 workflow 配置修改 plist =====
124
+ # ===== 使用 workflow 配置更新项目 =====
125
125
  if workflow_info && workflow_info[:package_name]
126
126
  package_name = workflow_info[:package_name]
127
127
 
128
- puts "\n使用工作流配置更新 Info.plist:"
128
+ puts "\n使用工作流配置更新 iOS 项目:"
129
129
  puts " Package Name: #{package_name}"
130
130
 
131
- # 修改 Display Name
132
- Pindo::XcodeBuildConfig.update_display_name_with_packagename(
131
+ # 一次性更新 Display Name、Bundle ID 和 URL Schemes
132
+ Pindo::XcodeBuildConfig.update_project_with_packagename(
133
133
  project_dir: pindo_project_dir,
134
134
  package_name: package_name
135
135
  )
136
-
137
- # 修改 Bundle ID
138
- Pindo::XcodeBuildConfig.update_bundleid_with_packagename(
139
- project_dir: pindo_project_dir,
140
- package_name: package_name
141
- )
142
-
143
- # 添加URL Scheme(基于 package_name)
144
- Pindo::XcodeBuildConfig.add_url_scheme_packagename(
145
- project_dir: pindo_project_dir,
146
- package_name: package_name
147
- )
148
-
149
- # 添加URL Schemes(基于 scheme_name 和 Bundle ID)
150
- scheme_name = @args_proj_name
151
- Pindo::XcodeBuildConfig.add_url_schemes(
152
- project_dir: pindo_project_dir,
153
- scheme_name: scheme_name
154
- )
155
136
  else
156
137
  raise Informative, "未获取到工作流信息"
157
138
  end
@@ -1,12 +1,64 @@
1
1
  require 'fileutils'
2
+ require 'open-uri'
2
3
  require_relative '../../base/funlog'
3
4
  require_relative 'base_helper'
5
+ require_relative '../../base/executable'
6
+ require_relative 'androidreshelper'
4
7
 
5
8
  module Pindo
6
9
 
7
10
  class AndroidBuildConfigHelper
8
11
  include BaseAndroidHelper
9
12
 
13
+ # 使用package_name一次性更新App Name、Application ID和URL Schemes
14
+ # 优化版本:提高性能,减少代码重复
15
+ # @param project_dir [String] Android项目目录路径
16
+ # @param package_name [String] 工作流的package_name(如:"Test Demo")
17
+ # @return [Boolean] 是否成功更新
18
+ def self.update_project_with_packagename(project_dir: nil, package_name: nil)
19
+ raise ArgumentError, "项目目录不能为空" if project_dir.nil?
20
+ raise ArgumentError, "Package Name不能为空" if package_name.nil?
21
+
22
+ # 生成各种值
23
+ app_name = package_name.gsub(/[^a-zA-Z0-9\s]/, '').gsub(/\s+/, '')
24
+ app_id_suffix = package_name.gsub(/[^a-zA-Z0-9]/, '').downcase
25
+ application_id = "com.heroneverdie101.#{app_id_suffix}"
26
+ package_scheme = package_name.gsub(/[^a-zA-Z0-9]/, '').downcase
27
+ bundle_scheme = application_id.gsub(/[^a-zA-Z0-9]/, '').downcase
28
+
29
+ # 1. 更新 App Name
30
+ success_app_name = update_app_name_with_packagename(
31
+ project_dir: project_dir,
32
+ package_name: package_name
33
+ )
34
+
35
+ # 2. 更新 Application ID
36
+ success_app_id = update_applicationid_with_packagename(
37
+ project_dir: project_dir,
38
+ package_name: package_name
39
+ )
40
+
41
+ # 3. 添加基于 package_name 的 Scheme
42
+ success_package_scheme = add_test_scheme(
43
+ project_dir: project_dir,
44
+ scheme_name: package_scheme
45
+ )
46
+ if success_package_scheme
47
+ puts " ✓ 已添加Scheme: #{package_scheme} (基于 Package Name)"
48
+ end
49
+
50
+ # 4. 添加基于 Application ID 的 Scheme
51
+ success_bundle_scheme = add_test_scheme(
52
+ project_dir: project_dir,
53
+ scheme_name: bundle_scheme
54
+ )
55
+ if success_bundle_scheme
56
+ puts " ✓ 已添加Scheme: #{bundle_scheme} (基于 Application ID)"
57
+ end
58
+
59
+ return success_app_name && success_app_id && success_package_scheme && success_bundle_scheme
60
+ end
61
+
10
62
  # 更新Android工程版本号
11
63
  # @param project_dir [String] Android项目目录路径
12
64
  # @param version_name [String] 版本名
@@ -253,27 +305,6 @@ module Pindo
253
305
  end
254
306
  end
255
307
 
256
- # 使用package_name添加Android Scheme
257
- # @param project_dir [String] Android项目目录路径
258
- # @param package_name [String] 工作流的package_name(如:"Test Demo")
259
- # @return [Boolean] 是否成功添加
260
- def self.add_scheme_packagename(project_dir: nil, package_name: nil)
261
- raise ArgumentError, "项目目录不能为空" if project_dir.nil?
262
- raise ArgumentError, "Package Name不能为空" if package_name.nil?
263
-
264
- # 从 package_name 生成 scheme(去除特殊字符,转小写)
265
- scheme_name = package_name.to_s.gsub(/[^a-zA-Z0-9]/, '').downcase
266
-
267
- # 调用现有的 add_test_scheme 方法
268
- result = add_test_scheme(project_dir: project_dir, scheme_name: scheme_name)
269
-
270
- if result
271
- puts " ✓ 已添加Scheme: #{scheme_name} (来自: #{package_name})"
272
- end
273
-
274
- return result
275
- end
276
-
277
308
  # 添加测试scheme到Android工程
278
309
  # @param project_dir [String] Android项目目录路径
279
310
  # @param scheme_name [String] 要添加的scheme名称
@@ -562,6 +593,96 @@ module Pindo
562
593
  end
563
594
  end
564
595
 
596
+ # ===== Android Icon 处理方法(使用 AndroidResHelper)=====
597
+
598
+ # 创建Android各种密度的icon(委托给 AndroidResHelper)
599
+ # @param icon_path [String] 原始icon路径(建议1024x1024或512x512)
600
+ # @param output_dir [String] 输出目录
601
+ # @return [Hash] 各密度icon路径
602
+ def self.create_android_icons(icon_path: nil, output_dir: nil)
603
+ AndroidResHelper.create_icons(icon_name: icon_path, new_icon_dir: output_dir)
604
+ end
605
+
606
+ # 安装Android icon到项目中(委托给 AndroidResHelper)
607
+ # @param project_dir [String] Android项目目录
608
+ # @param icon_dir [String] icon文件目录(包含各密度文件夹)
609
+ # @return [Boolean] 是否成功安装
610
+ def self.install_android_icon(project_dir: nil, icon_dir: nil)
611
+ AndroidResHelper.install_icon(proj_dir: project_dir, new_icon_dir: icon_dir)
612
+ end
613
+
614
+ # 从URL下载Icon并替换Android工程的Icon
615
+ # @param project_dir [String] Android项目目录路径
616
+ # @param icon_url [String] Icon的下载URL地址
617
+ # @return [Boolean] 是否成功下载并替换Icon
618
+ def self.download_and_replace_icon_from_url(project_dir: nil, icon_url: nil)
619
+ # 参数校验 - 不抛出异常,返回 false
620
+ if project_dir.nil?
621
+ Funlog.instance.fancyinfo_error("Icon 替换失败: 项目目录不能为空")
622
+ return false
623
+ end
624
+
625
+ if icon_url.nil? || icon_url.empty?
626
+ Funlog.instance.fancyinfo_error("Icon 替换失败: Icon URL不能为空")
627
+ return false
628
+ end
629
+
630
+ puts "\n检测到项目 Icon URL: #{icon_url}"
631
+
632
+ # 创建临时目录(所有 icon 处理都在此目录进行)
633
+ temp_icon_dir = File.join(project_dir, ".pindo_temp_icon")
634
+ icon_download_path = nil
635
+ replace_success = false
636
+
637
+ begin
638
+ FileUtils.mkdir_p(temp_icon_dir) unless File.exist?(temp_icon_dir)
639
+ icon_download_path = File.join(temp_icon_dir, "downloaded_icon.png")
640
+
641
+ # 下载 icon
642
+ Funlog.instance.fancyinfo_start("正在从 JPS 下载项目 Icon...")
643
+ URI.open(icon_url) do |file|
644
+ File.binwrite(icon_download_path, file.read)
645
+ end
646
+ Funlog.instance.fancyinfo_success("Icon 下载成功!")
647
+
648
+ # 验证文件已下载
649
+ unless File.exist?(icon_download_path)
650
+ Funlog.instance.fancyinfo_error("Icon 下载失败: 文件未创建")
651
+ return false
652
+ end
653
+
654
+ # 生成 icon 目录(在临时目录内部)
655
+ new_icon_dir = File.join(temp_icon_dir, "generated_icons")
656
+
657
+ # 创建各种密度的 icon
658
+ Funlog.instance.fancyinfo_start("正在创建 Android icon...")
659
+ create_android_icons(
660
+ icon_path: icon_download_path,
661
+ output_dir: new_icon_dir
662
+ )
663
+ Funlog.instance.fancyinfo_success("创建 icon 完成!")
664
+
665
+ # 替换工程中的 icon
666
+ Funlog.instance.fancyinfo_start("正在替换 icon...")
667
+ install_android_icon(
668
+ project_dir: project_dir,
669
+ icon_dir: new_icon_dir
670
+ )
671
+ Funlog.instance.fancyinfo_success("替换 icon 完成!")
672
+ replace_success = true
673
+
674
+ rescue => e
675
+ Funlog.instance.fancyinfo_error("Icon 处理失败: #{e.message}")
676
+ puts e.backtrace
677
+ replace_success = false
678
+ ensure
679
+ # 清理临时文件(无论成功失败都清理)
680
+ FileUtils.rm_rf(temp_icon_dir) if temp_icon_dir && File.exist?(temp_icon_dir)
681
+ end
682
+
683
+ return replace_success
684
+ end
685
+
565
686
  end
566
687
 
567
688
  end