Class: Deliver::SubmitForReview

Inherits:
Object
  • Object
show all
Defined in:
deliver/lib/deliver/submit_for_review.rb

Instance Method Summary collapse

Instance Method Details

#find_build(candidate_builds) ⇒ Object


100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'deliver/lib/deliver/submit_for_review.rb', line 100

def find_build(candidate_builds)
  if (candidate_builds || []).count == 0
    UI.user_error!("Could not find any available candidate builds on App Store Connect to submit")
  end

  build = candidate_builds.first
  candidate_builds.each do |b|
    if b.upload_date > build.upload_date
      build = b
    end
  end

  return build
end

#select_build(options) ⇒ Object


32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'deliver/lib/deliver/submit_for_review.rb', line 32

def select_build(options)
  app = options[:app]
  v = app.edit_version(platform: options[:platform])

  if options[:build_number] && options[:build_number] != "latest"
    UI.message("Selecting existing build-number: #{options[:build_number]}")
    build = v.candidate_builds.detect { |a| a.build_version == options[:build_number] }
    unless build
      UI.user_error!("Build number: #{options[:build_number]} does not exist")
    end
  else
    UI.message("Selecting the latest build...")
    build = wait_for_build(app)
  end
  UI.message("Selecting build #{build.train_version} (#{build.build_version})...")

  v.select_build(build)
  v.save!

  UI.success("Successfully selected build")
end

#submit!(options) ⇒ Object


5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'deliver/lib/deliver/submit_for_review.rb', line 5

def submit!(options)
  app = options[:app]
  select_build(options)

  UI.message("Submitting the app for review...")
  submission = app.create_submission(platform: options[:platform])

  # Set app submission information
  # Default Values
  submission.content_rights_contains_third_party_content = false
  submission.content_rights_has_rights = true
  submission.add_id_info_uses_idfa = false

  # User Values
  if options[:submission_information]
    options[:submission_information].each do |key, value|
      UI.message("Setting '#{key}' to '#{value}'...")
      submission.send("#{key}=", value)
    end
  end

  # Finalize app submission
  submission.complete!

  UI.success("Successfully submitted the app for review!")
end

#wait_for_build(app) ⇒ Object


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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'deliver/lib/deliver/submit_for_review.rb', line 54

def wait_for_build(app)
  UI.user_error!("Could not find app with app identifier") unless app

  start = Time.now
  build = nil

  loop do
    # Sometimes candidate_builds don't appear immediately after submittion
    # Wait for candidate_builds to appear on App Store Connect
    # Issue https://github.com/fastlane/fastlane/issues/10411
    candidate_builds = app.latest_version.candidate_builds
    if (candidate_builds || []).count == 0
      UI.message("Waiting for candidate builds to appear...")
      if (Time.now - start) > (60 * 5)
        UI.user_error!("Could not find any available candidate builds on App Store Connect to submit")
      else
        sleep(30)
        next
      end
    end

    latest_build = find_build(candidate_builds)
    # Sometimes latest build will disappear and a different build would get selected
    # Only set build if no latest build found or if same build versions as previously fetched build
    # Issue: https://github.com/fastlane/fastlane/issues/10945
    if build.nil? || (latest_build && latest_build.train_version == build.train_version && latest_build.build_version == build.build_version)
      build = latest_build
    end

    return build if build && build.processing == false

    if build
      UI.message("Waiting App Store Connect processing for build #{build.train_version} (#{build.build_version})... this might take a while...")
    else
      UI.message("Waiting App Store Connect processing for build... this might take a while...")
    end

    if (Time.now - start) > (60 * 5)
      UI.message("")
      UI.message("You can tweet: \"App Store Connect #iosprocessingtime #{((Time.now - start) / 60).round} minutes\"")
    end
    sleep(30)
  end
  nil
end