pindo 4.8.2 → 4.8.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.
@@ -62,11 +62,19 @@ module Pindo
62
62
  (/darwin/ =~ RUBY_PLATFORM) != nil
63
63
  end
64
64
 
65
- def install_certs(cert_url:nil, certs_dir:nil, cert_type:nil)
65
+ def install_certs(cert_url:nil, certs_dir:nil, cert_type:nil, platform_type:nil)
66
66
 
67
67
  cert_git_dir = cert_type.downcase
68
- if !cert_type.downcase.include?("development")
69
- cert_git_dir = "distribution"
68
+ if platform_type.downcase.eql?("macos")
69
+ if !cert_type.downcase.include?("development")
70
+ cert_git_dir = "developer_id_application"
71
+ else
72
+ cert_git_dir = "development"
73
+ end
74
+ else
75
+ if !cert_type.downcase.include?("development")
76
+ cert_git_dir = "distribution"
77
+ end
70
78
  end
71
79
 
72
80
  certs = Dir[File.join(certs_dir, "certs", cert_git_dir.to_s, "*.cer")]
@@ -120,24 +128,40 @@ module Pindo
120
128
 
121
129
  end
122
130
 
123
- def install_provisionfiles(cert_url:nil, certs_dir:nil, bundle_id_map:nil, cert_type:nil)
124
-
125
-
126
- if cert_type.downcase.include?("development")
127
- cert_type = "Development"
128
- elsif cert_type.downcase.include?("adhoc")
129
- cert_type = "Adhoc"
131
+ def install_provisionfiles(cert_url:nil, certs_dir:nil, bundle_id_map:nil, cert_type:nil, platform_type:nil)
132
+
133
+ cert_sub_dir = cert_type.downcase
134
+ provision_start_name = "Development"
135
+ provision_extension_name = ".mobileprovision"
136
+ if platform_type.downcase.include?("macos")
137
+ provision_extension_name = ".provisionprofile"
138
+ if cert_type.downcase.include?("development")
139
+ provision_start_name = "Development"
140
+ cert_sub_dir = cert_type.downcase
141
+ else
142
+ provision_start_name = "Direct"
143
+ cert_sub_dir = "developer_id"
144
+ end
130
145
  else
131
- cert_type = "AppStore"
146
+ if cert_type.downcase.include?("development")
147
+ provision_start_name = "Development"
148
+ cert_sub_dir = cert_type.downcase
149
+ elsif cert_type.downcase.include?("adhoc")
150
+ provision_start_name = "Adhoc"
151
+ cert_sub_dir = "adhoc"
152
+ else
153
+ provision_start_name = "AppStore"
154
+ cert_sub_dir = "appstore"
155
+ end
132
156
  end
133
157
 
134
- Funlog.instance.fancyinfo_start("正在安装#{cert_type} Provisioning Profiles...")
158
+
159
+ Funlog.instance.fancyinfo_start("正在安装#{provision_start_name} #{platform_type} Provisioning Profiles...")
135
160
 
136
161
  un_exist_files = []
137
162
  provisioning_info_array = []
138
-
139
163
  bundle_id_map.each do |type, bundle_id_temp|
140
- profile_filename = File.join(certs_dir, "profiles", cert_type.downcase.to_s,[cert_type.to_s, bundle_id_temp].join('_') + '.mobileprovision')
164
+ profile_filename = File.join(certs_dir, "profiles", cert_sub_dir, [provision_start_name.to_s, bundle_id_temp].join('_') + provision_extension_name)
141
165
  unless File.exist?(profile_filename)
142
166
  un_exist_files << profile_filename
143
167
  next
@@ -164,10 +188,10 @@ module Pindo
164
188
  provisioning_info_array << provisioning_info
165
189
  end
166
190
 
167
- Funlog.instance.fancyinfo_success("#{cert_type} Provisioning Profiles文件安装完成!")
191
+ Funlog.instance.fancyinfo_success("#{provision_start_name} #{platform_type} Provisioning Profiles文件安装完成!")
168
192
 
169
193
  if un_exist_files.size > 0
