pindo 4.8.2 → 4.8.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 = {