pindo 4.6.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/bin/pindo +35 -0
  3. data/lib/pindo/base/aeshelper.rb +31 -0
  4. data/lib/pindo/base/deviceinfo.rb +90 -0
  5. data/lib/pindo/base/executable.rb +224 -0
  6. data/lib/pindo/base/githelper.rb +489 -0
  7. data/lib/pindo/base/hashhelper.rb +134 -0
  8. data/lib/pindo/base/plaininformative.rb +15 -0
  9. data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
  10. data/lib/pindo/base/standarderror.rb +14 -0
  11. data/lib/pindo/client/applovinclient.rb +156 -0
  12. data/lib/pindo/client/aws3sclient.rb +183 -0
  13. data/lib/pindo/client/bossclient.rb +229 -0
  14. data/lib/pindo/client/bossconfigclient.rb +175 -0
  15. data/lib/pindo/client/giteeclient.rb +65 -0
  16. data/lib/pindo/client/httpclient.rb +40 -0
  17. data/lib/pindo/client/pgyerclient.rb +439 -0
  18. data/lib/pindo/client/tgateclient.rb +103 -0
  19. data/lib/pindo/command.rb +101 -0
  20. data/lib/pindo/config/pindoconfig.rb +439 -0
  21. data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
  22. data/lib/pindo/deploy/Fastfile +233 -0
  23. data/lib/pindo/deploy/build.rb +167 -0
  24. data/lib/pindo/deploy/bundleid.rb +245 -0
  25. data/lib/pindo/deploy/cert.rb +508 -0
  26. data/lib/pindo/deploy/check.rb +79 -0
  27. data/lib/pindo/deploy/configproj.rb +89 -0
  28. data/lib/pindo/deploy/confusecode.rb +248 -0
  29. data/lib/pindo/deploy/confuseproj.rb +112 -0
  30. data/lib/pindo/deploy/fabric.rb +58 -0
  31. data/lib/pindo/deploy/getitcinfo.rb +248 -0
  32. data/lib/pindo/deploy/iap.rb +796 -0
  33. data/lib/pindo/deploy/initconfig.rb +128 -0
  34. data/lib/pindo/deploy/itcapp.rb +147 -0
  35. data/lib/pindo/deploy/itcinfo.rb +369 -0
  36. data/lib/pindo/deploy/pem.rb +55 -0
  37. data/lib/pindo/deploy/pullconfig.rb +46 -0
  38. data/lib/pindo/deploy/pushconfig.rb +83 -0
  39. data/lib/pindo/deploy/quswark.rb +146 -0
  40. data/lib/pindo/deploy/quswauth.rb +67 -0
  41. data/lib/pindo/deploy/reportbug.rb +135 -0
  42. data/lib/pindo/deploy/resign.rb +338 -0
  43. data/lib/pindo/deploy/tag.rb +108 -0
  44. data/lib/pindo/deploy/updateconfig.rb +129 -0
  45. data/lib/pindo/deploy/uploadipa.rb +63 -0
  46. data/lib/pindo/deploy.rb +44 -0
  47. data/lib/pindo/dev/autobuild.rb +204 -0
  48. data/lib/pindo/dev/autoresign.rb +186 -0
  49. data/lib/pindo/dev/confusecode.rb +127 -0
  50. data/lib/pindo/dev/confuseproj.rb +111 -0
  51. data/lib/pindo/dev/createbuild.rb +159 -0
  52. data/lib/pindo/dev/debug.rb +141 -0
  53. data/lib/pindo/dev/pub.rb +171 -0
  54. data/lib/pindo/dev/renewcert.rb +142 -0
  55. data/lib/pindo/dev.rb +23 -0
  56. data/lib/pindo/env/dreamstudio.rb +53 -0
  57. data/lib/pindo/env/flutter.rb +59 -0
  58. data/lib/pindo/env/flutter.sh +116 -0
  59. data/lib/pindo/env/quarkenv.rb +58 -0
  60. data/lib/pindo/env/swarkenv.rb +62 -0
  61. data/lib/pindo/env/workhard.rb +56 -0
  62. data/lib/pindo/env.rb +17 -0
  63. data/lib/pindo/ipa/autoresign.rb +188 -0
  64. data/lib/pindo/ipa/import.rb +261 -0
  65. data/lib/pindo/ipa/output.rb +396 -0
  66. data/lib/pindo/ipa.rb +22 -0
  67. data/lib/pindo/lib/forcepush.rb +159 -0
  68. data/lib/pindo/lib/lint.rb +115 -0
  69. data/lib/pindo/lib/push.rb +143 -0
  70. data/lib/pindo/lib/update.rb +75 -0
  71. data/lib/pindo/lib.rb +18 -0
  72. data/lib/pindo/module/appselect.rb +200 -0
  73. data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
  74. data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
  75. data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
  76. data/lib/pindo/module/buildconfighelper.rb +13 -0
  77. data/lib/pindo/module/buildhelper.rb +76 -0
  78. data/lib/pindo/module/commonconfuseproj.rb +271 -0
  79. data/lib/pindo/module/config_project.sh +143 -0
  80. data/lib/pindo/module/configprojhelper.rb +631 -0
  81. data/lib/pindo/module/iap_tier.json +813 -0
  82. data/lib/pindo/module/icon_contents.json +116 -0
  83. data/lib/pindo/module/imessage_icon.json +91 -0
  84. data/lib/pindo/module/imgset_contents.json +21 -0
  85. data/lib/pindo/module/launchimg_contents.json +21 -0
  86. data/lib/pindo/module/pemcreate.rb +63 -0
  87. data/lib/pindo/module/pgyerhelper.rb +339 -0
  88. data/lib/pindo/module/xcodebuildpre.rb +258 -0
  89. data/lib/pindo/module/xcodehelper.rb +521 -0
  90. data/lib/pindo/options/appconfigoptions.rb +23 -0
  91. data/lib/pindo/options/deployoptions.rb +363 -0
  92. data/lib/pindo/pgyer/apptest.rb +104 -0
  93. data/lib/pindo/pgyer/comment.rb +95 -0
  94. data/lib/pindo/pgyer/download.rb +105 -0
  95. data/lib/pindo/pgyer/login.rb +61 -0
  96. data/lib/pindo/pgyer/upload.rb +234 -0
  97. data/lib/pindo/pgyer.rb +17 -0
  98. data/lib/pindo/repo/clone.rb +78 -0
  99. data/lib/pindo/repo/create.rb +55 -0
  100. data/lib/pindo/repo/login.rb +64 -0
  101. data/lib/pindo/repo/search.rb +60 -0
  102. data/lib/pindo/repo.rb +16 -0
  103. data/lib/pindo/setup.rb +60 -0
  104. data/lib/pindo/upgrade.rb +56 -0
  105. data/lib/pindo/utils/applovin.rb +213 -0
  106. data/lib/pindo/utils/boss.rb +209 -0
  107. data/lib/pindo/utils/clearcert.rb +60 -0
  108. data/lib/pindo/utils/device.rb +279 -0
  109. data/lib/pindo/utils/icon.rb +91 -0
  110. data/lib/pindo/utils/icon.sh +133 -0
  111. data/lib/pindo/utils/podindex.rb +56 -0
  112. data/lib/pindo/utils/podindex.sh +30 -0
  113. data/lib/pindo/utils/renewproj.rb +146 -0
  114. data/lib/pindo/utils/tgate.rb +159 -0
  115. data/lib/pindo/utils/xcassets.rb +46 -0
  116. data/lib/pindo/utils/xcassets.sh +88 -0
  117. data/lib/pindo/utils.rb +29 -0
  118. data/lib/pindo/version.rb +110 -0
  119. data/lib/pindo.rb +34 -0
  120. metadata +364 -0
