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