Class: FastlaneCore::ItunesTransporter

Inherits:
Object
  • Object
show all
Defined in:
lib/fastlane_core/itunes_transporter.rb

Constant Summary collapse

TWO_STEP_HOST_PREFIX =
"deliver.appspecific"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user = nil, password = nil, use_shell_script = false, provider_short_name = nil) ⇒ ItunesTransporter

Returns a new instance of the iTunesTransporter. If no username or password given, it will be taken from the #CredentialsManager::AccountManager

Parameters:

  • use_shell_script (defaults to: false)

    if true, forces use of the iTMSTransporter shell script. if false, allows a direct call to the iTMSTransporter Java app (preferred). see: github.com/fastlane/fastlane/pull/4003

  • provider_short_name (defaults to: nil)

    The provider short name to be given to the iTMSTransporter to identify the correct team for this work. The provider short name is usually your Developer Portal team ID, but in certain cases it is different! see: github.com/fastlane/fastlane/issues/1524#issuecomment-196370628 for more information about how to use the iTMSTransporter to list your provider short names



291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
# File 'lib/fastlane_core/itunes_transporter.rb', line 291

def initialize(user = nil, password = nil, use_shell_script = false, provider_short_name = nil)
  # Xcode 6.x doesn't have the same iTMSTransporter Java setup as later Xcode versions, so
  # we can't default to using the better direct Java invocation strategy for those versions.
  use_shell_script ||= Helper.is_mac? && Helper.xcode_version.start_with?('6.')
  use_shell_script ||= Feature.enabled?('FASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPT')

  # First, see if we have an application specific password
  data = CredentialsManager::AccountManager.new(user: user,
                                              prefix: TWO_STEP_HOST_PREFIX)
  @user = data.user
  @password ||= data.password(ask_if_missing: false)

  if @password.to_s.length == 0
    # No specific password found, just using the iTC/Dev Portal one
    # default to the given password here
    data = CredentialsManager::AccountManager.new(user: user,
                                              password: password)
    @user = data.user
    @password ||= data.password
  end
  @transporter_executor = use_shell_script ? ShellScriptTransporterExecutor.new : JavaTransporterExecutor.new
  @provider_short_name = provider_short_name
end

Class Method Details

.hide_transporter_outputObject

This will be called from the Deliverfile, and disables the logging of the transporter output



271
272
273
# File 'lib/fastlane_core/itunes_transporter.rb', line 271

def self.hide_transporter_output
  @hide_transporter_output = !$verbose
end

.hide_transporter_output?Boolean

Returns:

  • (Boolean)


275
276
277
# File 'lib/fastlane_core/itunes_transporter.rb', line 275

def self.hide_transporter_output?
  @hide_transporter_output
end

Instance Method Details

#download(app_id, dir = nil) ⇒ Bool

Downloads the latest version of the app metadata package from iTC.

Parameters:

  • app_id (Integer)

    The unique App ID

  • dir (String) (defaults to: nil)

    the path in which the package file should be stored

Returns:

  • (Bool)

    True if everything worked fine

Raises:

  • (Deliver::TransporterTransferError)

    when something went wrong when transfering



321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
# File 'lib/fastlane_core/itunes_transporter.rb', line 321

def download(app_id, dir = nil)
  dir ||= "/tmp"

  UI.message("Going to download app metadata from iTunes Connect")
  command = @transporter_executor.build_download_command(@user, @password, app_id, dir, @provider_short_name)
  UI.verbose(@transporter_executor.build_download_command(@user, 'YourPassword', app_id, dir, @provider_short_name))

  begin
    result = @transporter_executor.execute(command, ItunesTransporter.hide_transporter_output?)
  rescue TransporterRequiresApplicationSpecificPasswordError => ex
    handle_two_step_failure(ex)
    return download(app_id, dir)
  end

  return result if Helper.is_test?

  itmsp_path = File.join(dir, "#{app_id}.itmsp")
  successful = result && File.directory?(itmsp_path)

  if successful
    UI.success("✅ Successfully downloaded the latest package from iTunes Connect to #{itmsp_path}")
  else
    handle_error(@password)
  end

  successful
end

#upload(app_id, dir) ⇒ Bool

Uploads the modified package back to iTunes Connect

Parameters:

  • app_id (Integer)

    The unique App ID

  • dir (String)

    the path in which the package file is located

Returns:

  • (Bool)

    True if everything worked fine

Raises:

  • (Deliver::TransporterTransferError)

    when something went wrong when transfering



355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
# File 'lib/fastlane_core/itunes_transporter.rb', line 355

def upload(app_id, dir)
  actual_dir = File.join(dir, "#{app_id}.itmsp")

  UI.message("Going to upload updated app to iTunes Connect")
  UI.success("This might take a few minutes. Please don't interrupt the script.")

  command = @transporter_executor.build_upload_command(@user, @password, actual_dir, @provider_short_name)
  UI.verbose(@transporter_executor.build_upload_command(@user, 'YourPassword', actual_dir, @provider_short_name))

  begin
    result = @transporter_executor.execute(command, ItunesTransporter.hide_transporter_output?)
  rescue TransporterRequiresApplicationSpecificPasswordError => ex
    handle_two_step_failure(ex)
    return upload(app_id, dir)
  end

  if result
    UI.success("-" * 102)
    UI.success("Successfully uploaded package to iTunes Connect. It might take a few minutes until it's visible online.")
    UI.success("-" * 102)

    FileUtils.rm_rf(actual_dir) unless Helper.is_test? # we don't need the package any more, since the upload was successful
  else
    handle_error(@password)
  end

  result
end