@@ -0,0 +1,128 @@
1
+ require 'fileutils'
2
+ require 'faraday'
3
+ require 'pindo/client/giteeclient'
4
+
5
+ module Pindo
6
+ class Command
7
+ class Deploy < Command
8
+
9
+ class Initconfig < Deploy
10
+
11
+ self.summary = '创建App配置仓库'
12
+
13
+ self.description = <<-DESC
14
+ 创建App配置仓库, 用法:pindo deploy pullconfig
15
+ DESC
16
+
17
+ self.arguments = [
18
+ CLAide::Argument.new('bundle id', true),
19
+ ]
20
+
21
+ def self.options
22
+ [
23
+ ['--test', 'use dev build mode']
24
+ ].concat(super)
25
+ end
26
+
27
+ def initialize(argv)
28
+ @bundle_id = argv.shift_argument
29
+ @test_flag = argv.flag?('test', false)
30
+ super
31
+ @additional_args = argv.remainder!
32
+ end
33
+
34
+ def validate!
35
+ super
36
+
37
+ if @bundle_id.nil?
38
+
39
+ say "需要输入仓库名称, 默认以bundle id作为仓库名称"
40
+
41
+ @bundle_id = ask('bundle id: ') || nil
42
+
43
+ end
44
+
45
+ help! '你需要输入一个仓库名称' if @bundle_id.nil? || @bundle_id.empty?
46
+
47
+ end
48
+
49
+ def run
50
+
51
+ @gitee_client = GiteeClient.new(access_token:pindo_single_config.gitee_api_key)
52
+
53
+ demo_dir = clong_buildconfig_repo(repo_name: pindo_single_config.demo_bundle_id)
54
+
55
+ public_type = 0
56
+ owner_org = pindo_single_config.build_deploy_org
57
+ repo_name = @bundle_id
58
+
59
+ if @test_flag
60
+ owner_org = pindo_single_config.build_test_org
61
+ public_type = 2
62
+ end
63
+
64
+ success = @gitee_client.gitee_create_repo(owner:owner_org, repo_name:repo_name, public_type:public_type)
65
+ if success
66
+
67
+ if @test_flag
68
+ modify_repo_setting(repo_name:repo_name, owner_org:owner_org)
69
+ end
70
+
71
+ app_config_dir = clong_buildconfig_repo(repo_name: repo_name)
72
+ system 'open ' + app_config_dir
73
+
74
+ if File.exist?(app_config_dir)
75
+ update_appconfig_repo(resDir:demo_dir, desDir:app_config_dir)
76
+ else
77
+ puts "Creaate app config repo error !!!"
78
+ end
79
+ else
80
+ app_config_dir = clong_buildconfig_repo(repo_name: repo_name)
81
+ system 'open ' + app_config_dir
82
+ end
83
+
84
+ end
85
+
86
+ def modify_repo_setting(repo_name:nil, owner_org:nil)
87
+ pindo_setting_dir = pindo_single_config.pindo_env_configdir
88
+ git_repo_file = pindo_single_config.git_base_url_fullname
89
+ git_repo_json = JSON.parse(File.read(git_repo_file))
90
+ git_repo_json = git_repo_json || {}
91
+ if git_repo_json
92
+ git_repo_json[repo_name] = owner_org
93
+ end
94
+ File.open(git_repo_file, "w") do |f|
95
+ f.write(JSON.pretty_generate(git_repo_json))
96
+ end
97
+ git_addpush_repo(path:pindo_setting_dir, message:"add #{repo_name}")
98
+ end
99
+
100
+ def update_appconfig_repo(resDir:nil, desDir:nil)
101
+ if File.exist?(resDir)
102
+
103
+ if File.exist?(File.join(resDir, "config.json"))
104
+ FileUtils.cp_r(File.join(resDir, "config.json"), desDir)
105
+ end
106
+
107
+ if File.exist?(File.join(resDir, "fastlane"))
108
+ FileUtils.cp_r(File.join(resDir, "fastlane"), desDir)
109
+ end
110
+
111
+ if File.exist?(File.join(resDir, "launch"))
112
+ FileUtils.cp_r(File.join(resDir, "launch"), desDir)
113
+ end
114
+
115
+ text = File.read(File.join(desDir, "config.json"))
116
+ new_contents = text.gsub(/#{pindo_single_config.demo_bundle_id}/, "#{@bundle_id}")
117
+ File.open(File.join(desDir, "config.json"), "w") {|file| file.puts new_contents }
118
+
119
+ git_addpush_repo(path:desDir, message:"init app config")
120
+
121
+ end
122
+ end
123
+
124
+ end
125
+ end
126
+ end
127
+ end
128
+
@@ -0,0 +1,147 @@
1
+ require 'pindo/deploy/bundleid'
2
+
3
+ module Pindo
4
+ class Command
5
+ class Deploy < Command
6
+ class Itcapp < Deploy
7
+
8
+ include Command::DeployOptions
9
+
10
+ self.summary = '在AppStore中创建App'
11
+
12
+ self.description = <<-DESC
13
+ 在AppStore中创建App
14
+ DESC
15
+
16
+ self.arguments = [
17
+ CLAide::Argument.new('path/to/config.json', true),
18
+ ]
19
+
20
+ def self.options
21
+ [
22
+ ['--num', 'itc num version'],
23
+ ['--com', 'itc num version'],
24
+ ].concat(super)
25
+ end
26
+
27
+ def initialize(argv)
28
+ @app_version = argv.option('num')
29
+ @com_name = argv.option('com')
30
+ puts "@app_version = #{@app_version}"
31
+ super
32
+ end
33
+
34
+
35
+ def run
36
+
37
+ Spaceship::Portal.login(@apple_id.to_s)
38
+ Spaceship::Portal.select_team
39
+ app = Spaceship::Portal.app.find(@bundle_id)
40
+ if app.nil?
41
+ Bundleid::run([@args_appconfig])
42
+ sleep(2)
43
+ end
44
+ puts "Create app in itc ..."
45
+ puts @apple_id
46
+ puts "Login #{@apple_id}..."
47
+ Spaceship::Tunes.login(@apple_id.to_s)
48
+ Spaceship::Tunes.select_team
49
+
50
+ create_itcapp(temp_bundle_id:@bundle_id)
51
+ modify_appconfig_appleid(temp_bundle_id:@bundle_id)
52
+
53
+ end
54
+
55
+ def modify_appconfig_appleid(temp_bundle_id:nil)
56
+
57
+ app = Spaceship::ConnectAPI::App.find(temp_bundle_id)
58
+ unless app.nil?
59
+ puts
60
+ puts " app.id : #{app.id} +++++++++",
61
+ puts
62
+ modify_appconfig_file(app_config_file:@args_appconfig_fullname, app_info_detail:app)
63
+ app_config_dir = clong_buildconfig_repo(repo_name: @deploy_repo_name)
64
+ app_config_file = File.join(app_config_dir, "config.json")
65
+ modify_appconfig_file(app_config_file:app_config_file, app_info_detail:app)
66
+ prepare_gitenv()
67
+ git_addpush_repo(path:app_config_dir, message:"modify apple id ")
68
+ end
69
+
70
+ end
71
+
72
+ def modify_appconfig_file(app_config_file:nil, app_info_detail:nil)
73
+ config_content=JSON.parse(File.read(app_config_file))
74
+ File.open(app_config_file, "w") do |f|
75
+ config_content['app_info']['app_id_ios'] = app_info_detail.id
76
+ if config_content['app_setting']["apple_app_id"]
77
+ config_content['app_setting']["apple_app_id"] = app_info_detail.id
78
+ end
79
+
80
+ if config_content['app_setting']["kGUKeyAppId"]
81
+ config_content['app_setting']["kGUKeyAppId"] = app_info_detail.id
82
+ end
83
+
84
+ f.write(JSON.pretty_generate(config_content))
85
+ end
86
+
87
+ end
88
+
89
+ def create_itcapp(temp_bundle_id:nil)
90
+
91
+ temp_version = "1.0.0"
92
+ if @config_json && @config_json["app_info"] && @config_json["app_info"]["app_version"]
93
+ temp_version = @config_json["app_info"]["app_version"]
94
+ end
95
+
96
+ if @com_name.nil? && @config_json.nil? && @config_json["account_info"] && @config_json["app_info"]["acount_company_name"]
97
+ @com_name = @config_json["account_info"]["acount_company_name"].strip
98
+ end
99
+
100
+ app = nil
101
+ if !temp_bundle_id.nil?
102
+ app = Spaceship::ConnectAPI::App.find(temp_bundle_id)
103
+ if app == nil
104
+ app_sku_id_fixed = temp_bundle_id + ".sku"
105
+ puts "App的默认sku id 为: #{app_sku_id_fixed}"
106
+ input_skuid = ask("请自定义输入App Sku ID: ") || nil
107
+ if !input_skuid.nil? && input_skuid.length > 1
108
+ app_sku_id_fixed = input_skuid
109
+ end
110
+
111
+ if @com_name.nil?
112
+ @com_name = ask('Company Name : ') || nil
113
+ end
114
+ puts "App Sku ID : #{app_sku_id_fixed}"
115
+ puts "Company Name : #{@com_name}"
116
+ answer = agree("请确认上面信息是否正确(Y/n):")
117
+ unless answer
118
+ raise Informative, "重新创建 !!!"
119
+ end
120
+ app_default_name = temp_bundle_id.gsub('.', '')
121
+ if app_default_name.length > 30
122
+ app_default_name.slice!(30)
123
+ end
124
+ app = Spaceship::ConnectAPI::App.create(name: app_default_name,
125
+ version_string: temp_version, # initial version
126
+ sku: app_sku_id_fixed,
127
+ primary_locale: "en-US",
128
+ bundle_id: temp_bundle_id,
129
+ platforms: ["IOS"],
130
+ company_name:@com_name
131
+ )
132
+ puts "App is created !!!"
133
+ else
134
+ puts "App is already exist !!!"
135
+ end
136
+
137
+ end
138
+ return app
139
+ end
140
+
141
+
142
+
143
+ end
144
+ end
145
+ end
146
+ end
147
+
@@ -0,0 +1,369 @@
1
+ require 'highline/import'
2
+ require 'xcodeproj'
3
+ require 'find'
4
+ require 'fileutils'
5
+ require "fastimage"
6
+ require 'deliver'
7
+
8
+
9
+ module Pindo
10
+ class Command
11
+ class Deploy < Command
12
+ class Itcinfo < Deploy
13
+
14
+ include Command::DeployOptions
15
+
16
+ include Xcodebuildpre
17
+ include AppstoreMetadataConnectApiHelper
18
+
19
+
20
+ self.summary = '更新AppStore中的App信息'
21
+
22
+ self.description = <<-DESC
23
+ 更新AppStore中的App信息
24
+ DESC
25
+
26
+ self.arguments = [
27
+ CLAide::Argument.new('path/to/config.json', true),
28
+ ]
29
+
30
+ def self.options
31
+ [
32
+ ['--metadata', 'Upload metadata to iTunes Connect.'],
33
+ ['--screenshots', 'Upload screenshots to iTunes Connect.'],
34
+ ['--overwrite', 'overwrite screenshots to iTunes Connect.'],
35
+ ['--sync', 'sync screenshots to iTunes Connect.'],
36
+
37
+ ['--ipa', 'Upload ipa to iTunes Connect.'],
38
+ ].concat(super)
39
+ end
40
+
41
+ def initialize(argv)
42
+
43
+ @upload_metadata_flag = argv.flag?('metadata', false)
44
+ @upload_screenshots_flag = argv.flag?('screenshots', false)
45
+
46
+ @overwrite_flag = argv.flag?('overwrite', false)
47
+ @sync_flag = argv.flag?('sync', false)
48
+
49
+ @upload_ipa_flag = argv.flag?('ipa', false)
50
+
51
+ super
52
+ end
53
+
54
+
55
+ def run
56
+ current_project_dir = Dir.pwd
57
+
58
+ pindo_dir = File::expand_path(pindo_single_config.pindo_dir)
59
+ @app_config_dir = File.join(pindo_dir, @deploy_repo_name)
60
+
61
+ # @app_config_dir = clong_buildconfig_repo(repo_name: @deploy_repo_name)
62
+
63
+ print_info(project_dir:current_project_dir, apple_id:@apple_id, bundle_id:@bundle_id, config_json:@config_json)
64
+
65
+ if @upload_metadata_flag
66
+ process_itunes_metadata()
67
+ fastlane_login(apple_id:@apple_id)
68
+ fastlane_upload_metadata(temp_bundle_id:@bundle_id)
69
+ end
70
+
71
+ if @upload_screenshots_flag
72
+ app_screenshots_dir = File.join(@app_config_dir, "fastlane/screenshots")
73
+
74
+ fastlane_process_screenshots(app_screenshots_dir:app_screenshots_dir)
75
+
76
+ fastlane_login(apple_id:@apple_id)
77
+ fastlane_upload_screenshots(apple_id:@apple_id, bundle_id:@bundle_id, app_screenshots_dir:app_screenshots_dir)
78
+ end
79
+
80
+ if @upload_ipa_flag
81
+ # prepare_screenshots(project_dir:current_project_dir, apple_id:@apple_id, bundle_id:@bundle_id, config_json:@config_json)
82
+ command = "fastlane uploadipa"
83
+ puts "Upload Ipa ..."
84
+ system command
85
+ end
86
+
87
+ puts "Done !!!"
88
+ end
89
+
90
+ def process_itunes_metadata( )
91
+ app_itunes_dir = File.join(@app_config_dir, "fastlane")
92
+ app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
93
+ app_itunes_json = JSON.parse(File.read(app_itunes_file))
94
+
95
+
96
+
97
+
98
+ app_itunes_json = app_itunes_json || {}
99
+
100
+
101
+
102
+ app_itunes_json["app_info"] = app_itunes_json["app_info"] || {}
103
+ app_itunes_json["app_info"]["app_info_localization"] = app_itunes_json["app_info"]["app_info_localization"] || {}
104
+
105
+
106
+ if !app_itunes_json["app_info"]["app_info_localization"].nil?
107
+ app_itunes_json["app_info"]["app_info_localization"].each do |lang , app_info_localization|
108
+ check_app_info_localization(lang:lang, localization_json:app_info_localization)
109
+ end
110
+ end
111
+
112
+ app_itunes_json["app_edit_version_info"] = app_itunes_json["app_edit_version_info"] || {}
113
+ app_itunes_json["app_edit_version_info"].each do |platform, value|
114
+
115
+ platform_metadata_path = File.join(app_itunes_dir, platform.downcase)
116
+ if !File.exist?(platform_metadata_path)
117
+ FileUtils.mkdir_p(platform_metadata_path)
118
+ end
119
+
120
+ app_itunes_json["app_edit_version_info"][platform] = app_itunes_json["app_edit_version_info"][platform] || {}
121
+ app_itunes_json["app_edit_version_info"][platform]["app_review_info"] = app_itunes_json["app_edit_version_info"][platform]["app_review_info"] || {}
122
+
123
+ app_version = @config_json['app_info']['app_version']
124
+ app_itunes_json["app_edit_version_info"][platform]["version_string"] = app_version
125
+ app_itunes_json["app_edit_version_info"][platform]["app_review_info"] = app_itunes_json["app_edit_version_info"][platform]["app_review_info"] || {}
126
+ app_itunes_json["app_edit_version_info"][platform]["app_review_info"]["contact_email"] = @config_json['account_info']['apple_acount_id']
127
+
128
+ app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"] || {}
129
+ app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"]["en-US"] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"]["en-US"] || {}
130
+
131
+
132
+ notes_file = File.join(platform_metadata_path, "review_notes.txt")
133
+ if File.exist?(notes_file)
134
+ notes_file_txt = File.read(notes_file)
135
+ app_itunes_json["app_edit_version_info"][platform]["app_review_info"]["notes"] = notes_file_txt.to_s.strip
136
+ end
137
+
138
+
139
+ if !app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].nil?
140
+ app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].each do |lang , value|
141
+
142
+ app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang] || {}
143
+
144
+ lang_metadata_path = File.join(platform_metadata_path, lang)
145
+ if !File.exist?(lang_metadata_path)
146
+ FileUtils.mkdir_p(lang_metadata_path)
147
+ end
148
+
149
+ read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"description")
150
+ read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"keywords")
151
+ read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"support_url")
152
+ read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"marketing_url")
153
+ read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"promotional_text")
154
+ read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"whats_new")
155
+ end
156
+ end
157
+
158
+ end
159
+
160
+
161
+ #platforms = ["IOS", "MAC_OS", "TV_OS"]
162
+
163
+ # Dir.foreach(app_itunes_dir) do |file|
164
+ # if File::directory?(File.join(app_itunes_dir, file)) && platforms.include?(file)
165
+ # end
166
+ # end
167
+
168
+ File.open(app_itunes_file, "w") do |file|
169
+ file.write(JSON.pretty_generate(app_itunes_json))
170
+ file.close
171
+ end
172
+
173
+ end
174
+
175
+
176
+
177
+ def check_app_info_localization(lang:nil, localization_json:nil)
178
+ if !localization_json.nil?
179
+
180
+ localization_json.each do |key, value|
181
+
182
+ if !value.nil? && value.to_s.length > 0
183
+ localization_json[key] = value.to_s.strip
184
+ end
185
+
186
+ if ( key.eql?("name") || key.eql?("subtitle") ) && !localization_json[key].nil? && localization_json[key].length > 30 && localization_json[key].length <2
187
+ puts
188
+ puts
189
+ puts localization_json[key]
190
+ puts "长度: #{localization_json[key].length}"
191
+ raise Informative, "#{lang} : #{key} 超出限定的30个字符 !!!"
192
+ end
193
+ end
194
+ end
195
+
196
+ end
197
+
198
+
199
+ def read_app_version_info_localization(lang:nil, localization_json:nil, lang_metadata_path:nil, key_name:nil)
200
+
201
+ # puts "lang_metadata_path : #{lang_metadata_path}"
202
+
203
+ key_name_file = File.join(lang_metadata_path, key_name + ".txt")
204
+ if File.exist?(key_name_file)
205
+ localization_json = localization_json || {}
206
+ key_name_txt = File.read(key_name_file)
207
+ # puts "key_name : #{key_name}"
208
+ # puts "key_name_txt : #{key_name_txt}"
209
+ localization_json[key_name] = key_name_txt.to_s.strip
210
+ if key_name.eql?("keywords") && !localization_json[key_name].nil? && localization_json[key_name].length > 100
211
+ puts localization_json[key_name]
212
+ puts "长度: #{localization_json[key_name].length}"
213
+
214
+ raise Informative, "#{lang} : keywords 超出限定的100个字符 !!!"
215
+ end
216
+
217
+ if key_name.eql?("description") && !localization_json[key_name].nil? && localization_json[key_name].length > 4000
218
+ puts localization_json[key_name]
219
+ puts "长度: #{localization_json[key_name].length}"
220
+ raise Informative, "#{lang} : description 超出限定的4000个字符 !!!"
221
+ end
222
+ # puts localization_json
223
+ end
224
+ end
225
+
226
+
227
+ def fastlane_upload_metadata(temp_bundle_id:nil)
228
+
229
+ app_itunes_dir = File.join(@app_config_dir, "fastlane")
230
+ app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
231
+ app_itunes_json = JSON.parse(File.read(app_itunes_file))
232
+
233
+ app = Spaceship::ConnectAPI::App.find(temp_bundle_id)
234
+
235
+ fastlane_update_app_metadata(app: app, app_itunes_json:app_itunes_json)
236
+
237
+ if !app_itunes_json["app_info"].nil?
238
+ fastlane_update_app_info_metadata(app: app, app_itunes_json:app_itunes_json)
239
+ end
240
+
241
+ if !app_itunes_json["app_edit_version_info"].nil?
242
+ app_itunes_json["app_edit_version_info"].each do |platform, platform_info_data|
243
+ puts
244
+ puts
245
+ puts "===========正在处理平台: #{platform}"
246
+ app_edit_version_info = app.get_edit_app_store_version(platform: platform)
247
+
248
+ if !app_edit_version_info.nil? && !app_itunes_json["app_edit_version_info"].nil? && !app_itunes_json["app_edit_version_info"][platform].nil?
249
+
250
+ fastlane_update_app_version_info_metadata(app: app, platform:platform, app_itunes_json:app_itunes_json)
251
+ end
252
+
253
+ end
254
+ end
255
+
256
+
257
+ fastlane_update_app_info_localizations(app: app, app_itunes_json:app_itunes_json)
258
+
259
+
260
+ end
261
+
262
+
263
+ def print_info(project_dir:nil, apple_id:nil, bundle_id:nil, config_json:nil)
264
+
265
+ pindo_dir = File::expand_path(pindo_single_config.pindo_dir)
266
+ config_repo_dir = File.join(pindo_dir, bundle_id)
267
+ apple_id = @config_json['app_info']['app_id_ios']
268
+
269
+ puts
270
+ puts "++++++ App Store Download Url: ++++++"
271
+ puts ""
272
+ puts ""
273
+ puts ""
274
+ puts "下载链接: " + "https://itunes.apple.com/us/app/id" + "#{apple_id}"
275
+ puts ""
276
+
277
+ puts "版本: " + @config_json['app_info']['app_version']
278
+ puts ""
279
+
280
+ if @config_json['app_setting']['app_platform']
281
+ puts "平台号: " + @config_json['app_setting']['app_platform']
282
+ end
283
+ puts
284
+ puts "Bundle Id: " + @config_json['app_info']['app_identifier']
285
+ puts
286
+
287
+ end
288
+
289
+
290
+
291
+ def fastlane_process_screenshots(app_screenshots_dir:nil)
292
+
293
+ if File.exist?(app_screenshots_dir)
294
+ platforms = ["IOS", "MAC_OS", "TV_OS", "XR_OS"]
295
+ platforms.each do | platform|
296
+ platform_screenshots_path = File.join(app_screenshots_dir, platform.downcase)
297
+ if File.exist?(platform_screenshots_path)
298
+ Dir.glob(File.join(platform_screenshots_path, "*")).each do |lang_screenshots_path|
299
+ if File.directory?(lang_screenshots_path) && ![".", "..","iMessage", "imessage"].include?(File.basename(lang_screenshots_path))
300
+ fastlane_process_lang_screenshots(lang_screenshots_path:lang_screenshots_path)
301
+ elsif File.directory?(lang_screenshots_path) && ["iMessage", "imessage", "IMESSAGE"].include?(File.basename(lang_screenshots_path))
302
+ imessage_screenshots_path = lang_screenshots_path
303
+ Dir.glob(File.join(imessage_screenshots_path, "*")).each do |imessage_lane_screenshots_path|
304
+ if File.directory?(lang_screenshots_path) && ![".", ".."].include?(File.basename(imessage_lane_screenshots_path))
305
+ fastlane_process_lang_screenshots(lang_screenshots_path:imessage_lane_screenshots_path)
306
+ end
307
+ end
308
+ end
309
+
310
+ end
311
+ end
312
+
313
+ end
314
+ end
315
+
316
+ end
317
+
318
+
319
+ def fastlane_upload_screenshots(apple_id:nil, bundle_id:nil, app_screenshots_dir:nil)
320
+
321
+ if !File.exist?(app_screenshots_dir)
322
+ return
323
+ end
324
+
325
+ platform_screenshots_path = File.join(app_screenshots_dir, "ios")
326
+
327
+ if !File.exist?(platform_screenshots_path)
328
+ puts "!!! Screenshots Path is not exist !!!"
329
+ return
330
+ end
331
+
332
+ app_metadata_dir = File.join(@app_config_dir, "fastlane")
333
+ app_metadata_path = File.join(app_metadata_dir, "ios")
334
+
335
+
336
+ if @overwrite_flag
337
+ @sync_flag = false
338
+ end
339
+
340
+
341
+ if @sync_flag
342
+ @overwrite_flag = false
343
+ end
344
+
345
+
346
+ values = {
347
+ username:apple_id,
348
+ app_identifier: bundle_id,
349
+ skip_metadata: true,
350
+ skip_binary_upload:true,
351
+ skip_app_version_update:true,
352
+ precheck_include_in_app_purchases:false,
353
+ metadata_path:app_metadata_dir,
354
+ screenshots_path:platform_screenshots_path,
355
+ overwrite_screenshots: @overwrite_flag,
356
+ ignore_language_directory_validation:true,
357
+ sync_screenshots: @sync_flag
358
+ }
359
+
360
+ config = FastlaneCore::Configuration.create(Deliver::Options.available_options, values)
361
+ Deliver::Runner.new(config).run
362
+
363
+
364
+ end
365
+
366
+ end
367
+ end
368
+ end
369
+ end