class AppInfo::MobileProvision

.mobileprovision file parser

Public Class Methods

new(path) click to toggle source
# File lib/app_info/mobile_provision.rb, line 9
def initialize(path)
  @path = path
end

Public Instance Methods

[](key) click to toggle source
# File lib/app_info/mobile_provision.rb, line 195
def [](key)
  mobileprovision.try(:[], key.to_s)
end
adhoc?() click to toggle source
# File lib/app_info/mobile_provision.rb, line 106
def adhoc?
  return false if platform == :macos # macOS no need adhoc

  !development? && !devices.nil?
end
app_name() click to toggle source
# File lib/app_info/mobile_provision.rb, line 17
def app_name
  mobileprovision.try(:[], 'AppIDName')
end
appstore?() click to toggle source

Detect app store type

related link: developer.apple.com/library/archive/qa/qa1830/_index.html

# File lib/app_info/mobile_provision.rb, line 95
def appstore?
  case platform.downcase.to_sym
  when :ios
    !development? && entitlements.key?('beta-reports-active')
  when :macos
    !development?
  else
    raise Error, "Not implement with platform: #{platform}"
  end
end
created_date() click to toggle source
# File lib/app_info/mobile_provision.rb, line 57
def created_date
  mobileprovision.try(:[], 'CreationDate')
end
developer_certs() click to toggle source
# File lib/app_info/mobile_provision.rb, line 69
def developer_certs
  certs = mobileprovision.try(:[], 'DeveloperCertificates')
  return if certs.empty?

  certs.each_with_object([]) do |cert, obj|
    obj << DeveloperCertificate.new(cert)
  end
end
development?() click to toggle source

Detect is development type of mobileprovision

related link: stackoverflow.com/questions/1003066/what-does-get-task-allow-do-in-xcode

# File lib/app_info/mobile_provision.rb, line 81
def development?
  case platform.downcase.to_sym
  when :ios
    entitlements['get-task-allow'] == true
  when :macos
    !devices.nil?
  else
    raise Error, "Not implement with platform: #{platform}"
  end
end
devices() click to toggle source
# File lib/app_info/mobile_provision.rb, line 41
def devices
  mobileprovision.try(:[], 'ProvisionedDevices')
end
empty?() click to toggle source
# File lib/app_info/mobile_provision.rb, line 199
def empty?
  mobileprovision.nil?
end
enabled_capabilities() click to toggle source

Enabled Capabilites

Related link: developer.apple.com/support/app-capabilities/

# File lib/app_info/mobile_provision.rb, line 122
def enabled_capabilities
  capabilities = []
  capabilities << 'In-App Purchase' << 'GameKit' if adhoc? || appstore?

  entitlements.each do |key, _|
    case key
    when 'aps-environment'
      capabilities << 'Push Notifications'
    when 'com.apple.developer.applesignin'
      capabilities << 'Sign In with Apple'
    when 'com.apple.developer.siri'
      capabilities << 'SiriKit'
    when 'com.apple.security.application-groups'
      capabilities << 'App Groups'
    when 'com.apple.developer.associated-domains'
      capabilities << 'Associated Domains'
    when 'com.apple.developer.default-data-protection'
      capabilities << 'Data Protection'
    when 'com.apple.developer.networking.networkextension'
      capabilities << 'Network Extensions'
    when 'com.apple.developer.networking.vpn.api'
      capabilities << 'Personal VPN'
    when 'com.apple.developer.healthkit',
         'com.apple.developer.healthkit.access'
      capabilities << 'HealthKit' unless capabilities.include?('HealthKit')
    when 'com.apple.developer.icloud-services',
         'com.apple.developer.icloud-container-identifiers'
      capabilities << 'iCloud' unless capabilities.include?('iCloud')
    when 'com.apple.developer.in-app-payments'
      capabilities << 'Apple Pay'
    when 'com.apple.developer.homekit'
      capabilities << 'HomeKit'
    when 'com.apple.developer.user-fonts'
      capabilities << 'Fonts'
    when 'com.apple.developer.pass-type-identifiers'
      capabilities << 'Wallet'
    when 'inter-app-audio'
      capabilities << 'Inter-App Audio'
    when 'com.apple.developer.networking.multipath'
      capabilities << 'Multipath'
    when 'com.apple.developer.authentication-services.autofill-credential-provider'
      capabilities << 'AutoFill Credential Provider'
    when 'com.apple.developer.networking.wifi-info'
      capabilities << 'Access WiFi Information'
    when 'com.apple.external-accessory.wireless-configuration'
      capabilities << 'Wireless Accessory Configuration'
    when 'com.apple.developer.kernel.extended-virtual-addressing'
      capabilities << 'Extended Virtual Address Space'
    when 'com.apple.developer.nfc.readersession.formats'
      capabilities << 'NFC Tag Reading'
    when 'com.apple.developer.ClassKit-environment'
      capabilities << 'ClassKit'
    when 'com.apple.developer.networking.HotspotConfiguration'
      capabilities << 'Hotspot'
    when 'com.apple.developer.devicecheck.appattest-environment'
      capabilities << 'App Attest'
    when 'com.apple.developer.coremedia.hls.low-latency'
      capabilities << 'Low Latency HLS'
    when 'com.apple.developer.associated-domains.mdm-managed'
      capabilities << 'MDM Managed Associated Domains'
    # macOS Only
    when 'com.apple.developer.maps'
      capabilities << 'Maps'
    when 'com.apple.developer.system-extension.install'
      capabilities << 'System Extension'
    when 'com.apple.developer.networking.custom-protocol'
      capabilities << 'Custom Network Protocol'
    end
  end

  capabilities
