Class: Produce::ItunesConnect

Inherits:
Object
  • Object
show all
Defined in:
produce/lib/produce/itunes_connect.rb

Instance Method Summary collapse

Instance Method Details

#create_new_appObject



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 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) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
# 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

#runObject



8
9
10
11
12
13
14
15
16
17
# 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.(Produce.config[:username], nil, use_portal: false, use_tunes: true)

  create_new_app
end