pindo 4.6.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/pindo +35 -0
- data/lib/pindo/base/aeshelper.rb +31 -0
- data/lib/pindo/base/deviceinfo.rb +90 -0
- data/lib/pindo/base/executable.rb +224 -0
- data/lib/pindo/base/githelper.rb +489 -0
- data/lib/pindo/base/hashhelper.rb +134 -0
- data/lib/pindo/base/plaininformative.rb +15 -0
- data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
- data/lib/pindo/base/standarderror.rb +14 -0
- data/lib/pindo/client/applovinclient.rb +156 -0
- data/lib/pindo/client/aws3sclient.rb +183 -0
- data/lib/pindo/client/bossclient.rb +229 -0
- data/lib/pindo/client/bossconfigclient.rb +175 -0
- data/lib/pindo/client/giteeclient.rb +65 -0
- data/lib/pindo/client/httpclient.rb +40 -0
- data/lib/pindo/client/pgyerclient.rb +439 -0
- data/lib/pindo/client/tgateclient.rb +103 -0
- data/lib/pindo/command.rb +101 -0
- data/lib/pindo/config/pindoconfig.rb +439 -0
- data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
- data/lib/pindo/deploy/Fastfile +233 -0
- data/lib/pindo/deploy/build.rb +167 -0
- data/lib/pindo/deploy/bundleid.rb +245 -0
- data/lib/pindo/deploy/cert.rb +508 -0
- data/lib/pindo/deploy/check.rb +79 -0
- data/lib/pindo/deploy/configproj.rb +89 -0
- data/lib/pindo/deploy/confusecode.rb +248 -0
- data/lib/pindo/deploy/confuseproj.rb +112 -0
- data/lib/pindo/deploy/fabric.rb +58 -0
- data/lib/pindo/deploy/getitcinfo.rb +248 -0
- data/lib/pindo/deploy/iap.rb +796 -0
- data/lib/pindo/deploy/initconfig.rb +128 -0
- data/lib/pindo/deploy/itcapp.rb +147 -0
- data/lib/pindo/deploy/itcinfo.rb +369 -0
- data/lib/pindo/deploy/pem.rb +55 -0
- data/lib/pindo/deploy/pullconfig.rb +46 -0
- data/lib/pindo/deploy/pushconfig.rb +83 -0
- data/lib/pindo/deploy/quswark.rb +146 -0
- data/lib/pindo/deploy/quswauth.rb +67 -0
- data/lib/pindo/deploy/reportbug.rb +135 -0
- data/lib/pindo/deploy/resign.rb +338 -0
- data/lib/pindo/deploy/tag.rb +108 -0
- data/lib/pindo/deploy/updateconfig.rb +129 -0
- data/lib/pindo/deploy/uploadipa.rb +63 -0
- data/lib/pindo/deploy.rb +44 -0
- data/lib/pindo/dev/autobuild.rb +204 -0
- data/lib/pindo/dev/autoresign.rb +186 -0
- data/lib/pindo/dev/confusecode.rb +127 -0
- data/lib/pindo/dev/confuseproj.rb +111 -0
- data/lib/pindo/dev/createbuild.rb +159 -0
- data/lib/pindo/dev/debug.rb +141 -0
- data/lib/pindo/dev/pub.rb +171 -0
- data/lib/pindo/dev/renewcert.rb +142 -0
- data/lib/pindo/dev.rb +23 -0
- data/lib/pindo/env/dreamstudio.rb +53 -0
- data/lib/pindo/env/flutter.rb +59 -0
- data/lib/pindo/env/flutter.sh +116 -0
- data/lib/pindo/env/quarkenv.rb +58 -0
- data/lib/pindo/env/swarkenv.rb +62 -0
- data/lib/pindo/env/workhard.rb +56 -0
- data/lib/pindo/env.rb +17 -0
- data/lib/pindo/ipa/autoresign.rb +188 -0
- data/lib/pindo/ipa/import.rb +261 -0
- data/lib/pindo/ipa/output.rb +396 -0
- data/lib/pindo/ipa.rb +22 -0
- data/lib/pindo/lib/forcepush.rb +159 -0
- data/lib/pindo/lib/lint.rb +115 -0
- data/lib/pindo/lib/push.rb +143 -0
- data/lib/pindo/lib/update.rb +75 -0
- data/lib/pindo/lib.rb +18 -0
- data/lib/pindo/module/appselect.rb +200 -0
- data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
- data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
- data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
- data/lib/pindo/module/buildconfighelper.rb +13 -0
- data/lib/pindo/module/buildhelper.rb +76 -0
- data/lib/pindo/module/commonconfuseproj.rb +271 -0
- data/lib/pindo/module/config_project.sh +143 -0
- data/lib/pindo/module/configprojhelper.rb +631 -0
- data/lib/pindo/module/iap_tier.json +813 -0
- data/lib/pindo/module/icon_contents.json +116 -0
- data/lib/pindo/module/imessage_icon.json +91 -0
- data/lib/pindo/module/imgset_contents.json +21 -0
- data/lib/pindo/module/launchimg_contents.json +21 -0
- data/lib/pindo/module/pemcreate.rb +63 -0
- data/lib/pindo/module/pgyerhelper.rb +339 -0
- data/lib/pindo/module/xcodebuildpre.rb +258 -0
- data/lib/pindo/module/xcodehelper.rb +521 -0
- data/lib/pindo/options/appconfigoptions.rb +23 -0
- data/lib/pindo/options/deployoptions.rb +363 -0
- data/lib/pindo/pgyer/apptest.rb +104 -0
- data/lib/pindo/pgyer/comment.rb +95 -0
- data/lib/pindo/pgyer/download.rb +105 -0
- data/lib/pindo/pgyer/login.rb +61 -0
- data/lib/pindo/pgyer/upload.rb +234 -0
- data/lib/pindo/pgyer.rb +17 -0
- data/lib/pindo/repo/clone.rb +78 -0
- data/lib/pindo/repo/create.rb +55 -0
- data/lib/pindo/repo/login.rb +64 -0
- data/lib/pindo/repo/search.rb +60 -0
- data/lib/pindo/repo.rb +16 -0
- data/lib/pindo/setup.rb +60 -0
- data/lib/pindo/upgrade.rb +56 -0
- data/lib/pindo/utils/applovin.rb +213 -0
- data/lib/pindo/utils/boss.rb +209 -0
- data/lib/pindo/utils/clearcert.rb +60 -0
- data/lib/pindo/utils/device.rb +279 -0
- data/lib/pindo/utils/icon.rb +91 -0
- data/lib/pindo/utils/icon.sh +133 -0
- data/lib/pindo/utils/podindex.rb +56 -0
- data/lib/pindo/utils/podindex.sh +30 -0
- data/lib/pindo/utils/renewproj.rb +146 -0
- data/lib/pindo/utils/tgate.rb +159 -0
- data/lib/pindo/utils/xcassets.rb +46 -0
- data/lib/pindo/utils/xcassets.sh +88 -0
- data/lib/pindo/utils.rb +29 -0
- data/lib/pindo/version.rb +110 -0
- data/lib/pindo.rb +34 -0
- 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
|