app-info 2.1.1 → 2.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cffe87f63672515e5bd9dc2654218ddc2a9de0cde184bd27e47bd6923618d565
4
- data.tar.gz: d96f0e38be72d9e2918e6679e6d03f4cabd9c4901b02c79b9f4a172bba04e349
3
+ metadata.gz: 7e60db88b8b1bc77db8a80623e1f5f52f47114e04f7941486ca8e21ee9ca19f2
4
+ data.tar.gz: 78c45e538580d4c1c48807b77f38f650a09f4d1610581efb1c423d870c14425f
5
5
  SHA512:
6
- metadata.gz: 8bd48968214009001630dba1b56e85df53727542fc9d458f09b551761e11526ca5b47b4877e766ecce2adcd18ded1269925b26fe6b83318c5a8cc13f537ffd1d
7
- data.tar.gz: 536be7d70111183d392ec24e5690598e60d9b634a8584ea7f698ab6b10fd6b09006edeed51370be17ce7d6b99bfd2848589091724e9dca89c5c1b087cbb08b67
6
+ metadata.gz: bfba684fb8bcf015c46f5457b2f4ea1e3bcbaac670a921f2b748a208d1069efff449e22ffb373754622d55927e4f65554aaa5e33c3576dbd55eb3437d3084ee0
7
+ data.tar.gz: 470dedd66f3bbd04a328e36a125599ca53c0ba9cc7c6778dea6cf74d61f348661080a0f4b801b8b02557c7e842a68e1ecbc7c585f0271e15e5625566ac7a1763
@@ -26,7 +26,7 @@ Metrics/BlockLength:
26
26
  Metrics/MethodLength:
27
27
  Max: 20
28
28
 
29
- Metrics/LineLength:
29
+ Layout/LineLength:
30
30
  Max: 100
31
31
 
32
32
  Metrics/ClassLength:
@@ -36,6 +36,5 @@ Metrics/ClassLength:
36
36
  Metrics/CyclomaticComplexity:
37
37
  Max: 10
38
38
 
39
-
40
39
  Style/Documentation:
41
40
  Enabled: false
@@ -5,4 +5,5 @@ rvm:
5
5
  - 2.4
6
6
  - 2.5
7
7
  - 2.6
8
+ - 2.7
8
9
  before_install: gem install bundler
@@ -9,6 +9,40 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
9
9
 
10
10
  > List all changes before release a new version.
11
11
 
12
+ ## [2.3.0] (2021-01-15)
13
+
14
+ ### Changed
15
+
16
+ - Change `IPA::ExportType::INHOUSE` to `IPA::ExportType::ENTERPRISE` and change the value. #[24](https://github.com/icyleaf/app-info/pull/24)
17
+ ### Added
18
+
19
+ - Add `plugins`, `frameworks` to `AppInfo::IPA`. #[25](https://github.com/icyleaf/app-info/pull/25)
20
+
21
+ ## [2.2.0] (2020-07-21)
22
+
23
+ ### Added
24
+
25
+ - Add `platforms`, `platform` and `type` to `AppInfo::MobileProvision`.
26
+ - Add Enabled Capabilities support for mobileprovision. #[21](https://github.com/icyleaf/app-info/pull/19)
27
+
28
+ ## [2.1.4] (2020-01-21)
29
+
30
+ ### Fixed
31
+
32
+ - Correct Zipped dSYM filename with directory.
33
+
34
+ ## [2.1.3] (2020-01-16)
35
+
36
+ ### Fixed
37
+
38
+ - Store Android icon with BINARY mode AGAIN(correct way).
39
+
40
+ ## [2.1.2] (2020-01-11)
41
+
42
+ ### Fixed
43
+
44
+ - Correct Android icon temporary path.
45
+ - Store Android icon force encoding with BINARY.
12
46
 
13
47
  ## [2.1.1] (2019-12-28)
14
48
 
@@ -57,7 +91,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
57
91
 
