pindo 4.6.9

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.
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