class AppParser::Ipa

Attributes

ipad_icons[R]
iphone_icons[R]

Public Class Methods

new(file_name) click to toggle source
# File lib/app_parser/ipa.rb, line 13
def initialize(file_name)
  @zip_file = Zip::File.new(file_name)
  @iphone_icons = search_icons
  @ipad_icons = search_icons(ipad: true)
end

Public Instance Methods

bundle_id() click to toggle source
# File lib/app_parser/ipa.rb, line 35
def bundle_id
  info_plist["CFBundleIdentifier"]
end
display_name() click to toggle source
# File lib/app_parser/ipa.rb, line 31
def display_name
  info_plist["CFBundleDisplayName"] || info_plist["CFBundleName"]
end
icon_data(file_name) click to toggle source
# File lib/app_parser/ipa.rb, line 52
def icon_data(file_name)
  Dir.mktmpdir do |tmp_dir|
    src_file = "#{tmp_dir}/src"
    dest_file = "#{tmp_dir}/dest"
    find_entry(file_name).extract(src_file)
    Pngdefry.defry(src_file, dest_file)
    File.binread(dest_file)
  end
end
icons() click to toggle source
# File lib/app_parser/ipa.rb, line 48
def icons
  @iphone_icons + @ipad_icons
end
info_plist() click to toggle source
# File lib/app_parser/ipa.rb, line 62
def info_plist
  @info_plist ||= CFPropertyList.native_types(
    CFPropertyList::List.new(data: read_file("Info.plist"), format: CFPropertyList::List::FORMAT_AUTO).value
  )
end
mobileprovision() click to toggle source
# File lib/app_parser/ipa.rb, line 68
def mobileprovision
  @mobileprovision ||= CFPropertyList.native_types(
    CFPropertyList::List.new(data: read_file("embedded.mobileprovision").match(%r{<\?xml.*</plist>}m)[0], format: CFPropertyList::List::FORMAT_AUTO).value
  )
end
os() click to toggle source
# File lib/app_parser/ipa.rb, line 19
def os
  "ios"
end
provisioned_devices() click to toggle source
# File lib/app_parser/ipa.rb, line 39
def provisioned_devices
  mobileprovision["ProvisionedDevices"]
end
provisions_all_devices() click to toggle source

true if In-House

# File lib/app_parser/ipa.rb, line 44
def provisions_all_devices
  mobileprovision["ProvisionsAllDevices"] || false
end
version() click to toggle source
# File lib/app_parser/ipa.rb, line 23
def version
  info_plist["CFBundleVersion"]
end
version_string() click to toggle source
# File lib/app_parser/ipa.rb, line 27
def version_string
  info_plist["CFBundleShortVersionString"]
end

Private Instance Methods

find_entries(path) click to toggle source
# File lib/app_parser/ipa.rb, line 76
def find_entries(path)
  @zip_file.glob("Payload/*.app/#{path}")
end
find_entry(path) click to toggle source
# File lib/app_parser/ipa.rb, line 80
def find_entry(path)
  find_entries(path).first
end
read_file(path) click to toggle source
# File lib/app_parser/ipa.rb, line 84
def read_file(path)
  entry = find_entry(path)
  entry.get_input_stream.read unless entry.nil?
end
search_icons(ipad: false) click to toggle source
# File lib/app_parser/ipa.rb, line 89
def search_icons(ipad: false)
  Dir.mktmpdir do |tmp_dir|
    info_plist.try(:[], "CFBundleIcons#{'~ipad' if ipad}").try(:[], "CFBundlePrimaryIcon").try(:[], "CFBundleIconFiles").each_with_object([]) do |icons, obj|
      find_entries(icons + "*").find_all { |entry| entry.name.index("~ipad").nil? != ipad }.each do |entry|
        tmp_file_name = "#{tmp_dir}/#{File.basename(entry.name)}"
        entry.extract(tmp_file_name)

        obj << { dimensions: Pngdefry.dimensions(tmp_file_name), file_name: File.basename(entry.name) }
      end
    end
  end
end