class Shenzhen::Plugins::ITunesConnect::Client

Attributes

ipa[R]
params[R]
sdk[R]

Public Class Methods

new(ipa, apple_id, sdk, account, password, params = []) click to toggle source
# File lib/shenzhen/plugins/itunesconnect.rb, line 13
def initialize(ipa, apple_id, sdk, account, password, params = [])
  @ipa = ipa
  @apple_id = apple_id
  @sdk = sdk
  @account = account
  @password = password
  @params = params
  @filename = File.basename(@ipa).tr(" ", "_")
end

Public Instance Methods

upload_build!() click to toggle source
# File lib/shenzhen/plugins/itunesconnect.rb, line 23
def upload_build!
  size = File.size(@ipa)
  checksum = Digest::MD5.file(@ipa)

  begin
    FileUtils.mkdir_p("Package.itmsp")
    FileUtils.copy_entry(@ipa, "Package.itmsp/#{@filename}")

    File.write("Package.itmsp/metadata.xml", metadata(@apple_id, checksum, size))

    raise if /(error)|(fail)/i === transport
  rescue
    say_error "An error occurred when trying to upload the build to iTunesConnect.\nRun with --verbose for more info." and abort
  ensure
    FileUtils.rm_rf("Package.itmsp", :secure => true)
  end
end

Private Instance Methods

metadata(apple_id, checksum, size) click to toggle source
# File lib/shenzhen/plugins/itunesconnect.rb, line 62
def metadata(apple_id, checksum, size)
  %{<?xml version="1.0" encoding="UTF-8"?>
    <package version="software4.7" xmlns="http://apple.com/itunes/importer">
      <software_assets apple_id="#{apple_id}">
        <asset type="bundle">
          <data_file>
            <file_name>#{@filename}</file_name>
            <checksum type="md5">#{checksum}</checksum>
            <size>#{size}</size>
          </data_file>
        </asset>
      </software_assets>
    </package>
  }
end
transport() click to toggle source
# File lib/shenzhen/plugins/itunesconnect.rb, line 43
def transport
  xcode = `xcode-select --print-path`.strip
  tool = File.join(File.dirname(xcode), "Applications/Application Loader.app/Contents/MacOS/itms/bin/iTMSTransporter").gsub(/\s/, '\ ')
  tool = File.join(File.dirname(xcode), "Applications/Application Loader.app/Contents/itms/bin/iTMSTransporter").gsub(/\s/, '\ ') if !File.exist?(tool)

  escaped_password = Shellwords.escape(@password)
  args = [tool, "-m upload", "-f Package.itmsp", "-u #{Shellwords.escape(@account)}", "-p #{escaped_password}"]
  command = args.join(' ')

  puts command.sub("-p #{escaped_password}", "-p ******") if $verbose

  output = `#{command} 2> /dev/null`
  puts output.chomp if $verbose

  raise "Failed to upload package to iTunes Connect" unless $?.exitstatus == 0

  output
end