170
- Funlog.instance.fancyinfo_error("证书 #{cert_type} Provisioning Profiles文件不存在!")
194
+ Funlog.instance.fancyinfo_error("证书 #{provision_start_name} #{platform_type} Provisioning Profiles文件不存在!")
171
195
  raise Informative, "The following profiles do not exist: #{un_exist_files.join(', ')}"
172
196
  end
173
197
 
@@ -24,7 +24,7 @@ module Pindo
24
24
  }
25
25
  end
26
26
 
27
- def create_provisioning_info_array(build_type:nil)
27
+ def create_provisioning_info_array(build_type:nil, platform_type:nil)
28
28
 
29
29
  provisioning_info_array = []
30
30
 
@@ -34,13 +34,13 @@ module Pindo
34
34
  provisioning_info = {}
35
35
  provisioning_info['type'] = type
36
36
  provisioning_info['bundle_id'] = bundle_id_temp
37
- name_temp = Match::Utils.environment_variable_name_profile_name(app_identifier: bundle_id_temp, type: build_type)
37
+ name_temp = Match::Utils.environment_variable_name_profile_name(app_identifier: bundle_id_temp, type: build_type, platform:platform_type)
38
38
  provisioning_info['profile_name'] = ENV[name_temp]
39
- path_temp = Match::Utils.environment_variable_name_profile_path(app_identifier:bundle_id_temp,type: build_type)
39
+ path_temp = Match::Utils.environment_variable_name_profile_path(app_identifier:bundle_id_temp,type: build_type, platform:platform_type)
40
40
  provisioning_info['profile_path'] = ENV[path_temp]
41
- signing_identity_key=Match::Utils.environment_variable_name_certificate_name(app_identifier: bundle_id_temp,type: build_type)
41
+ signing_identity_key=Match::Utils.environment_variable_name_certificate_name(app_identifier: bundle_id_temp,type: build_type, platform:platform_type)
42
42
  provisioning_info["signing_identity"] = ENV[signing_identity_key]
43
- team_id_key = Match::Utils.environment_variable_name_team_id(app_identifier: bundle_id_temp,type:build_type)
43
+ team_id_key = Match::Utils.environment_variable_name_team_id(app_identifier: bundle_id_temp,type:build_type, platform:platform_type)
44
44
  provisioning_info["team_id"] = ENV[team_id_key]
45
45
  provisioning_info_array << provisioning_info
46
46
  end
@@ -226,13 +226,25 @@ module Pindo
226
226
  end
227
227
  end
228
228
 
229
- def create_upload_cert_info(apple_id:nil, cert_type:nil)
229
+ def create_upload_cert_info(apple_id:nil, cert_type:nil, platform_type:nil)
230
230
 
231
231
  cert_dest_dir = File.join(Dir.pwd, "cert")
232
232
  if !File.exist?(cert_dest_dir)
233
233
  FileUtils.mkdir_p(cert_dest_dir)
234
234
  end
235
235
 
236
+ cert_sub_dir = cert_type.downcase
237
+ if platform_type.downcase.eql?("macos")
238
+ if !cert_type.downcase.include?("development")
239
+ cert_sub_dir = "developer_id_application"
240
+ else
241
+ cert_sub_dir = "development"
242
+ end
243
+ else
244
+ if !cert_type.downcase.include?("development")
245
+ cert_sub_dir = "distribution"
246
+ end
247
+ end
236
248
 
237
249
  cert_git_url = pindo_single_config.deploy_cert_giturl
238
250
  if apple_id.eql?(pindo_single_config.demo_apple_id)
@@ -241,12 +253,8 @@ module Pindo
241
253
  cert_reponame = cert_git_url.split("/").last.chomp(".git")
242
254
  certs_dir = getcode_to_dir(reponame:cert_reponame, remote_url:cert_git_url, path: pindo_single_config.pindo_dir, new_branch:apple_id)
243
255
 
244
- cert_git_dir = cert_type.downcase
245
- if !cert_type.downcase.include?("development")
246
- cert_git_dir = "distribution"
247
- end
248
256
 