end
enterprise?() click to toggle source
# File lib/app_info/mobile_provision.rb, line 112
def enterprise?
  return false if platform == :macos # macOS no need adhoc

  !development? && !adhoc? && !appstore?
end
Also aliased as: inhouse?
entitlements() click to toggle source
# File lib/app_info/mobile_provision.rb, line 65
def entitlements
  mobileprovision.try(:[], 'Entitlements')
end
expired_date() click to toggle source
# File lib/app_info/mobile_provision.rb, line 61
def expired_date
  mobileprovision.try(:[], 'ExpirationDate')
end
inhouse?()
Alias for: enterprise?
method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/app_info/mobile_provision.rb, line 214
def method_missing(method_name, *args, &block)
  mobileprovision.try(:[], Util.format_key(method_name)) ||
    mobileprovision.send(method_name) ||
    super
end
mobileprovision() click to toggle source
# File lib/app_info/mobile_provision.rb, line 203
def mobileprovision
  return @mobileprovision = nil unless File.exist?(@path)

  data = File.read(@path)
  data = strip_plist_wrapper(data) unless bplist?(data)
  list = CFPropertyList::List.new(data: data).value
  @mobileprovision = CFPropertyList.native_types(list)
rescue CFFormatError
  @mobileprovision = nil
end
name() click to toggle source
# File lib/app_info/mobile_provision.rb, line 13
def name
  mobileprovision.try(:[], 'Name')
end
platform() click to toggle source
# File lib/app_info/mobile_provision.rb, line 37
def platform
  platforms[0]
end
platforms() click to toggle source
# File lib/app_info/mobile_provision.rb, line 28
def platforms
  return unless platforms = mobileprovision.try(:[], 'Platform')

  platforms.map do |v|
    v = 'macOS' if v == 'OSX'
    v.downcase.to_sym
  end
end
profile_name() click to toggle source
# File lib/app_info/mobile_provision.rb, line 53
def profile_name
  mobileprovision.try(:[], 'Name')
end
respond_to_missing?(method_name, *args) click to toggle source
Calls superclass method
# File lib/app_info/mobile_provision.rb, line 220
def respond_to_missing?(method_name, *args)
  mobileprovision.key?(Util.format_key(method_name)) ||
    mobileprovision.respond_to?(method_name) ||
    super
end
team_identifier() click to toggle source
# File lib/app_info/mobile_provision.rb, line 45
def team_identifier
  mobileprovision.try(:[], 'TeamIdentifier')
end
team_name() click to toggle source
# File lib/app_info/mobile_provision.rb, line 49
def team_name
  mobileprovision.try(:[], 'TeamName')
end
type() click to toggle source
# File lib/app_info/mobile_provision.rb, line 21
def type
  return :development if development?
  return :adhoc if adhoc?
  return :appstore if appstore?
  return :enterprise if enterprise?
end

Private Instance Methods

bplist?(raw) click to toggle source
# File lib/app_info/mobile_provision.rb, line 228
def bplist?(raw)
  raw[0..5] == 'bplist'
end
strip_plist_wrapper(raw) click to toggle source
# File lib/app_info/mobile_provision.rb, line 232
def strip_plist_wrapper(raw)
  end_tag = '</plist>'
  start_point = raw.index('<?xml version=')
  end_point = raw.index(end_tag) + end_tag.size - 1
  raw[start_point..end_point]
end