class Produce::ItunesConnect

Public Instance Methods

create_new_app() click to toggle source
# File produce/lib/produce/itunes_connect.rb, line 19
def create_new_app
  application = fetch_application
  if application
    UI.success("App '#{Produce.config[:app_identifier]}' already exists (#{application.id}), nothing to do on App Store Connect")
    # Nothing to do here
  else
    emails = Produce.config[:itc_users] || []
    user_ids = []
    unless emails.empty?
      UI.message("Verifying users exist before creating app...")
      user_ids = find_user_ids(emails: emails)
    end

    UI.success("Creating new app '#{Produce.config[:app_name]}' on App Store Connect")

    platforms = Produce.config[:platforms] || [Produce.config[:platform]]

    platforms = platforms.map do |platform|
      Spaceship::ConnectAPI::Platform.map(platform)
    end

    # Produce.config[:itc_users]
    application = Spaceship::ConnectAPI::App.create(
      name: Produce.config[:app_name],
      version_string: Produce.config[:app_version] || "1.0",
      sku: Produce.config[:sku].to_s,
      primary_locale: language,
      bundle_id: app_identifier,
      platforms: platforms,
      company_name: Produce.config[:company_name]
    )

    application = fetch_application
    counter = 0
    while application.nil?
      counter += 1
      UI.crash!("Couldn't find newly created app on App Store Connect - please check the website for more information") if counter == 200

      # Since 2016-08-10 App Store Connect takes some time to actually list the newly created application
      # We have no choice but to poll to see if the newly created app is already available
      UI.message("Waiting for the newly created application to be available on App Store Connect...")
      sleep(15)
      application = fetch_application
    end

    UI.crash!("Something went wrong when creating the new app - it's not listed in the App's list") unless application

    UI.message("Ensuring version number")
    platforms.each do |platform|
      application.ensure_version!(Produce.config[:app_version], platform: platform) if Produce.config[:app_version]
    end

    # Add users to app
    unless user_ids.empty?
      application.add_users(user_ids: user_ids)
      UI.message("Successfuly added #{user_ids.size} #{user_ids.count == 1 ? 'user' : 'users'} to app")
    end

    UI.success("Successfully created new app '#{Produce.config[:app_name]}' on App Store Connect with ID #{application.id}")
  end

  return application.id
end
find_user_ids(emails: nil) click to toggle source
# File produce/lib/produce/itunes_connect.rb, line 83
def find_user_ids(emails: nil)
  emails ||= []
  users = Spaceship::ConnectAPI::User.all.select do |user|
    emails.include?(user.email)
  end

  diff_emails = emails - users.map(&:email)
  unless diff_emails.empty?
    raise "Could not find users with emails of: #{diff_emails.join(',')}"
  end

  return users.map(&:id)
end
run() click to toggle source
# File produce/lib/produce/itunes_connect.rb, line 8
def run
  @full_bundle_identifier = app_identifier
  @full_bundle_identifier.gsub!('*', Produce.config[:bundle_identifier_suffix].to_s) if wildcard_bundle?

  # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
  # Prompts select team if multiple teams and none specified
  Spaceship::ConnectAPI.login(Produce.config[:username], nil, use_portal: false, use_tunes: true)

  create_new_app
end

Private Instance Methods

app_identifier() click to toggle source
# File produce/lib/produce/itunes_connect.rb, line 111
def app_identifier
  Produce.config[:app_identifier].to_s
end
fetch_application() click to toggle source
# File produce/lib/produce/itunes_connect.rb, line 103
def fetch_application
  Spaceship::ConnectAPI::App.find(@full_bundle_identifier)
end
language() click to toggle source

Makes sure to get the value for the language Instead of using the user's value `UK English` spaceship should send `en-UK`

# File produce/lib/produce/itunes_connect.rb, line 117
def language
  @language = Produce.config[:language]

  unless FastlaneCore::Languages::ALL_LANGUAGES.include?(@language)
    mapped_language = Spaceship::Tunes::LanguageConverter.from_standard_to_itc_locale(@language)
    if mapped_language.to_s.empty?
      message = [
        "Sending language name is deprecated. Could not map '#{@language}' to a locale.",
        "Please enter one of available languages: #{FastlaneCore::Languages::ALL_LANGUAGES}"
      ].join("\n")
      UI.user_error!(message)
    end

    UI.deprecated("Sending language name is deprecated. '#{@language}' has been mapped to '#{mapped_language}'.")
    UI.deprecated("Please enter one of available languages: #{FastlaneCore::Languages::ALL_LANGUAGES}")

    @language = mapped_language
  end

  return @language
end
platform() click to toggle source
# File produce/lib/produce/itunes_connect.rb, line 99
def platform
  (Produce.config[:platforms] || []).first || Produce.config[:platform]
end
wildcard_bundle?() click to toggle source
# File produce/lib/produce/itunes_connect.rb, line 107
def wildcard_bundle?
  return app_identifier.end_with?("*")
end