class Passbook::PKPass

Constants

TYPES

Attributes

manifest_files[RW]
pass[RW]
signer[RW]

Public Class Methods

new(pass, init_signer = nil) click to toggle source
# File lib/passbook/pkpass.rb, line 12
def initialize pass, init_signer = nil
  @pass           = pass
  @manifest_files = []
  @signer         = init_signer || Passbook::Signer.new
end

Public Instance Methods

addFile(file) click to toggle source
# File lib/passbook/pkpass.rb, line 18
def addFile file
  @manifest_files << file
end
addFiles(files) click to toggle source
# File lib/passbook/pkpass.rb, line 22
def addFiles files
  @manifest_files += files
end
build() click to toggle source
# File lib/passbook/pkpass.rb, line 31
def build
  manifest = createManifest

  # Check pass for necessary files and fields
  checkPass manifest

  # Create pass signature
  signature = @signer.sign manifest

  return [manifest, signature]
end
create() click to toggle source

Backward compatibility

# File lib/passbook/pkpass.rb, line 44
def create
  self.file.path
end
file(options = {}) click to toggle source

Return a Tempfile containing our ZipStream

# File lib/passbook/pkpass.rb, line 49
def file(options = {})
  options[:file_name] ||= 'pass.pkpass'

  temp_file = Tempfile.new(options[:file_name])
  temp_file.write self.stream.string
  temp_file.close

  temp_file
end
json=(json) click to toggle source

for backwards compatibility

# File lib/passbook/pkpass.rb, line 27
def json= json
  @pass = json
end
stream() click to toggle source

Return a ZipOutputStream

# File lib/passbook/pkpass.rb, line 60
def stream
  manifest, signature = build

  outputZip manifest, signature
end

Private Instance Methods

checkPass(manifest) click to toggle source
# File lib/passbook/pkpass.rb, line 68
def checkPass manifest
  # Check for default images
  raise 'Icon missing' unless manifest.include?('icon.png')
  raise 'Icon@2x missing' unless manifest.include?('icon@2x.png')

  # Check for developer field in JSON
  raise 'Pass Type Identifier missing' unless @pass.include?('passTypeIdentifier')
  raise 'Team Identifier missing' unless @pass.include?('teamIdentifier')
  raise 'Serial Number missing' unless @pass.include?('serialNumber')
  raise 'Organization Name Identifier missing' unless @pass.include?('organizationName')
  raise 'Format Version' unless @pass.include?('formatVersion')
  raise 'Format Version should be a numeric' unless JSON.parse(@pass)['formatVersion'].is_a?(Numeric)
  raise 'Description' unless @pass.include?('description')
end
createManifest() click to toggle source
# File lib/passbook/pkpass.rb, line 83
def createManifest
  sha1s = {}
  sha1s['pass.json'] = Digest::SHA1.hexdigest @pass

  @manifest_files.each do |file|
    if file.class == Hash
      sha1s[file[:name]] = Digest::SHA1.hexdigest file[:content]
    else
      sha1s[File.basename(file)] = Digest::SHA1.file(file).hexdigest
    end
  end

  return sha1s.to_json
end
outputZip(manifest, signature) click to toggle source
# File lib/passbook/pkpass.rb, line 98
def outputZip manifest, signature

  Zip::OutputStream.write_buffer do |zip|
    zip.put_next_entry 'pass.json'
    zip.write @pass
    zip.put_next_entry 'manifest.json'
    zip.write manifest
    zip.put_next_entry 'signature'
    zip.write signature

    @manifest_files.each do |file|
      if file.class == Hash
        zip.put_next_entry file[:name]
        zip.print file[:content]
      else
        zip.put_next_entry File.basename(file)
        zip.print IO.read(file)
      end
    end
  end
end