249
- keys = Dir[File.join(certs_dir, "certs", cert_git_dir.to_s, "*.p12")]
257
+ keys = Dir[File.join(certs_dir, "certs", cert_sub_dir, "*.p12")]
250
258
  decrypt_password = AESHelper.fetch_password(keychain_name:cert_git_url)
251
259
  output_dir = Dir.mktmpdir
252
260
  key_path = AESHelper.decrypt_specific_file(src_file: keys.first, password:decrypt_password, output_dir: output_dir)
@@ -259,7 +267,7 @@ module Pindo
259
267
 
260
268
  end
261
269
 
262
- def create_upload_provisioning_info(apple_id:nil, cert_type:nil, provisioning_info_array:nil)
270
+ def create_upload_provisioning_info(apple_id:nil, cert_type:nil, platform_type:nil, provisioning_info_array:nil)
263
271
 
264
272
  cert_dir = File.join(Dir.pwd, "cert")
265
273
  cert_json_file = File.join(cert_dir, "certs.json")
@@ -311,37 +319,57 @@ module Pindo
311
319
  cert_item["cert_provisioning_group"] = cert_item["cert_provisioning_group"] || []
312
320
 
313
321
 
322
+ provision_start_name = "Development"
323
+ if platform_type.downcase.include?("macos")
324
+ if cert_type.downcase.include?("development")
325
+ provision_start_name = "development"
326
+ else
327
+ provision_start_name = "direct"
328
+ end
329
+ else
330
+ if cert_type.downcase.include?("development")
331
+ provision_start_name = "development"
332
+ elsif cert_type.downcase.include?("adhoc")
333
+ provision_start_name = "adhoc"
334
+ else
335
+ provision_start_name = "appstore"
336
+ end
337
+ end
314
338
 
315
339
  cert_provisioning_group_item = {}
316
- provisioning_group_id = [cert_type, "group", bundle_id].join("_")
340
+ provisioning_group_id = [provision_start_name, platform_type, bundle_id].join("_")
317
341
 
318
342
  provisioning_group_result = cert_item["cert_provisioning_group"].select { |x| x["provisioning_group_id"].eql?(provisioning_group_id)}.first
319
343
  if provisioning_group_result.nil?
320
- cert_provisioning_group_item = {}
344
+ cert_provisioning_group_item = {}
321
345
  else
322
- cert_provisioning_group_item = provisioning_group_result
323
- cert_item["cert_provisioning_group"].delete_if { |x| x["provisioning_group_id"].eql?(provisioning_group_id)}
346
+ cert_provisioning_group_item = provisioning_group_result
347
+ cert_item["cert_provisioning_group"].delete_if { |x| x["provisioning_group_id"].eql?(provisioning_group_id)}
324
348
  end
325
349
 
326
350
 
327
351
 
328
352
  cert_provisioning_group_item["provisioning_group_id"] = provisioning_group_id
353
+ cert_provisioning_group_item["platform_type"] = platform_type
329
354
  cert_provisioning_group_item["provisioning_main_bundle_id"] = bundle_id
330
355
  cert_provisioning_group_item["provisioning_items"] = []
331
356
 
332
- group_id = [cert_type, "group", bundle_id].join("_")
357
+ group_id = [provision_start_name, platform_type, bundle_id].join("_")
358
+
359
+
333
360
  provisioning_info_array.each do |provisioning_info|
334
361
  bundle_id_temp = provisioning_info['bundle_id']
335
- provisioning_id = [cert_type, bundle_id_temp].join("_")
336
-
362
+ provisioning_id = [provision_start_name, bundle_id_temp].join("_")
363
+ real_path = provisioning_info["profile_path"]
364
+ extname = File.extname(real_path)
337
365
  cert_provisioning_group_item["provisioning_items"] << {
338
366
  "bundle_id" => bundle_id_temp,
339
367
  "provisioning_id" => provisioning_id,
340
368
  "group_id" => group_id,
341
- "provisioning_file" => provisioning_id + ".mobileprovision"
369
+ "provisioning_file" => provisioning_id + extname
342
370
  }
