Class: FastlaneCore::IpaFileAnalyser
- Inherits:
-
Object
- Object
- FastlaneCore::IpaFileAnalyser
- Defined in:
- fastlane_core/lib/fastlane_core/ipa_file_analyser.rb
Class Method Summary collapse
-
.fetch_app_build(path) ⇒ Object
Fetches the app build number from the given ipa file.
-
.fetch_app_identifier(path) ⇒ Object
Fetches the app identifier (e.g. com.facebook.Facebook) from the given ipa file.
-
.fetch_app_platform(path) ⇒ Object
Fetches the app platform from the given ipa file.
-
.fetch_app_version(path) ⇒ Object
Fetches the app version from the given ipa file.
- .fetch_info_plist_file(path) ⇒ Object
- .fetch_info_plist_with_rubyzip(path) ⇒ Object
- .fetch_info_plist_with_unzip(path) ⇒ Object
Class Method Details
.fetch_app_build(path) ⇒ Object
Fetches the app build number from the given ipa file.
24 25 26 27 28 |
# File 'fastlane_core/lib/fastlane_core/ipa_file_analyser.rb', line 24 def self.fetch_app_build(path) plist = self.fetch_info_plist_file(path) return plist['CFBundleVersion'] if plist return nil end |
.fetch_app_identifier(path) ⇒ Object
Fetches the app identifier (e.g. com.facebook.Facebook) from the given ipa file.
10 11 12 13 14 |
# File 'fastlane_core/lib/fastlane_core/ipa_file_analyser.rb', line 10 def self.fetch_app_identifier(path) plist = self.fetch_info_plist_file(path) return plist['CFBundleIdentifier'] if plist return nil end |
.fetch_app_platform(path) ⇒ Object
Fetches the app platform from the given ipa file.
31 32 33 34 35 36 37 |
# File 'fastlane_core/lib/fastlane_core/ipa_file_analyser.rb', line 31 def self.fetch_app_platform(path) plist = self.fetch_info_plist_file(path) platform = "ios" platform = plist['DTPlatformName'] if plist platform = "ios" if platform == "iphoneos" # via https://github.com/fastlane/fastlane/issues/3484 return platform end |
.fetch_app_version(path) ⇒ Object
Fetches the app version from the given ipa file.
17 18 19 20 21 |
# File 'fastlane_core/lib/fastlane_core/ipa_file_analyser.rb', line 17 def self.fetch_app_version(path) plist = self.fetch_info_plist_file(path) return plist['CFBundleShortVersionString'] if plist return nil end |
.fetch_info_plist_file(path) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'fastlane_core/lib/fastlane_core/ipa_file_analyser.rb', line 39 def self.fetch_info_plist_file(path) UI.user_error!("Could not find file at path '#{path}'") unless File.exist?(path) plist_data = self.fetch_info_plist_with_rubyzip(path) if plist_data.nil? # Xcode produces invalid zip files for IPAs larger than 4GB. RubyZip # can't read them, but the unzip command is able to work around this. plist_data = self.fetch_info_plist_with_unzip(path) end return nil if plist_data.nil? # Creates a temporary directory with a unique name tagged with 'fastlane' # The directory is deleted automatically at the end of the block Dir.mktmpdir("fastlane") do |tmp| # The XML file has to be properly unpacked first tmp_path = File.join(tmp, "Info.plist") File.open(tmp_path, 'wb') do |output| output.write(plist_data) end result = CFPropertyList.native_types(CFPropertyList::List.new(file: tmp_path).value) if result['CFBundleIdentifier'] || result['CFBundleVersion'] return result end end return nil end |
.fetch_info_plist_with_rubyzip(path) ⇒ Object
67 68 69 70 71 72 73 |
# File 'fastlane_core/lib/fastlane_core/ipa_file_analyser.rb', line 67 def self.fetch_info_plist_with_rubyzip(path) Zip::File.open(path, "rb") do |zipfile| file = zipfile.glob('**/Payload/*.app/Info.plist').first return nil unless file zipfile.read(file) end end |
.fetch_info_plist_with_unzip(path) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'fastlane_core/lib/fastlane_core/ipa_file_analyser.rb', line 75 def self.fetch_info_plist_with_unzip(path) entry, error, = Open3.capture3("unzip", "-Z", "-1", path, "*Payload/*.app/Info.plist") # unzip can return multiple Info.plist files if is an embedded app bundle (a WatchKit app) # - ContainsWatchApp/Payload/Sample.app/Watch/Sample WatchKit App.app/Info.plist # - ContainsWatchApp/Payload/Sample.app/Info.plist # # we can determine the main Info.plist by the shortest path entry = entry.lines.map(&:chomp).min_by(&:size) UI.command_output(error) unless error.empty? return nil if entry.nil? || entry.empty? data, error, = Open3.capture3("unzip", "-p", path, entry) UI.command_output(error) unless error.empty? return nil if data.empty? data end |