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,116 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "size" : "20x20",
5
+ "idiom" : "iphone",
6
+ "filename" : "icon20@2x.png",
7
+ "scale" : "2x"
8
+ },
9
+ {
10
+ "size" : "20x20",
11
+ "idiom" : "iphone",
12
+ "filename" : "icon20@3x.png",
13
+ "scale" : "3x"
14
+ },
15
+ {
16
+ "size" : "29x29",
17
+ "idiom" : "iphone",
18
+ "filename" : "icon29@2x.png",
19
+ "scale" : "2x"
20
+ },
21
+ {
22
+ "size" : "29x29",
23
+ "idiom" : "iphone",
24
+ "filename" : "icon29@3x.png",
25
+ "scale" : "3x"
26
+ },
27
+ {
28
+ "size" : "40x40",
29
+ "idiom" : "iphone",
30
+ "filename" : "icon40@2x.png",
31
+ "scale" : "2x"
32
+ },
33
+ {
34
+ "size" : "40x40",
35
+ "idiom" : "iphone",
36
+ "filename" : "icon40@3x.png",
37
+ "scale" : "3x"
38
+ },
39
+ {
40
+ "size" : "60x60",
41
+ "idiom" : "iphone",
42
+ "filename" : "icon60@2x.png",
43
+ "scale" : "2x"
44
+ },
45
+ {
46
+ "size" : "60x60",
47
+ "idiom" : "iphone",
48
+ "filename" : "icon60@3x.png",
49
+ "scale" : "3x"
50
+ },
51
+ {
52
+ "size" : "20x20",
53
+ "idiom" : "ipad",
54
+ "filename" : "icon20@1x.png",
55
+ "scale" : "1x"
56
+ },
57
+ {
58
+ "size" : "20x20",
59
+ "idiom" : "ipad",
60
+ "filename" : "icon20@2x.png",
61
+ "scale" : "2x"
62
+ },
63
+ {
64
+ "size" : "29x29",
65
+ "idiom" : "ipad",
66
+ "filename" : "icon29@1x.png",
67
+ "scale" : "1x"
68
+ },
69
+ {
70
+ "size" : "29x29",
71
+ "idiom" : "ipad",
72
+ "filename" : "icon29@2x.png",
73
+ "scale" : "2x"
74
+ },
75
+ {
76
+ "size" : "40x40",
77
+ "idiom" : "ipad",
78
+ "filename" : "icon40@1x.png",
79
+ "scale" : "1x"
80
+ },
81
+ {
82
+ "size" : "40x40",
83
+ "idiom" : "ipad",
84
+ "filename" : "icon40@2x.png",
85
+ "scale" : "2x"
86
+ },
87
+ {
88
+ "size" : "76x76",
89
+ "idiom" : "ipad",
90
+ "filename" : "icon76@1x.png",
91
+ "scale" : "1x"
92
+ },
93
+ {
94
+ "size" : "76x76",
95
+ "idiom" : "ipad",
96
+ "filename" : "icon76@2x.png",
97
+ "scale" : "2x"
98
+ },
99
+ {
100
+ "size" : "83.5x83.5",
101
+ "idiom" : "ipad",
102
+ "filename" : "icon83_5@2x.png",
103
+ "scale" : "2x"
104
+ },
105
+ {
106
+ "size" : "1024x1024",
107
+ "idiom" : "ios-marketing",
108
+ "filename" : "icon1024@1x.png",
109
+ "scale" : "1x"
110
+ }
111
+ ],
112
+ "info" : {
113
+ "version" : 1,
114
+ "author" : "xcode"
115
+ }
116
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "size" : "29x29",
5
+ "idiom" : "iphone",
6
+ "filename" : "icon29@2x.png",
7
+ "scale" : "2x"
8
+ },
9
+ {
10
+ "size" : "29x29",
11
+ "idiom" : "iphone",
12
+ "filename" : "icon29@3x.png",
13
+ "scale" : "3x"
14
+ },
15
+ {
16
+ "size" : "60x45",
17
+ "idiom" : "iphone",
18
+ "filename" : "icon60_45@2x.png",
19
+ "scale" : "2x"
20
+ },
21
+ {
22
+ "size" : "60x45",
23
+ "idiom" : "iphone",
24
+ "filename" : "icon60_45@3x.png",
25
+ "scale" : "3x"
26
+ },
27
+ {
28
+ "size" : "29x29",
29
+ "idiom" : "ipad",
30
+ "filename" : "icon29@2x.png",
31
+ "scale" : "2x"
32
+ },
33
+ {
34
+ "size" : "67x50",
35
+ "idiom" : "ipad",
36
+ "filename" : "icon67_50@2x.png",
37
+ "scale" : "2x"
38
+ },
39
+ {
40
+ "size" : "74x55",
41
+ "idiom" : "ipad",
42
+ "filename" : "icon74_55@2x.png",
43
+ "scale" : "2x"
44
+ },
45
+ {
46
+ "size" : "1024x1024",
47
+ "idiom" : "ios-marketing",
48
+ "filename" : "icon1024@1x.png",
49
+ "scale" : "1x"
50
+ },
51
+ {
52
+ "size" : "27x20",
53
+ "idiom" : "universal",
54
+ "filename" : "icon27_20@2x.png",
55
+ "scale" : "2x",
56
+ "platform" : "ios"
57
+ },
58
+ {
59
+ "size" : "27x20",
60
+ "idiom" : "universal",
61
+ "filename" : "icon27_20@3x.png",
62
+ "scale" : "3x",
63
+ "platform" : "ios"
64
+ },
65
+ {
66
+ "size" : "32x24",
67
+ "idiom" : "universal",
68
+ "filename" : "icon32_24@2x.png",
69
+ "scale" : "2x",
70
+ "platform" : "ios"
71
+ },
72
+ {
73
+ "size" : "32x24",
74
+ "idiom" : "universal",
75
+ "filename" : "icon32_24@3x.png",
76
+ "scale" : "3x",
77
+ "platform" : "ios"
78
+ },
79
+ {
80
+ "size" : "1024x768",
81
+ "idiom" : "ios-marketing",
82
+ "filename" : "icon1024_768@1x.png",
83
+ "scale" : "1x",
84
+ "platform" : "ios"
85
+ }
86
+ ],
87
+ "info" : {
88
+ "version" : 1,
89
+ "author" : "xcode"
90
+ }
91
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "images": [
3
+ {
4
+ "idiom": "universal",
5
+ "scale": "1x"
6
+ },
7
+ {
8
+ "idiom": "universal",
9
+ "filename": "w768_h1024@2x.png",
10
+ "scale": "2x"
11
+ },
12
+ {
13
+ "idiom": "universal",
14
+ "scale": "3x"
15
+ }
16
+ ],
17
+ "info": {
18
+ "version": 1,
19
+ "author": "xcode"
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "images": [
3
+ {
4
+ "idiom": "universal",
5
+ "scale": "1x"
6
+ },
7
+ {
8
+ "idiom": "universal",
9
+ "filename": "w768_h1024@2x.png",
10
+ "scale": "2x"
11
+ },
12
+ {
13
+ "idiom": "universal",
14
+ "scale": "3x"
15
+ }
16
+ ],
17
+ "info": {
18
+ "version": 1,
19
+ "author": "xcode"
20
+ }
21
+ }
@@ -0,0 +1,63 @@
1
+
2
+ module Pindo
3
+ module Pemcreate
4
+ def create_certificate(bundle_id:nil, type:"prod", output_path:"")
5
+
6
+ if bundle_id.empty? || output_path.empty?
7
+ UI.user_error!("bundle id is nil or output_path is nil.")
8
+ end
9
+
10
+ puts "Creating a new push certificate for app '#{bundle_id}'. "
11
+
12
+ csr, pkey = Spaceship::Portal.certificate.create_certificate_signing_request
13
+
14
+ cert = nil
15
+ begin
16
+ if type == "dev"
17
+ cert = Spaceship::Portal.certificate.development_push.create!(csr: csr, bundle_id: bundle_id)
18
+ else
19
+ cert = Spaceship::Portal.certificate.production_push.create!(csr: csr, bundle_id: bundle_id)
20
+ end
21
+ rescue => ex
22
+ if ex.to_s.include?("You already have a current")
23
+ # That's the most common failure probably
24
+ raise Informative, "You already have 2 active push profiles for this application/environment. You'll need to revoke an old certificate to make room for a new one"
25
+ else
26
+ raise ex
27
+ end
28
+ end
29
+
30
+
31
+ x509_certificate = cert.download
32
+ certificate_type = (type == "dev" ? 'development' : 'production')
33
+
34
+ base_base = bundle_id.gsub('.', '_')
35
+ puts base_base
36
+ filename_base = base_base + '_' + type
37
+
38
+
39
+ private_key_path = File.join(output_path, "#{filename_base}.pkey")
40
+ File.write(private_key_path, pkey.to_pem)
41
+ puts "key: #{private_key_path}"
42
+
43
+
44
+ p12_cert_path = File.join(output_path, "#{filename_base}.p12")
45
+ p12 = OpenSSL::PKCS12.create('goodcert1', certificate_type, pkey, x509_certificate)
46
+ File.write(p12_cert_path, p12.to_der)
47
+ puts "p12 : #{p12_cert_path}"
48
+
49
+
50
+ x509_cert_path = File.join(output_path, "#{filename_base}.pem")
51
+ File.write(x509_cert_path, x509_certificate.to_pem + pkey.to_pem)
52
+ puts "pem : #{x509_cert_path}"
53
+
54
+ return x509_cert_path
55
+ end
56
+
57
+ def login(apple_id:nil)
58
+ puts apple_id
59
+ Spaceship::Portal.login(apple_id.to_s)
60
+ Spaceship::Portal.select_team
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,339 @@
1
+
2
+ require 'highline/import'
3
+ require 'fileutils'
4
+ require 'json'
5
+ require 'faraday'
6
+ require "rqrcode"
7
+ require 'pindo/client/pgyerclient'
8
+ require 'pindo/client/aws3sclient'
9
+
10
+
11
+ module Pindo
12
+
13
+ class PgyerHelper
14
+
15
+ class << self
16
+ attr_writer :instance
17
+ end
18
+
19
+ def self.share_instace
20
+ @instance ||= new
21
+ end
22
+
23
+ def get_user_local_wechat_url( )
24
+
25
+ wechat_msg_url = nil
26
+ wechat_msg_url = PindoUserLocalConfig.instance.read_local_wechat_url
27
+ if !wechat_msg_url.nil? && wechat_msg_url.length > 1
28
+ else
29
+
30
+ wechat_msg_url = ask('请输入Wechat Url:')
31
+ if !wechat_msg_url.nil? && wechat_msg_url.length > 1
32
+ PindoUserLocalConfig.instance.write_local_wechat_url(wechat_msg_url:wechat_msg_url)
33
+ end
34
+
35
+ end
36
+ wechat_msg_url
37
+ end
38
+
39
+
40
+ def send_apptest_wechat_msg(msg_data:nil)
41
+
42
+ wechat_msg_url = get_user_local_wechat_url()
43
+
44
+ if !wechat_msg_url.nil? && wechat_msg_url.length >1
45
+
46
+ else
47
+ puts "企业微信Wechat Url无效"
48
+ end
49
+
50
+ begin
51
+
52
+ download_url = msg_data[:download_url]
53
+ app_name = msg_data[:app_name]
54
+ download_password = msg_data[:download_password]
55
+ bundle_id = msg_data[:bundle_id]
56
+ app_version = msg_data[:app_version]
57
+ index_num = msg_data[:index_num]
58
+ upload_time = msg_data[:time]
59
+ description = msg_data[:description]
60
+ msg_from = msg_data[:msg_from]
61
+
62
+
63
+ # current_dir = current_dir = Dir.pwd
64
+ # output_file = File.join(current_dir, app_name + "_qrcode.png")
65
+ qrcode = RQRCode::QRCode.new(download_url)
66
+
67
+ png = qrcode.as_png(
68
+ bit_depth: 1,
69
+ border_modules: 4,
70
+ color_mode: ChunkyPNG::COLOR_GRAYSCALE,
71
+ color: "black",
72
+ file: nil,
73
+ fill: "white",
74
+ module_px_size: 6,
75
+ resize_exactly_to: false,
76
+ resize_gte_to: false,
77
+ size: 300
78
+ )
79
+
80
+
81
+ checksum = Digest::MD5.hexdigest(png.to_s)
82
+ image_base64_data = Base64.strict_encode64(png.to_s)
83
+
84
+ body_data = {
85
+ msgtype:"image",
86
+ image:{
87
+ base64: image_base64_data,
88
+ md5:checksum
89
+ }
90
+ }
91
+
92
+ con = Faraday.new
93
+ res = con.post do |req|
94
+ req.url wechat_msg_url
95
+ req.headers['Content-Type'] = 'application/json'
96
+ req.body = body_data.to_json
97
+ end
98
+
99
+
100
+ body_data = {
101
+ msgtype:"text",
102
+ text:{
103
+ content: "#{app_name} 测试\r\r版本号: #{app_version} build:#{index_num}\r安装密码: #{download_password}\r上传时间: #{upload_time}\rBundle Id: #{bundle_id}\r链接:#{download_url}\r\n说明:\r\r#{description}\r\r消息发送来自: #{msg_from}"
104
+
105
+ }
106
+ }
107
+
108
+ con = Faraday.new
109
+ res = con.post do |req|
110
+ req.url wechat_msg_url
111
+ req.headers['Content-Type'] = 'application/json'
112
+ req.body = body_data.to_json
113
+ end
114
+ puts
115
+ puts "发送企业微信成功 !!!"
116
+ puts
117
+
118
+ rescue StandardError => e
119
+ puts
120
+ puts "发送企业微信失败 !!!"
121
+ puts
122
+ end
123
+
124
+ end
125
+
126
+ def print_app_version_info(msg_data:nil)
127
+
128
+ qrcode = RQRCode::QRCode.new(msg_data[:download_url])
129
+ svg = qrcode.as_ansi(
130
+ light: "\033[47m", dark: "\033[40m",
131
+ fill_character: " ",
132
+ quiet_zone_size: 1,
133
+ size: 300
134
+ )
135
+ puts "\r\n\r\n\r\n\r\n"
136
+ puts svg
137
+ puts
138
+ puts "#{msg_data[:app_name]} 测试"
139
+ puts "Bundle Id: #{msg_data[:bundle_id]}"
140
+ puts "版本号: #{msg_data[:app_version]} build: #{msg_data[:index_num]}"
141
+ puts "安装密码: #{msg_data[:download_password]}"
142
+ puts "上传时间: #{msg_data[:time]}"
143
+ puts "链接: #{msg_data[:download_url]}"
144
+ puts "说明: #{msg_data[:description]}"
145
+ puts "\r\n\r\n\r\n\r\n"
146
+
147
+ end
148
+
149
+ def find_app_info_with_obj_list(proj_name:nil)
150
+ if proj_name.nil?
151
+ return nil
152
+ end
153
+
154
+ key_proj_name = proj_name.downcase.strip.gsub(/[\s\-_]/, '')
155
+
156
+ app_info_list = Pindoconfig.instance.get_pgyerapps_info_list()
157
+ app_info_obj = app_info_list&.find do |app_info_item|
158
+ app_info_item_name = app_info_item["appName"].to_s.downcase.strip.gsub(/[\s\-_]/, '')
159
+ app_info_item_name.eql?(key_proj_name) && app_info_item["appType"].eql?("iOS")
160
+ end
161
+
162
+ app_info_obj
163
+ end
164
+
165
+ def get_app_version(client:nil, appId:nil, app_version_index:nil, latest_version:true)
166
+
167
+ version_data = client.get_app_version_list_req(appId:appId)
168
+
169
+ version_item_obj = nil
170
+ if latest_version
171
+ version_item_obj = version_data["data"].find{ |item| item["latest"]}
172
+ else
173
+ if !app_version_index.nil?
174
+ version_item_obj = version_data["data"].find{ |item| item["incId"].to_s.eql?(app_version_index.to_s)}
175
+ end
176
+ end
177
+
178
+ # puts JSON.pretty_generate(version_item_obj)
179
+
180
+ return version_item_obj
181
+ end
182
+
183
+ def get_app_list_in_pgyer(client:nil)
184
+
185
+ puts "正在向pgyer拉取app信息列表, 查找app信息..."
186
+ params = {
187
+ pageNo:1,
188
+ pageSize:1000
189
+ }
190
+
191
+ app_info_list = Pindoconfig.instance.get_pgyerapps_info_list()
192
+ if app_info_list.nil?
193
+ res_data = client.get_app_list_req(params:params)
194
+ # puts JSON.pretty_generate(res_data)
195
+ if !res_data["data"].nil? && res_data["data"].size > 0
196
+ app_info_list = res_data["data"]
197
+ Pindoconfig.instance.set_pgyerapps_info_list(app_info_list:app_info_list)
198
+ end
199
+ end
200
+
201
+ if app_info_list.nil?
202
+ res_data = client.get_app_list_req(params:params)
203
+ # puts JSON.pretty_generate(res_data)
204
+ if !res_data["data"].nil? && res_data["data"].size > 0
205
+ app_info_list = res_data["data"]
206
+ Pindoconfig.instance.set_pgyerapps_info_list(app_info_list:app_info_list)
207
+ end
208
+ end
209
+
210
+ if app_info_list.nil?
211
+ raise Informative, "Pgyer网络数据异常!!!"
212
+ end
213
+ return app_info_list
214
+ end
215
+
216
+ def get_versioon_history_item(client:nil, app_info_obj:nil, list_select_flat:false)
217
+
218
+ appId = app_info_obj["appId"]
219
+ version_data = client.get_app_version_list_req(appId:appId) || {}
220
+
221
+ if version_data["data"].nil? || version_data["data"].size <=0
222
+ raise Informative, "#{proj_name} 错误, 没有找到上传记录"
223
+ end
224
+
225
+ app_incId_index = nil
226
+ if list_select_flat
227
+
228
+ #获取version_data 最后10个数
229
+ list_num = [version_data["data"].size, 10].min
230
+ #获取version_data 最后10个的incId, bundleId, updateTime组成新数组
231
+ version_array_temp = version_data["data"].take(list_num).map do |item|
232
+ {
233
+ "appVersion" => item["appVersion"] + "(build " + item["build"] + " )",
234
+ "incId" => item["incId"],
235
+ "bundleId" => item["bundleId"],
236
+ "updateTime" => item["updateTime"]
237
+ }
238
+ end
239
+
240
+ version_array_temp.each do |item|
241
+ puts "版本:#{item["appVersion"]} Build号:#{item["incId"]} bundleId:#{item["bundleId"]} 上传时间:#{item["updateTime"]}"
242
+ end
243
+ puts
244
+ app_incId_index = ask('请选择上面的Build号:')
245
+
246
+ end
247
+
248
+ version_item_obj = nil
249
+ if !app_incId_index.nil?
250
+ version_item_obj = version_data["data"].find{ |item| item["incId"].to_s.eql?(app_incId_index.to_s)}
251
+ else
252
+ version_item_obj = version_data["data"].find{ |item| item["latest"]}
253
+ end
254
+
255
+ version_item_obj
256
+
257
+ end
258
+
259
+
260
+ def get_description()
261
+ comment_array = []
262
+ puts "请输入备注信息(按Esc结束):"
263
+ loop do
264
+
265
+ line = STDIN.gets.chomp
266
+ comment_array << line
267
+
268
+ key = STDIN.getch
269
+ break if key == "\e" # Break the loop if Esc key is pressed
270
+ end
271
+ puts "================================="
272
+ puts "输入结束,输入内容为:"
273
+ puts "================================="
274
+ comment_str = comment_array.join("\n")
275
+ puts comment_array
276
+ puts "================================="
277
+ return comment_str
278
+ end
279
+
280
+ def modify_coment(client:nil, app_info_obj:nil, version_item_obj:nil)
281
+
282
+ comment_str = get_description()
283
+ puts
284
+ puts "确修改信息:"
285
+ puts
286
+ puts "================================="
287
+ puts "App: #{app_info_obj["appName"]}"
288
+ puts "版本: #{version_item_obj["appVersion"]} (build #{version_item_obj["build"]})"
289
+ puts "Build号: #{version_item_obj["incId"]}"
290
+ puts "bundleId: #{version_item_obj["bundleId"]}"
291
+ puts "上传时间: #{version_item_obj["updateTime"]}"
292
+ puts
293
+ puts "旧备注: \n#{version_item_obj["description"]}"
294
+ puts
295
+ puts "修改备注: \n#{comment_str.strip}"
296
+ puts "================================="
297
+ puts
298
+ answer = agree("确认修改备注信息(Y/n)?:")
299
+ unless answer
300
+ raise Informative, "暂停修改!!"
301
+ end
302
+
303
+ client.post_update_upload_comment(appId:app_info_obj["appId"], id:version_item_obj["id"], comment:comment_str.strip)
304
+
305
+ puts "备注信息修改成功!!"
306
+
307
+ end
308
+
309
+ def make_msg_data(app_info_obj:nil, app_version_info_obj:nil, msg_from: nil)
310
+
311
+ app_name = app_info_obj["appName"]
312
+ download_password = app_info_obj["password"]
313
+ download_url = app_info_obj["downloadUrl"] + "?" + "id=" + app_version_info_obj["id"]
314
+ bundle_id = app_version_info_obj["bundleId"]
315
+ app_version = app_version_info_obj["appVersion"]
316
+ index_num = app_version_info_obj["incId"]
317
+ time = app_version_info_obj["updateTime"]
318
+ description = app_version_info_obj["description"]
319
+ msg_from = msg_from || " "
320
+ msg_data ={
321
+ app_name: app_name,
322
+ download_password: download_password,
323
+ download_url: download_url,
324
+ bundle_id: bundle_id,
325
+ app_version: app_version,
326
+ index_num: index_num,
327
+ time: time,
328
+ description: description,
329
+ msg_from:msg_from
330
+ }
331
+
332
+ return msg_data
333
+
334
+ end
335
+
336
+
337
+ end
338
+
339
+ end