343
- real_path = provisioning_info["profile_path"]
344
- FileUtils.cp_r(real_path, File.join(cert_dir, provisioning_id + ".mobileprovision"))
371
+
372
+ FileUtils.cp_r(real_path, File.join(cert_dir, provisioning_id + extname))
345
373
 
346
374
  end
347
375
 
@@ -63,23 +63,46 @@ module Pindo
63
63
  end
64
64
 
65
65
  proj_name_array = []
66
+
67
+ proj_name_array = proj_name_array + PindoUserLocalConfig.instance.get_last_work_project_array()
68
+
69
+
70
+ proj_name_array_append = []
71
+
66
72
  if File.exist?(File.join(working_directory, "config.json"))
67
73
  config_json = JSON.parse(File.read(File.join(working_directory, "config.json")))
68
- proj_name_array << config_json["project_info"]["project_name"]
74
+ new_proj_string = config_json["project_info"]["project_name"]
75
+ if !new_proj_string.nil? && !new_proj_string.empty?
76
+ proj_name_array_append << config_json["project_info"]["project_name"]
77
+ end
69
78
  end
70
79
 
71
80
  xcodeproj_file_name = Dir.glob(File.join(Dir.pwd, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
72
- upload_proj_name = File.basename(xcodeproj_file_name, ".xcodeproj") if xcodeproj_file_name
73
- if !upload_proj_name.nil? && !upload_proj_name.empty?
74
- proj_name_array << upload_proj_name
81
+ new_proj_string = File.basename(xcodeproj_file_name, ".xcodeproj") if xcodeproj_file_name
82
+ if !new_proj_string.nil? && !new_proj_string.empty?
83
+ proj_name_array_append << new_proj_string
75
84
  end
76
85
 
77
- puts
78
86
  dir_base_name = File.basename(working_directory)
79
87
  unless ["Desktop", "Documents", "Downloads"].include?(dir_base_name)
80
- proj_name_array << dir_base_name
88
+ proj_name_array_append << dir_base_name
81
89
  end
82
90
 
91
+ proj_name_array_append.each do |new_string|
92
+ if !new_string.nil? && !new_string.empty?
93
+ if proj_name_array.size > 0
94
+ new_fromat_string = new_string.gsub(/[\s_]/, "")
95
+ unless proj_name_array.any? { |s| s.gsub(/[\s_]/, "") == new_fromat_string }
96
+ # 如果不存在相同字符串,插入到第一位
97
+ proj_name_array.push(new_string)
98
+ end
99
+ else
100
+ proj_name_array.push(new_string)
101
+ end
102
+ end
103
+ end
104
+
105
+ proj_name_array.uniq
83
106
  proj_name_array << "自定义输入Pyger上的App代号"
84
107
 
85
108
  if proj_name_array.size > 1
@@ -108,7 +131,12 @@ module Pindo
108
131
 
109
132
  if app_info_obj.nil?
110
133
  raise Informative, "#{upload_proj_name} 名称错误, 请输入正确的App代号,Pgyer网站没有该App!!!"
134
+ else
135
+ # 记录上次上传的项目
136
+ PindoUserLocalConfig.instance.write_last_work_project(proj_name:app_info_obj["appName"])
111
137
  end
138
+
139
+
112
140
  else
113
141
  raise Informative, "请先登录Pgyer网站"
114
142
  end
@@ -137,15 +137,39 @@ module Pindo
137
137
 
138
138
  project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
139
139
  project_obj = Xcodeproj::Project.open(project_fullname)
140
+ presources_path = nil
141
+
140
142
  presources_group = find_group(group:project_obj.main_group, group_name:"PResources")
141
143
  if presources_group.nil?
142
144
  presources_group = find_group(group:project_obj.main_group, group_name:"PResource")
143
145
  end
144
- if presources_group.nil?
145
- raise Informative, "没有找到资源目录PResources!!!!"
146
+ if !presources_group.nil?
147
+ presources_path = presources_group.real_path
146
148
  end
147
149
 
148
- presources_path = presources_group.real_path
150
+ if presources_path.nil?
151
+ presources_path_array = Dir.glob(File.join(project_dir, "**", "PResources"))
152
+ if presources_path_array.size > 1
153
+ presources_path = presources_path_array.select{ |filename| File.directory?(filename) && filename.end_with?("PResources")}
154
+ elsif presources_path_array.size == 1
155
+ presources_path = presources_path_array.first
156
+ end
157
+ end
158
+
159
+ if presources_path.nil?
160
+ presources_path_array = Dir.glob(File.join(project_dir, "**", "PResource"))
161
+ if presources_path_array.size > 1
162
+ presources_path = presources_path_array.select{ |filename| File.directory?(filename) && filename.end_with?("PResource")}
163
+ elsif presources_path_array.size == 1
164
+ presources_path = presources_path_array.first
165
+ end
166
+ end
167
+
168
+
169
+ if presources_path.nil? || !File.exist?(presources_path)
170
+ raise Informative, "没有找到资源目录PResources !!!!"
171
+ end
172
+
149
173
 
150
174
  config_file = Dir.glob(File.join(presources_path, "**", appprefix_file)).first
151
175
  if config_file.nil? || config_file.empty? || !File.exist?(config_file)
@@ -290,14 +290,24 @@ module Pindo
290
290
  proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
291
291
  project_obj = Xcodeproj::Project.open(proj_fullname)
292
292
 
293
- info_plist_path = File.join(project_dir, "AppEntry", "Info.plist")
293
+ info_plist_path = nil
294
294
  project_obj.targets.each do |target|
295
-
296
295
  temp_info = target.build_configurations.first.build_settings['INFOPLIST_FILE']
297
- info_plist_path = File.join(project_dir, temp_info)
296
+ if !temp_info.nil?
297
+ info_plist_path = File.join(project_dir, temp_info)
298
+ end
298
299
 
299
- if target.product_type.to_s.eql?("com.apple.product-type.application") && !File.exist?(info_plist_path)
300
- raise Informative, "Missing Target #{target.name.to_s} Info.plist !!! Modify Info.plist Error !!!"
300
+ # if target.product_type.to_s.eql?("com.apple.product-type.application") && !File.exist?(info_plist_path)
301
+ # info_plist_array = Dir.glob(File.join(project_dir, target.name, "**", "Info.plist"))
302
+ # if info_plist_array.size == 1
303
+ # info_plist_path = info_plist_array.first
304
+ # else
305
+ # raise Informative, "Missing Target #{target.name.to_s} Info.plist !!! Modify Info.plist Error !!!"
306
+ # end
307
+ # end
308
+
309
+ if target.product_type.to_s.eql?("com.apple.product-type.application") && (info_plist_path.nil? || !File.exist?(info_plist_path))
310
+ raise Informative, "Target #{target.name.to_s} 没有找到Info.plist, 修改Info.plist出错了!!"
301
311
  end
302
312
 
303
313
  if target.product_type.to_s.eql?("com.apple.product-type.application") then
@@ -2,126 +2,179 @@
2
2
  module Pindo
3
3
 
4
4
  module XcodoeResConst
5
-
6
5
  def self.xcode_ios_icon_json
7
- model_data = {
8
- "images" => [
9
- {
10
- "size" => "20x20",
11
- "idiom" => "iphone",
12
- "filename" => "icon20@2x.png",
13
- "scale" => "2x"
14
- },
15
- {
16
- "size" => "20x20",
17
- "idiom" => "iphone",
18
- "filename" => "icon20@3x.png",
19
- "scale" => "3x"
20
- },
21
- {
22
- "size" => "29x29",
23
- "idiom" => "iphone",
24
- "filename" => "icon29@2x.png",
25
- "scale" => "2x"
26
- },
27
- {
28
- "size" => "29x29",
29
- "idiom" => "iphone",
30
- "filename" => "icon29@3x.png",
31
- "scale" => "3x"
32
- },
33
- {
34
- "size" => "40x40",
35
- "idiom" => "iphone",
36
- "filename" => "icon40@2x.png",
37
- "scale" => "2x"
38
- },
39
- {
40
- "size" => "40x40",
41
- "idiom" => "iphone",
42
- "filename" => "icon40@3x.png",
43
- "scale" => "3x"
44
- },
45
- {
46
- "size" => "60x60",
47
- "idiom" => "iphone",
48
- "filename" => "icon60@2x.png",
49
- "scale" => "2x"
50
- },
51
- {
52
- "size" => "60x60",
53
- "idiom" => "iphone",
54
- "filename" => "icon60@3x.png",
55
- "scale" => "3x"
56
- },
57
- {
58
- "size" => "20x20",
59
- "idiom" => "ipad",
60
- "filename" => "icon20@1x.png",
61
- "scale" => "1x"
62
- },
63
- {
64
- "size" => "20x20",
65
- "idiom" => "ipad",
66
- "filename" => "icon20@2x.png",
67
- "scale" => "2x"
68
- },
69
- {
70
- "size" => "29x29",
71
- "idiom" => "ipad",
72
- "filename" => "icon29@1x.png",
73
- "scale" => "1x"
74
- },
75
- {
76
- "size" => "29x29",
77
- "idiom" => "ipad",
78
- "filename" => "icon29@2x.png",
79
- "scale" => "2x"
80
- },
81
- {
82
- "size" => "40x40",
83
- "idiom" => "ipad",
84
- "filename" => "icon40@1x.png",
85
- "scale" => "1x"
86
- },
87
- {
88
- "size" => "40x40",
89
- "idiom" => "ipad",
90
- "filename" => "icon40@2x.png",
91
- "scale" => "2x"
92
- },
93
- {
94
- "size" => "76x76",
95
- "idiom" => "ipad",
96
- "filename" => "icon76@1x.png",
97
- "scale" => "1x"
98
- },
99
- {
100
- "size" => "76x76",
101
- "idiom" => "ipad",
102
- "filename" => "icon76@2x.png",
103
- "scale" => "2x"
104
- },
105
- {
106
- "size" => "83.5x83.5",
107
- "idiom" => "ipad",
108
- "filename" => "icon83_5@2x.png",
109
- "scale" => "2x"
110
- },
111
- {
112
- "size" => "1024x1024",
113
- "idiom" => "ios-marketing",
114
- "filename" => "icon1024@1x.png",
115
- "scale" => "1x"
6
+ model_data ={
7
+ "images" => [
8
+ {
9
+ "filename" => "icon1024@1x.png",
10
+ "idiom" => "universal",
11
+ "platform" => "ios",
12
+ "size" => "1024x1024"
13
+ }
14
+ ],
15
+ "info" => {
16
+ "author" => "xcode",
17
+ "version" => 1
18
+ }
116
19
  }
117
- ],
118
- "info" => {
119
- "version" => 1,
120
- "author" => "xcode"
121
- }
122
- }
123
20
  return model_data
21
+ # model_data ={
22
+ # "images" => [
23
+ # {
24
+ # "filename" => "icon0.png",
25
+ # "idiom" => "universal",
26
+ # "platform" => "ios",
27
+ # "size" => "1024x1024"
28
+ # },
29
+ # {
30
+ # "appearances" => [
31
+ # {
32
+ # "appearance" => "luminosity",
33
+ # "value" => "dark"
34
+ # }
35
+ # ],
36
+ # "idiom" => "universal",
37
+ # "platform" => "ios",
38
+ # "size" => "1024x1024"
39
+ # },
40
+ # {
41
+ # "appearances" => [
42
+ # {
43
+ # "appearance" => "luminosity",
44
+ # "value" => "tinted"
45
+ # }
46
+ # ],
47
+ # "idiom" => "universal",
48
+ # "platform" => "ios",
49
+ # "size" => "1024x1024"
50
+ # }
51
+ # ],
52
+ # "info" => {
53
+ # "author" => "xcode",
54
+ # "version" => 1
55
+ # }
56
+ # }
57
+ # return model_data
124
58
  end
59
+ # def self.xcode_ios_icon_json
60
+ # model_data = {
61
+ # "images" => [
62
+ # {
63
+ # "size" => "20x20",
64
+ # "idiom" => "iphone",
65
+ # "filename" => "icon20@2x.png",
66
+ # "scale" => "2x"
67
+ # },
68
+ # {
69
+ # "size" => "20x20",
70
+ # "idiom" => "iphone",
71
+ # "filename" => "icon20@3x.png",
72
+ # "scale" => "3x"
73
+ # },
74
+ # {
75
+ # "size" => "29x29",
76
+ # "idiom" => "iphone",
77
+ # "filename" => "icon29@2x.png",
78
+ # "scale" => "2x"
79
+ # },
80
+ # {
81
+ # "size" => "29x29",
82
+ # "idiom" => "iphone",
83
+ # "filename" => "icon29@3x.png",
84
+ # "scale" => "3x"
85
+ # },
86
+ # {
87
+ # "size" => "40x40",
88
+ # "idiom" => "iphone",
89
+ # "filename" => "icon40@2x.png",
90
+ # "scale" => "2x"
91
+ # },
92
+ # {
93
+ # "size" => "40x40",
94
+ # "idiom" => "iphone",
95
+ # "filename" => "icon40@3x.png",
96
+ # "scale" => "3x"
97
+ # },
98
+ # {
99
+ # "size" => "60x60",
100
+ # "idiom" => "iphone",
101
+ # "filename" => "icon60@2x.png",
102
+ # "scale" => "2x"
103
+ # },
104
+ # {
105
+ # "size" => "60x60",
106
+ # "idiom" => "iphone",
107
+ # "filename" => "icon60@3x.png",
108
+ # "scale" => "3x"
109
+ # },
110
+ # {
111
+ # "size" => "20x20",
112
+ # "idiom" => "ipad",
113
+ # "filename" => "icon20@1x.png",
114
+ # "scale" => "1x"
115
+ # },
116
+ # {
117
+ # "size" => "20x20",
118
+ # "idiom" => "ipad",
119
+ # "filename" => "icon20@2x.png",
120
+ # "scale" => "2x"
121
+ # },
122
+ # {
123
+ # "size" => "29x29",
124
+ # "idiom" => "ipad",
125
+ # "filename" => "icon29@1x.png",
126
+ # "scale" => "1x"
127
+ # },
128
+ # {
129
+ # "size" => "29x29",
130
+ # "idiom" => "ipad",
131
+ # "filename" => "icon29@2x.png",
132
+ # "scale" => "2x"
133
+ # },
134
+ # {
135
+ # "size" => "40x40",
136
+ # "idiom" => "ipad",
137
+ # "filename" => "icon40@1x.png",
138
+ # "scale" => "1x"
139
+ # },
140
+ # {
141
+ # "size" => "40x40",
142
+ # "idiom" => "ipad",
143
+ # "filename" => "icon40@2x.png",
144
+ # "scale" => "2x"
145
+ # },
146
+ # {
147
+ # "size" => "76x76",
148
+ # "idiom" => "ipad",
149
+ # "filename" => "icon76@1x.png",
150
+ # "scale" => "1x"
151
+ # },
152
+ # {
153
+ # "size" => "76x76",
154
+ # "idiom" => "ipad",
155
+ # "filename" => "icon76@2x.png",
156
+ # "scale" => "2x"
157
+ # },
158
+ # {
159
+ # "size" => "83.5x83.5",
160
+ # "idiom" => "ipad",
161
+ # "filename" => "icon83_5@2x.png",
162
+ # "scale" => "2x"
163
+ # },
164
+ # {
165
+ # "size" => "1024x1024",
166
+ # "idiom" => "ios-marketing",
167
+ # "filename" => "icon1024@1x.png",
168
+ # "scale" => "1x"
169
+ # }
170
+ # ],
171
+ # "info" => {
172
+ # "version" => 1,
173
+ # "author" => "xcode"
174
+ # }
175
+ # }
176
+ # return model_data
177
+ # end
125
178
 
126
179
  def self.xcode_ios_imessage_icon_json
127
180
  model_data = {