58
92
  - Updated dependency of CFPropertly list be a range between 2.3.4. (thanks @[cschroed](https://github.com/cschroed))
59
93
 
60
- [Unreleased]: https://github.com/icyleaf/app-info/compare/v2.1.1..HEAD
94
+ [Unreleased]: https://github.com/icyleaf/app-info/compare/v2.3.0..HEAD
95
+ [2.2.0]: https://github.com/icyleaf/app-info/compare/v2.2.0...v2.3.0
96
+ [2.2.0]: https://github.com/icyleaf/app-info/compare/v2.1.4...v2.2.0
97
+ [2.1.4]: https://github.com/icyleaf/app-info/compare/v2.1.3...v2.1.4
98
+ [2.1.3]: https://github.com/icyleaf/app-info/compare/v2.1.2...v2.1.3
99
+ [2.1.2]: https://github.com/icyleaf/app-info/compare/v2.1.1...v2.1.2
61
100
  [2.1.1]: https://github.com/icyleaf/app-info/compare/v2.1.0...v2.1.1
62
101
  [2.1.0]: https://github.com/icyleaf/app-info/compare/v2.0.0...v2.1.0
63
102
  [2.0.0]: https://github.com/icyleaf/app-info/compare/v1.1.2...v2.0.0
data/README.md CHANGED
@@ -12,7 +12,7 @@ Teardown tool for mobile app(ipa/apk) and dSYM.zip file, analysis metedata like
12
12
  - Android apk file
13
13
  - iOS ipa file
14
14
  - Info.plist file
15
- - .mobileprovision file
15
+ - .mobileprovision/.provisionprofile file
16
16
  - dSYM(.zip) file
17
17
 
18
18
  ## Installation
@@ -101,6 +101,14 @@ ipa.release_type
101
101
  ipa.archs
102
102
  # => [:armv7, :arm64]
103
103
 
104
+ # get built-in frameworks
105
+ ipa.frameworks
106
+ # => [<AppInfo::Framework:520 @name=Masonry.framework>, <AppInfo::Framework:520 @name=libswiftPhotos.dylib>]
107
+
108
+ # get built-in plugins
109
+ ipa.plugins
110
+ # => [<AppInfo::Plugin:1680 @name=NotificationService>]
111
+
104
112
  # get more propety in Info.plist
105
113
  ipa.info[:CFBundleDisplayName]
106
114
  # => 'AppInfoDemo'
@@ -127,6 +135,14 @@ profile.team_name
127
135
  # get UDID of devices
128
136
  profile.devices
129
137
  # => ['18cf53cddee60c5af9c97b1521e7cbf8342628da']
138
+
139
+ # detect type
140
+ profile.type
141
+ # => :development/:adhoc/:appstore/:enterprise
142
+
143
+ # get enabled capabilities
144
+ profile.enabled_capabilities
145
+ # => ['Apple Pay', 'iCloud', 'Sign In with Apple', ...]
130
146
  ```
131
147
 
132
148
  ### dSYM
@@ -20,12 +20,12 @@ Gem::Specification.new do |spec|
20
20
  spec.required_ruby_version = '>= 2.3'
21
21
 
22
22
  spec.add_dependency 'CFPropertyList', ['< 3.1.0', '>= 2.3.4']
23
- spec.add_dependency 'image_size', '>= 1.5', '< 2.1'
23
+ spec.add_dependency 'image_size', '>= 1.5', '< 2.2'
24
24
  spec.add_dependency 'pngdefry', '~> 0.1.2'
25
25
  spec.add_dependency 'ruby-macho', '~> 2.2.0'
26
26
  spec.add_dependency 'ruby_android', '~> 0.7.7'
27
27
  spec.add_dependency 'rubyzip', '>= 1.2', '< 3.0'
28
- spec.add_dependency 'uuidtools', '~> 2.1.5'
28
+ spec.add_dependency 'uuidtools', '>= 2.1.5', '< 2.3.0'
29
29
 
30
30
  spec.add_development_dependency 'bundler', '>= 1.12'
31
31
  spec.add_development_dependency 'rake', '>= 10.0'
@@ -5,6 +5,8 @@ require 'app_info/version'
5
5
  require 'app_info/ipa'
6
6
  require 'app_info/ipa/info_plist'
7
7
  require 'app_info/ipa/mobile_provision'
8
+ require 'app_info/ipa/plugin'
9
+ require 'app_info/ipa/framework'
8
10
  require 'app_info/apk'
9
11
  require 'app_info/dsym'
10
12
  require 'app_info/proguard'
@@ -54,8 +54,6 @@ module AppInfo
54
54
  resource.find('@string/app_name')
55
55
  end
56
56
 
57
-
58
-
59
57
  def device_type
60
58
  if wear?
61
59
  Device::WATCH
@@ -120,12 +118,10 @@ module AppInfo
120
118
 
121
119
  @icons = @apk.icon.each_with_object([]) do |(path, data), obj|
122
120
  icon_name = File.basename(path)
123
- icon_path = File.join(tmp_path, File.path(path))
121
+ icon_path = File.join(tmp_path, File.dirname(path))
124
122
  icon_file = File.join(icon_path, icon_name)
125
123
  FileUtils.mkdir_p icon_path
126
- File.open(icon_file, 'w') do |f|
127
- f.write data
128
- end
124
+ File.open(icon_file, 'wb') { |f| f.write(data) }
129
125
 
130
126
  obj << {
131
127
  name: icon_name,
@@ -84,7 +84,10 @@ module AppInfo
84
84
  dsym_dir = nil
85
85
  @contents = Util.unarchive(@file, path: 'dsym') do |path, zip_file|
86
86
  zip_file.each do |f|
87
- dsym_dir ||= f.name
87
+ unless dsym_dir
88
+ dsym_dir = f.name
89
+ dsym_dir = dsym_dir.split('/')[0] # fix filename is xxx.app.dSYM/Contents
90
+ end
88
91
 
89
92
  f_path = File.join(path, f.name)
90
93
  zip_file.extract(f, f_path) unless File.exist?(f_path)
@@ -18,9 +18,11 @@ module AppInfo
18
18
  module ExportType
19
19
  DEBUG = 'Debug'
20
20
  ADHOC = 'AdHoc'
21
- INHOUSE = 'inHouse'
21
+ ENTERPRISE = 'Enterprise'
22
22
  RELEASE = 'Release'
23
23
  UNKOWN = nil
24
+
25
+ INHOUSE = 'Enterprise' # Rename and Alias to enterprise
24
26
  end
25
27
 
26
28
  def initialize(file)
@@ -60,7 +62,7 @@ module AppInfo
60
62
  if devices
61
63
  ExportType::ADHOC
62
64
  else
63
- ExportType::INHOUSE
65
+ ExportType::ENTERPRISE
64
66
  end
65
67
  else
66
68
  ExportType::DEBUG
@@ -86,6 +88,14 @@ module AppInfo
86
88
  metadata? ? true : false
87
89
  end
88
90
 
91
+ def plugins
92
+ @plugins ||= Plugin.parse(app_path)
93
+ end
94
+
95
+ def frameworks
96
+ @frameworks ||= Framework.parse(app_path)
97
+ end
98
+
89
99
  def hide_developer_certificates
90
100
  mobileprovision.delete('DeveloperCertificates') if mobileprovision?
91
101
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ module AppInfo
6
+ # iOS Plugin parser
7
+ class Framework
8
+ extend Forwardable
9
+
10
+ def self.parse(path, name = 'Frameworks')
11
+ files = Dir.glob(File.join(path, name.to_s, '*'))
12
+ return [] if files.empty?
13
+
14
+ files.each_with_object([]) do |file, obj|
15
+ obj << new(file)
16
+ end
17
+ end
18
+
19
+ attr_reader :file
20
+
21
+ def_delegators :info, :display_name, :bundle_name, :release_version, :build_version,
22
+ :identifier, :bundle_id, :min_sdk_version, :device_type
23
+
24
+ def initialize(file)
25
+ @file = file
26
+ end
27
+
28
+ def name
29
+ File.basename(file)
30
+ end
31
+
32
+ def macho
33
+ return unless lib?
34
+
35
+ require 'macho'
36
+ MachO.open(file)
37
+ end
38
+
39
+ def lib?
40
+ File.file?(file)
41
+ end
42
+
43
+ def info
44
+ @info ||= InfoPlist.new(file)
45
+ end
46
+
47
+ def to_s
48
+ "<#{self.class}:#{object_id} @name=#{name}>"
49
+ end
50
+ end
51
+ end
@@ -122,6 +122,8 @@ module AppInfo
122
122
  private
123
123
 
124
124
  def info
125
+ return unless File.file?(info_path)
126
+
125
127
  @info ||= CFPropertyList.native_types(CFPropertyList::List.new(file: info_path).value)
126
128
  end
127
129
 
@@ -19,6 +19,26 @@ module AppInfo
19
19
  mobileprovision.try(:[], 'AppIDName')
20
20
  end
21
21
 
22
+ def type
23
+ return :development if development?
24
+ return :adhoc if adhoc?
25
+ return :appstore if appstore?
26
+ return :enterprise if enterprise?
27
+ end
28
+
29
+ def platforms
30
+ return unless platforms = mobileprovision.try(:[], 'Platform')
31
+
32
+ platforms.map { |v|
33
+ v = 'macOS' if v == 'OSX'
34
+ v.downcase.to_sym
35
+ }
36
+ end
37
+
38
+ def platform
39
+ platforms[0]
40
+ end
41
+
22
42
  def devices
23
43
  mobileprovision.try(:[], 'ProvisionedDevices')
24
44
  end
@@ -56,6 +76,123 @@ module AppInfo
56
76
  end
57
77
  end
58
78
 
79
+ # Detect is development type of mobileprovision
80
+ #
81
+ # related link: https://stackoverflow.com/questions/1003066/what-does-get-task-allow-do-in-xcode
82
+ def development?
83
+ case platform.downcase.to_sym
84
+ when :ios
85
+ entitlements['get-task-allow'] == true
86
+ when :macos
87
+ !devices.nil?
88
+ else
89
+ raise Error, "Not implement with platform: #{platform}"
90
+ end
91
+ end
92
+
93
+ # Detect app store type
94
+ #
95
+ # related link: https://developer.apple.com/library/archive/qa/qa1830/_index.html
96
+ def appstore?
97
+ case platform.downcase.to_sym
98
+ when :ios
99
+ !development? && entitlements.key?('beta-reports-active')
100
+ when :macos
101
+ !development?
102
+ else
103
+ raise Error, "Not implement with platform: #{platform}"
104
+ end
105
+ end
106
+
107
+ def adhoc?
108
+ return false if platform == :macos # macOS no need adhoc
109
+
110
+ !development? && !devices.nil?
111
+ end
112
+
113
+ def enterprise?
114
+ return false if platform == :macos # macOS no need adhoc
115
+
116
+ !development? && !adhoc? && !appstore?
117
+ end
118
+ alias inhouse? enterprise?
119
+
120
+ # Enabled Capabilites
121
+ #
122
+ # Related link: https://developer.apple.com/support/app-capabilities/
123
+ def enabled_capabilities
124
+ capabilities = []
125
+ if adhoc? || appstore?
126
+ capabilities << 'In-App Purchase' << 'GameKit'
127
+ end
128
+
129
+ entitlements.each do |key, value|
130
+ case key
131
+ when 'aps-environment'
132
+ capabilities << 'Push Notifications'
133
+ when 'com.apple.developer.applesignin'
134
+ capabilities << 'Sign In with Apple'
135
+ when 'com.apple.developer.siri'
136
+ capabilities << 'SiriKit'
137
+ when 'com.apple.security.application-groups'
138
+ capabilities << 'App Groups'
139
+ when 'com.apple.developer.associated-domains'
140
+ capabilities << 'Associated Domains'
141
+ when 'com.apple.developer.default-data-protection'
142
+ capabilities << 'Data Protection'
143
+ when 'com.apple.developer.networking.networkextension'
144
+ capabilities << 'Network Extensions'
145
+ when 'com.apple.developer.networking.vpn.api'
146
+ capabilities << 'Personal VPN'
147
+ when 'com.apple.developer.healthkit', 'com.apple.developer.healthkit.access'
148
+ capabilities << 'HealthKit' unless capabilities.include?('HealthKit')
149
+ when 'com.apple.developer.icloud-services', 'com.apple.developer.icloud-container-identifiers'
150
+ capabilities << 'iCloud' unless capabilities.include?('iCloud')
151
+ when 'com.apple.developer.in-app-payments'
152
+ capabilities << 'Apple Pay'
153
+ when 'com.apple.developer.homekit'
154
+ capabilities << 'HomeKit'
155
+ when 'com.apple.developer.user-fonts'
156
+ capabilities << 'Fonts'
157
+ when 'com.apple.developer.pass-type-identifiers'
158
+ capabilities << 'Wallet'
159
+ when 'inter-app-audio'
160
+ capabilities << 'Inter-App Audio'
161
+ when 'com.apple.developer.networking.multipath'
162
+ capabilities << 'Multipath'
163
+ when 'com.apple.developer.authentication-services.autofill-credential-provider'
164
+ capabilities << 'AutoFill Credential Provider'
165
+ when 'com.apple.developer.networking.wifi-info'
166
+ capabilities << 'Access WiFi Information'
167
+ when 'com.apple.external-accessory.wireless-configuration'
168
+ capabilities << 'Wireless Accessory Configuration'
169
+ when 'com.apple.developer.kernel.extended-virtual-addressing'
170
+ capabilities << 'Extended Virtual Address Space'
171
+ when 'com.apple.developer.nfc.readersession.formats'
172
+ capabilities << 'NFC Tag Reading'
173
+ when 'com.apple.developer.ClassKit-environment'
174
+ capabilities << 'ClassKit'
175
+ when 'com.apple.developer.networking.HotspotConfiguration'
176
+ capabilities << 'Hotspot'
177
+ when 'com.apple.developer.devicecheck.appattest-environment'
178
+ capabilities << 'App Attest'
179
+ when 'com.apple.developer.coremedia.hls.low-latency'
180
+ capabilities << 'Low Latency HLS'
181
+ when 'com.apple.developer.associated-domains.mdm-managed'
182
+ capabilities << 'MDM Managed Associated Domains'
183
+ # macOS Only
184
+ when 'com.apple.developer.maps'
185
+ capabilities << 'Maps'
186
+ when 'com.apple.developer.system-extension.install'
187
+ capabilities << 'System Extension'
188
+ when 'com.apple.developer.networking.custom-protocol'
189
+ capabilities << 'Custom Network Protocol'
190
+ end
191
+ end
192
+
193
+ capabilities
194
+ end
195
+
59
196
  def [](key)
60
197
  mobileprovision.try(:[], key.to_s)
61
198
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'app_info/ipa/framework'
4
+
5
+ module AppInfo
6
+ # iOS Plugin parser
7
+ class Plugin < Framework
8
+ extend Forwardable
9
+
10
+ def self.parse(path, name = 'PlugIns')
11
+ super
12
+ end
13
+
14
+ def_delegators :info, :name
15
+ end
16
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppInfo
4
- VERSION = '2.1.1'
4
+ VERSION = '2.3.0'
5
5
  end
metadata CHANGED
@@ -1,35 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: app-info
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - icyleaf
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-28 00:00:00.000000000 Z
11
+ date: 2021-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: CFPropertyList
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 2.3.4
20
17
  - - "<"
21
18
  - !ruby/object:Gem::Version
22
19
  version: 3.1.0
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.3.4
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 2.3.4
30
27
  - - "<"
31
28
  - !ruby/object:Gem::Version
32
29
  version: 3.1.0
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.3.4
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: image_size
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: '1.5'
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: '2.1'
42
+ version: '2.2'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,7 +49,7 @@ dependencies:
49
49
  version: '1.5'
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: '2.1'
52
+ version: '2.2'
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: pngdefry
55
55
  requirement: !ruby/object:Gem::Requirement
@@ -116,16 +116,22 @@ dependencies:
116
116
  name: uuidtools
117
117
  requirement: !ruby/object:Gem::Requirement
118
118
  requirements:
119
- - - "~>"
119
+ - - ">="
120
120
  - !ruby/object:Gem::Version
121
121
  version: 2.1.5
122
+ - - "<"
123
+ - !ruby/object:Gem::Version
124
+ version: 2.3.0
122
125
  type: :runtime
123
126
  prerelease: false
124
127
  version_requirements: !ruby/object:Gem::Requirement
125
128
  requirements:
126
- - - "~>"
129
+ - - ">="
127
130
  - !ruby/object:Gem::Version
128
131
  version: 2.1.5
132
+ - - "<"
133
+ - !ruby/object:Gem::Version
134
+ version: 2.3.0
129
135
  - !ruby/object:Gem::Dependency
130
136
  name: bundler
131
137
  requirement: !ruby/object:Gem::Requirement
@@ -193,8 +199,10 @@ files:
193
199
  - lib/app_info/core_ext/object/try.rb
194
200
  - lib/app_info/dsym.rb
195
201
  - lib/app_info/ipa.rb
202
+ - lib/app_info/ipa/framework.rb
196
203
  - lib/app_info/ipa/info_plist.rb
197
204
  - lib/app_info/ipa/mobile_provision.rb
205
+ - lib/app_info/ipa/plugin.rb
198
206
  - lib/app_info/proguard.rb
199
207
  - lib/app_info/util.rb
200
208
  - lib/app_info/version.rb
@@ -202,7 +210,7 @@ homepage: http://github.com/icyleaf/app-info
202
210
  licenses:
203
211
  - MIT
204
212
  metadata: {}
205
- post_install_message:
213
+ post_install_message:
206
214
  rdoc_options: []
207
215
  require_paths:
208
216
  - lib
@@ -217,8 +225,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
217
225
  - !ruby/object:Gem::Version
218
226
  version: '0'
219
227
  requirements: []
220
- rubygems_version: 3.0.6
221
- signing_key:
228
+ rubygems_version: 3.1.4
229
+ signing_key:
222
230
  specification_version: 4
223
231
  summary: Teardown tool for mobile app(ipa/apk) and dSYM file, analysis metedata like
224
232
  version, name, icon