fastlane: [!] undefined method `any?' for nil:NilClass (NoMethodError)
Since the Apple API update i have not been able to upload screenshots. Nothing changed in my fastfile but i keep getting this error. Im not sure how to fix this:
/usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/upload_screenshots.rb:138:in block in upload_screenshots': [!] undefined method
any?’ for nil:NilClass (NoMethodError)
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:94:in block in iterate_over_screenshots_per_display_type' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:93:in
each’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:93:in with_index' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:93:in
iterate_over_screenshots_per_display_type’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:88:in block in iterate_over_screenshots_per_language' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:84:in
each’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:84:in iterate_over_screenshots_per_language' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:74:in
block in each_local_screenshot’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:73:in each' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/app_screenshot_iterator.rb:73:in
each_local_screenshot’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/upload_screenshots.rb:131:in upload_screenshots' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/upload_screenshots.rb:60:in
upload’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/runner.rb:123:in upload_metadata' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/deliver/lib/deliver/runner.rb:42:in
run’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/actions/upload_to_app_store.rb:17:in run' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:263:in
block (2 levels) in execute_action’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/actions/actions_helper.rb:50:in execute_action' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:255:in
block in execute_action’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:229:in chdir' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:229:in
execute_action’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:157:in trigger_action_by_name' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/fast_file.rb:159:in
method_missing’
from Fastfile:349:in block (2 levels) in parsing_binding' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/lane.rb:33:in
call’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:204:in try_switch_to_lane' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:146:in
trigger_action_by_name’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/fast_file.rb:159:in method_missing' from Fastfile:342:in
block (3 levels) in parsing_binding’
from Fastfile:339:in each' from Fastfile:339:in
block (2 levels) in parsing_binding’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/lane.rb:33:in call' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:49:in
block in execute’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:45:in chdir' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/runner.rb:45:in
execute’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/lane_manager.rb:47:in cruise_lane' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/command_line_handler.rb:36:in
handle’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/commands_generator.rb:108:in block (2 levels) in run' from /usr/local/lib/ruby/gems/2.4.0/gems/commander-fastlane-4.4.6/lib/commander/command.rb:178:in
call’
from /usr/local/lib/ruby/gems/2.4.0/gems/commander-fastlane-4.4.6/lib/commander/command.rb:153:in run' from /usr/local/lib/ruby/gems/2.4.0/gems/commander-fastlane-4.4.6/lib/commander/runner.rb:476:in
run_active_command’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb:76:in run!' from /usr/local/lib/ruby/gems/2.4.0/gems/commander-fastlane-4.4.6/lib/commander/delegates.rb:15:in
run!’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/commands_generator.rb:352:in run' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/commands_generator.rb:41:in
start’
from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/fastlane/lib/fastlane/cli_tools_distributor.rb:119:in take_off' from /usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.156.0/bin/fastlane:23:in
<top (required)>’
from /usr/local/bin/fastlane:23:in load' from /usr/local/bin/fastlane:23:in
<main>’
Could anybody point me in the right direction on how to fix this? We have several .ENV files, for now im only trying to update with one, all points to metadata folders.

And the folder contains screenshots:

The upload screenshot function looks like this:
####### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Upload screenshots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ########
desc “Upload all screenshots” lane :upload_all_screenshots do files = Dir[“env/.env.*”] files.each { |envfile| Dotenv.overload(envfile) upload_screenshots } end
desc “->upload screenshots” private_lane :upload_screenshots do
deliver(
force: true,
skip_screenshots: false,
skip_binary_upload: true,
overwrite_screenshots: true,
app_identifier: ENV["APP_IDENTIFIER"],
skip_metadata: false
)
move_env_to_done
end
Hope anybody can help, so i dont need to upload 250 apps screenshot localized in 5 languages to all screensizes by hand 😃
### Thank you fastlane bot:
🚫 fastlane environment 🚫
Stack
Key | Value |
---|---|
OS | 10.15.6 |
Ruby | 2.4.2 |
Bundler? | false |
Git | git version 2.7.1 |
Installation Source | /usr/local/bin/fastlane |
Host | Mac OS X 10.15.6 (19G73) |
Ruby Lib Dir | /usr/local/Cellar/ruby/2.4.2_1/lib |
OpenSSL Version | OpenSSL 1.0.2l 25 May 2017 |
Is contained | false |
Is homebrew | false |
Is installed via Fabric.app | false |
Xcode Path | /Applications/Xcode.app/Contents/Developer/ |
Xcode Version | 11.6 |
System Locale
Error |
---|
No Locale with UTF8 found 🚫 |
fastlane files:
`./fastlane/Fastfile`
# Customise this file, documentation can be found here:
# https://github.com/fastlane/fastlane/tree/master/fastlane/docs
# All available actions: https://docs.fastlane.tools/actions
# can also be listed using the `fastlane actions` command
# Change the syntax highlighting to Ruby
# All lines starting with a # are ignored when running `fastlane`
# If you want to automatically update fastlane if a new version is available:
# update_fastlane
# This is the minimum version number required.
# Update this, if you use features of a newer version
# git clone https://username@github.com/username/repository.git
fastlane_version "2.54.0"
#######----------------------------------------- Fastlane -----------------------------------########
#require 'env/'
require('dotenv')#.config(path: 'env/')
#Dotenv.
#require('dotenv')
#Dotenv.load('env/')
path_to_envfiles = "env/"
default_platform :ios
progress_file_path = "Parameters/Progress.txt"
# Bliver kørt først
platform :ios do
before_all do|lane, options|
UI.header "Disse er envfiler bliver kørt:"
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
UI.command_output "#{ENV["SCHEME"]}"
}
sh "ruby ./assets/GenerateManual.rb"
File.open(progress_file_path, 'w') {}
progressvalue = "first"
open(progress_file_path, 'a') { |file| file.puts progressvalue }
# puts("before_all" + lane_context[SharedValues::ENVIRONMENT])
#
# if lane_context[SharedValues::ENVIRONMENT]!=nil
# puts("before_all er ikke nil")
# Dotenv.overload("env/.env." + lane_context[SharedValues::ENVIRONMENT])
# else
# puts("before_all er nil")
# Dotenv.overload(path_to_envfiles)
# lane_context[SharedValues::ENVIRONMENT] = path_to_envfiles
# end
#clear_derived_data
set_environment_variables options
#cocoapods
# ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."
end
before_each do |lane, options|
unless ENV["SCHEME"] == nil
progressvalue = "running #{lane_context[SharedValues::LANE_NAME]} for " + ENV["SCHEME"]
open(progress_file_path, 'a') { |file| file.puts progressvalue }
end
#puts("before_each" + lane_context[SharedValues::ENVIRONMENT])
# if lane_context[SharedValues::ENVIRONMENT]!=nil
# puts("before_each er ikke nil")
# Dotenv.overload("env/.env." + lane_context[SharedValues::ENVIRONMENT])
# else
# puts("before_each er nil")
# Dotenv.overload(path_to_envfiles)
# lane_context[SharedValues::ENVIRONMENT] = path_to_envfiles
# end
#puts("before_each" + lane_context[SharedValues::ENVIRONMENT])
end
#######----------------------------------------- Test -----------------------------------########
desc "Til test"
lane :test_plist_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
test_plist
puts "cd .. && fastlane get_metadata --env " + envfile.gsub('env/.env.', '')
}
end
desc "->Build and upload app + metadata (not screenshots) to iTunesConnect"
private_lane :test_plist do
puts("test_plist")
puts(ENV["PLIST_PATH"])
plist = get_info_plist_value(path: ENV["PLIST_PATH"], key: "CFBundleShortVersionString")
puts(plist)
watch_plist = get_info_plist_value(path: ENV["PLIST_WATCH_PATH"], key: "CFBundleDisplayName")
puts(watch_plist)
watch_extension_plist = get_info_plist_value(path: ENV["PLIST_WATCH_EXTENSION_PATH"], key: "CFBundleDisplayName")
puts(watch_extension_plist)
settings_plist = get_info_plist_value(path: ENV["PLIST_SETTINGS_PATH"], key: "api_login_url")
puts(settings_plist)
end
desc "Til test"
lane :get_all_env do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
puts( "#{ENV["SCHEME"]}")
}
#puts(envfile)
##files = files.map { |x| x.gsub('', '') }
#path_to_envfiles = envfile
#lane_context[SharedValues::ENVIRONMENT] = envfile
#update_versionnumber
#lane_context[SharedValues::ENVIRONMENT] = envfile.gsub('env/.env.', '')
end
#######----------------------------------- create new 'app' on AppStore ------------------------------########
desc "create new 'app' in itunes connect and downloads metadata and screenshots afterwards"
lane :create_appstore_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
create_appstore
}
get_metadata_all
get_screenshots_all
update_app_description_all
update_metadata_all
copy_default_screenshots_all
make_provisioning_profiles_all
end
desc "->create new app in itunes connect and downloads metadata and screenshots afterwards"
private_lane :create_appstore do
produce(
app_identifier: ENV["APP_IDENTIFIER"],
sku: ENV["APP_IDENTIFIER"],
app_name: ENV["APPSTORE_NAME"],
language: 'Danish',
app_version: '1.0'
# Optional
# App services can be enabled during app creation
# enable_services: {
#company_name: 'Wichtel Akademie München GmbH'
# app_group: "on" # Valid values: "on", "off"
# apple_pay: "on" # Valid values: "on", "off"
# associated_domains: "on" # Valid values: "on", "off"
# data_protection: "complete" # Valid values: "complete", "unlessopen", "untilfirstauth"
# game_center: "on" # Valid values: "on", "off"
# health_kit: "on" # Valid values: "on", "off"
# home_kit: "on" # Valid values: "on", "off"
# wireless_accessory: "on" # Valid values: "on", "off"
# icloud: "cloudkit" # Valid values: "legacy", "cloudkit"
# in_app_purchase: "on" # Valid values: "on", "off"
# inter_app_audio: "on" # Valid values: "on", "off"
# passbook: "on" # Valid values: "on", "off"
# push_notification: "on" # Valid values: "on", "off"
# siri_kit: "on" # Valid values: "on", "off"
# vpn_configuration: "on" # Valid values: "on", "off"
# }
)
move_env_to_done
end
#######----------------------------------------- appstore_upload ----------------------------------------########
desc "Build and upload all apps + metadata (not screenshots) to iTunesConnect"
lane :appstore_upload_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
appstore_upload
}
end
desc "->Build and upload app + metadata (not screenshots) to iTunesConnect"
private_lane :appstore_upload do
update_versionnumber
gym
deliver(
force: true,
skip_screenshots: false,
skip_binary_upload: false,
overwrite_screenshots: true,
app_identifier: ENV["APP_IDENTIFIER"],
ipa: "fastlane/ipa/" + ENV["SCHEME"] + ".ipa",
skip_metadata: true,
)
deliver(
force: true,
skip_screenshots: true,
skip_binary_upload: true,
overwrite_screenshots: false,
app_identifier: ENV["APP_IDENTIFIER"],
skip_metadata: false,
)
remove_ipa_file
move_env_to_done
end
#######----------------------------------------- testflight_upload -----------------------------------########
desc "Upload multible new Builds to TestFlight"
lane :testflight_upload_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
testflight_upload
}
end
desc "->Upload a new Build to TestFlight"
private_lane :testflight_upload do
update_versionnumber
gym
pilot(
skip_submission: true,
skip_waiting_for_build_processing: true,
app_identifier: ENV["APP_IDENTIFIER"],
ipa: "fastlane/ipa/" + ENV["SCHEME"] + ".ipa",
)
remove_ipa_file
move_env_to_done
end
####### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Upload ipa ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ########
desc "Upload all ipa"
lane :upload_ipa_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
upload_ipa
}
end
desc "->upload ipa"
private_lane :upload_ipa do
update_versionnumber
gym
deliver(
force: true,
skip_screenshots: true,
skip_binary_upload: false,
overwrite_screenshots: false,
app_identifier: ENV["APP_IDENTIFIER"],
skip_metadata: true
)
move_env_to_done
end
####### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Upload metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ########
desc "Upload all metadata"
lane :upload_all_metadata do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
upload_metadata
}
end
desc "->upload metadata"
private_lane :upload_metadata do
deliver(
force: true,
skip_screenshots: true,
skip_binary_upload: true,
overwrite_screenshots: false,
app_identifier: ENV["APP_IDENTIFIER"],
skip_metadata: false
)
move_env_to_done
end
####### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Upload screenshots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ########
desc "Upload all screenshots"
lane :upload_all_screenshots do
files = Dir["env/.env.*"]
files.each { |envfile|
puts("MORTEN DEBUG " + envfile)
Dotenv.overload(envfile)
upload_screenshots
}
end
desc "->upload screenshots"
private_lane :upload_screenshots do
deliver(
force: true,
skip_screenshots: false,
skip_binary_upload: true,
overwrite_screenshots: true,
app_identifier: ENV["APP_IDENTIFIER"],
skip_metadata: false
)
move_env_to_done
end
####### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Add Test Devices ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ########
desc "Add test devices"
lane :add_all_test_devices do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
add_all_testdevices
}
end
private_lane :add_all_testdevices do
register_devices(
devices: {
"Test Device 1" => "xxxxxxxxx",
"Test Device 2" => "xxxxxxxxx",
"Test Device 3" => "xxxxxxxxx",
"Test Device 4" => "xxxxxxxxx",
"Test Device 5" => "xxxxxxxxx",
"Test Device 5" => "xxxxxxxxx"
}
)
move_env_to_done
end
#######----------------------------------------- send_to_review -----------------------------------########
desc "Send all apps to review"
lane :send_to_review_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
send_to_review
puts "waiting 5 minuts until sending the next to review"
sleep(300)
}
end
desc "->Send app to appstore"
private_lane :send_to_review do
ENV["DELIVER_FORCE_OVERWRITE"] = "1"
deliver(
app_identifier: ENV["APP_IDENTIFIER"],
force: true,
skip_screenshots: true,
skip_app_version_update: true,
skip_metadata: true,
skip_binary_upload: true,
submit_for_review: true,
automatic_release: true,
reset_ratings: true
)
move_env_to_done
end
####### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Download data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ########
desc "Download both current metadata and screenshots from AppStore, for all apps, to the metadata/<customer>/ folder"
lane :get_metadata_and_screenshots_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
get_metadata
get_screenshots
move_env_to_done
}
end
desc "Download current metadata from AppStore, for all apps, to the metadata/<customer>/ folder"
lane :get_metadata_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
get_metadata
move_env_to_done
}
end
desc "->Download current metadata from AppStore to the metadata/<customer>/ folder"
private_lane :get_metadata do
ENV["DELIVER_FORCE_OVERWRITE"] = "1" #denne sørger for at der ikke bliver sagt nej til at overskrive. Hvis denne ikke er her bliver der ikke hentet noget.
sh "fastlane deliver download_metadata --app_identifier #{ENV['APP_IDENTIFIER']} --metadata_path #{ENV['METADATA_PATH']}"
end
desc "Download current screenshots from AppStore, for all apps, to the metadata/<customer>/screenshots/ folder"
lane :get_screenshots_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
get_screenshots
move_env_to_done
}
end
desc "->Download current screenshots from AppStore to the metadata/<customer>/screenshots/ folder"
private_lane :get_screenshots do
ENV["DELIVER_FORCE_OVERWRITE"] = "1" #denne sørger for at der ikke bliver sagt nej til at overskrive. Hvis denne ikke er her bliver der ikke hentet noget.
sh "fastlane deliver download_screenshots --app_identifier #{ENV['APP_IDENTIFIER']} --screenshots_path #{ENV['SCREENSHOTS_PATH']}"
end
desc "Generate a html preview from local metadata for all apps"
lane :get_summary_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
get_summary
}
end
desc "->Generate a html preview from local metadata"
private_lane :get_summary do
ENV["DELIVER_FORCE_OVERWRITE"] = "1" #denne sørger for at der ikke bliver sagt nej til at overskrive. Hvis denne ikke er her bliver der ikke hentet noget.
sh "cd .. && fastlane deliver generate_summary" # html_path #{ENV['METADATA_PATH']}"
# deliver(
# generate_summary
# #app_identifier: ENV["APP_IDENTIFIER"]
# )
move_env_to_done
end
####### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Update metadata on disc ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ########
#######-----------------------------------------copy_default_screenshots -----------------------------------########
desc "Copies default screenshots from the /Parameters/DefaultScreenShots folder to the Metadata folder for all apps."
lane :copy_default_screenshots_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
copy_default_screenshots
}
end
desc "->Copies default screenshots from the /Parameters/DefaultScreenShots folder to the Metadata folder"
private_lane :copy_default_screenshots do
path = ENV["METADATA_PATH"] + "/da/"
if Dir.exist?(path)
img_dir = Dir["Parameters/DefaultScreenShots/da"]
FileUtils.cp_r(img_dir, ENV["SCREENSHOTS_PATH"])
end
path = ENV["METADATA_PATH"] + "/fr-FR/"
if Dir.exist?(path)
img_dir = Dir["Parameters/DefaultScreenShots/fr-FR"]
FileUtils.cp_r(img_dir, ENV["SCREENSHOTS_PATH"])
end
path = ENV["METADATA_PATH"] + "/en-US/"
if Dir.exist?(path)
img_dir = Dir["Parameters/DefaultScreenShots/en-GB"]
FileUtils.cp_r(img_dir, ENV["SCREENSHOTS_PATH"])
end
path = ENV["METADATA_PATH"] + "/en-GB/"
if Dir.exist?(path)
img_dir = Dir["Parameters/DefaultScreenShots/en-GB"]
FileUtils.cp_r(img_dir, ENV["SCREENSHOTS_PATH"])
end
path = ENV["METADATA_PATH"] + "/de-DE/"
if Dir.exist?(path)
img_dir = Dir["Parameters/DefaultScreenShots/de-DE"]
FileUtils.cp_r(img_dir, ENV["SCREENSHOTS_PATH"])
end
path = ENV["METADATA_PATH"] + "/no/"
if Dir.exist?(path)
img_dir = Dir["Parameters/DefaultScreenShots/no"]
FileUtils.cp_r(img_dir, ENV["SCREENSHOTS_PATH"])
end
path = ENV["METADATA_PATH"] + "/ja/"
if Dir.exist?(path)
img_dir = Dir["Parameters/DefaultScreenShots/ja"]
FileUtils.cp_r(img_dir, ENV["SCREENSHOTS_PATH"])
end
move_env_to_done
end
#######----------------------------------------- update_metadata -----------------------------------########
desc "Update name.txt, marketing_url.txt, support_url.txt and keywords.txt for all apps. The metadata is defined in the env file"
lane :update_metadata_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
update_metadata
}
end
desc "->Update name.txt, marketing_url.txt, support_url.txt and keywords.txt. The metadata is defined in the env file"
private_lane :update_metadata do
path = ENV["METADATA_PATH"] + "/da/"
if Dir.exist?(path)
IO.write(path + "keywords.txt", ENV["APPSTORE_KEYWORDS_DK"])
IO.write(path + "marketing_url.txt", "https://nemborn.com")
IO.write(path + "support_url.txt", "https://nemborn.com")
IO.write(path + "name.txt", ENV["APPSTORE_NAME"])
end
path = ENV["METADATA_PATH"] + "/fr-FR/"
if Dir.exist?(path)
IO.write(path + "keywords.txt", ENV["APPSTORE_KEYWORDS_FR"])
IO.write(path + "marketing_url.txt", "https://nemborn.com")
IO.write(path + "support_url.txt", "https://nemborn.com")
IO.write(path + "name.txt", ENV["APPSTORE_NAME"])
end
path = ENV["METADATA_PATH"] + "/en-US/"
if Dir.exist?(path)
IO.write(path + "keywords.txt", ENV["APPSTORE_KEYWORDS_ENG"])
IO.write(path + "marketing_url.txt", "https://nemborn.com")
IO.write(path + "support_url.txt", "https://nemborn.com")
IO.write(path + "name.txt", ENV["APPSTORE_NAME"])
end
path = ENV["METADATA_PATH"] + "/en-GB/"
if Dir.exist?(path)
IO.write(path + "keywords.txt", ENV["APPSTORE_KEYWORDS_ENG"])
IO.write(path + "marketing_url.txt", "https://nemborn.com")
IO.write(path + "support_url.txt", "https://nemborn.com")
IO.write(path + "name.txt", ENV["APPSTORE_NAME"])
end
path = ENV["METADATA_PATH"] + "/de-DE/"
if Dir.exist?(path)
IO.write(path + "keywords.txt", ENV["APPSTORE_KEYWORDS_GER"])
IO.write(path + "marketing_url.txt", "https://nemborn.com")
IO.write(path + "support_url.txt", "https://nemborn.com")
IO.write(path + "name.txt", ENV["APPSTORE_NAME"])
end
path = ENV["METADATA_PATH"] + "/no/"
if Dir.exist?(path)
IO.write(path + "keywords.txt", ENV["APPSTORE_KEYWORDS_NO"])
IO.write(path + "marketing_url.txt", "https://nemborn.com")
IO.write(path + "support_url.txt", "https://nemborn.com")
IO.write(path + "name.txt", ENV["APPSTORE_NAME"])
end
path = ENV["METADATA_PATH"] + "/ja/"
if Dir.exist?(path)
IO.write(path + "keywords.txt", ENV["APPSTORE_KEYWORDS_ENG"])
IO.write(path + "marketing_url.txt", "https://nemborn.com")
IO.write(path + "support_url.txt", "https://nemborn.com")
IO.write(path + "name.txt", ENV["APPSTORE_NAME"])
end
if Dir.exist?(ENV["METADATA_PATH"])
IO.write(ENV["METADATA_PATH"] + "/copyright.txt", "#{Time.now.year} Test A/S")
end
move_env_to_done
end
#######----------------------------------------- update_app_description -----------------------------------########
desc "Update description for all apps. The description is defined in the 'Parameters/description_<language>.txt' file"
lane :update_app_description_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
update_app_description
}
end
desc "->Update description. The description is defined in the 'Parameters/description_<language>.txt' file"
private_lane :update_app_description do
path = ENV["METADATA_PATH"] + "/da/description.txt"
if File.exist?(path)
File.open(path, 'w') {} #tømmer tidligere indhold
File.foreach('Parameters/description_danish.txt') { |f|
name = f.gsub("##APPSTORE_NAME##",ENV["APPSTORE_NAME"])
cus = name.gsub("##CUSTOMER_NAME##",ENV["CUSTOMER_NAME"])
open(path, 'a') { |file|
file.puts cus
}
}
end
path = ENV["METADATA_PATH"] + "/fr-FR/description.txt"
if File.exist?(path)
File.open(path, 'w') {} #tømmer tidligere indhold
File.foreach('Parameters/description_french.txt') { |f|
name = f.gsub("##APPSTORE_NAME##",ENV["APPSTORE_NAME"])
cus = name.gsub("##CUSTOMER_NAME##",ENV["CUSTOMER_NAME"])
open(path, 'a') { |file|
file.puts cus
}
}
end
path = ENV["METADATA_PATH"] + "/en-US/description.txt"
if File.exist?(path)
File.open(path, 'w') {} #tømmer tidligere indhold
File.foreach('Parameters/description_english.txt') { |f|
name = f.gsub("##APPSTORE_NAME##",ENV["APPSTORE_NAME"])
cus = name.gsub("##CUSTOMER_NAME##",ENV["CUSTOMER_NAME"])
open(path, 'a') { |file|
file.puts cus
}
}
end
path = ENV["METADATA_PATH"] + "/en-GB/description.txt"
if File.exist?(path)
File.open(path, 'w') {} #tømmer tidligere indhold
File.foreach('Parameters/description_english.txt') { |f|
name = f.gsub("##APPSTORE_NAME##",ENV["APPSTORE_NAME"])
cus = name.gsub("##CUSTOMER_NAME##",ENV["CUSTOMER_NAME"])
open(path, 'a') { |file|
file.puts cus
}
}
end
path = ENV["METADATA_PATH"] + "/de-DE/description.txt"
if File.exist?(path)
File.open(path, 'w') {} #tømmer tidligere indhold
File.foreach('Parameters/description_german.txt') { |f|
name = f.gsub("##APPSTORE_NAME##",ENV["APPSTORE_NAME"])
cus = name.gsub("##CUSTOMER_NAME##",ENV["CUSTOMER_NAME"])
open(path, 'a') { |file|
file.puts cus
}
}
end
path = ENV["METADATA_PATH"] + "/no/description.txt"
if File.exist?(path)
File.open(path, 'w') {} #tømmer tidligere indhold
File.foreach('Parameters/description_norwegian.txt') { |f|
name = f.gsub("##APPSTORE_NAME##",ENV["APPSTORE_NAME"])
cus = name.gsub("##CUSTOMER_NAME##",ENV["CUSTOMER_NAME"])
open(path, 'a') { |file|
file.puts cus
}
}
end
path = ENV["METADATA_PATH"] + "/ja/description.txt"
if File.exist?(path)
File.open(path, 'w') {} #tømmer tidligere indhold
File.foreach('Parameters/description_japanese.txt') { |f|
name = f.gsub("##APPSTORE_NAME##",ENV["APPSTORE_NAME"])
cus = name.gsub("##CUSTOMER_NAME##",ENV["CUSTOMER_NAME"])
open(path, 'a') { |file|
file.puts cus
}
}
end
path = ENV["METADATA_PATH"] + "/no/description.txt"
if File.exist?(path)
File.open(path, 'w') {} #tømmer tidligere indhold
File.foreach('Parameters/description_no.txt') { |f|
name = f.gsub("##APPSTORE_NAME##",ENV["APPSTORE_NAME"])
cus = name.gsub("##CUSTOMER_NAME##",ENV["CUSTOMER_NAME"])
open(path, 'a') { |file|
file.puts cus
}
}
end
move_env_to_done
end
#######----------------------------------------- update_releasenotes -----------------------------------########
desc "Update releasenotes for all apps. The release-notes are defined in the 'Parameters/release_notes_<language>.txt' file"
lane :update_releasenotes_all do
puts("\n\n-----------------------------Release notes--------------------\n\n")
file = File.open("Parameters/release_notes_danish.txt", "rb")
puts("Danish releasenotes:-------- \n\n\t\t" + file.read.gsub(/\n/,"\n\t\t") + "\n")
file = File.open("Parameters/release_notes_english.txt", "rb")
puts("English releasenotes:-------- \n\n\t\t" + file.read.gsub(/\n/,"\n\t\t") + "\n")
file = File.open('Parameters/release_notes_french.txt', "rb")
puts("French releasenotes:-------- \n\n\t\t" + file.read.gsub(/\n/,"\n\t\t") + "\n")
file = File.open('Parameters/release_notes_german.txt', "rb")
puts("German releasenotes:-------- \n\n\t\t" + file.read.gsub(/\n/,"\n\t\t") + "\n")
file = File.open('Parameters/release_notes_norwegian.txt', "rb")
puts("norwegian releasenotes:-------- \n\n\t\t" + file.read.gsub(/\n/,"\n\t\t") + "\n")
file = File.open('Parameters/release_notes_japanese.txt', "rb")
puts("Japanese releasenotes:------- \n\n\t\t" + file.read.gsub(/\n/,"\n\t\t") + "\n")
puts("\n\n-----------------------------Release notes--------------------\n\n")
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
update_releasenotes
}
end
desc "->Update releasenotes. The releasenotes is defined in the 'ReleaseNotes/release_notes_<language>.txt' file"
private_lane :update_releasenotes do
path = ENV["METADATA_PATH"] + "/da/release_notes.txt"
if File.exist?(path)
File.open('Parameters/release_notes_danish.txt') do |f|
IO.write(path, f.read)
end
end
path = ENV["METADATA_PATH"] + "/fr-FR/release_notes.txt"
if File.exist?(path)
File.open('Parameters/release_notes_french.txt') do |f|
IO.write(path, f.read)
end
end
path = ENV["METADATA_PATH"] + "/en-US/release_notes.txt"
if File.exist?(path)
File.open('Parameters/release_notes_english.txt') do |f|
IO.write(path, f.read)
end
end
path = ENV["METADATA_PATH"] + "/en-GB/release_notes.txt"
if File.exist?(path)
File.open('Parameters/release_notes_english.txt') do |f|
IO.write(path, f.read)
end
end
path = ENV["METADATA_PATH"] + "/de-DE/release_notes.txt"
if File.exist?(path)
File.open('Parameters/release_notes_german.txt') do |f|
IO.write(path, f.read)
end
end
path = ENV["METADATA_PATH"] + "/no/release_notes.txt"
if File.exist?(path)
File.open('Parameters/release_notes_norwegian.txt') do |f|
IO.write(path, f.read)
end
end
path = ENV["METADATA_PATH"] + "/ja/release_notes.txt"
if File.exist?(path)
File.open('Parameters/release_notes_japanese.txt') do |f|
IO.write(path, f.read)
end
end
move_env_to_done
end
desc "Update all release notes, metadata, description"
lane :update_all_type_of_metadata do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
update_releasenotes
update_app_description
update_metadata
}
end
#######----------------------------------------- update_versionnumber -----------------------------------########
desc "Update_versionnumber læser versions-nr fra Parameters/version_number.txt filen"
desc "Hvis dette er det samme, som i versions-nummeret p-listen opdateres build-nummeret i p-listen"
desc "Hvis dette er højere end versions-nummeret p-listen opdateresversions-nummeret i p-listen til det nye versions-nummer"
lane :update_versionnumber do
puts("Update_versionnumber")
puts(ENV["PLIST_PATH"])
appType = ENV["TYPE"]
version_number_plist = get_info_plist_value(path: ENV["PLIST_PATH"], key: "CFBundleShortVersionString") #læser versionsnr fra plist
build_number_plist = get_info_plist_value(path: ENV["PLIST_PATH"], key: "CFBundleVersion") #læser buildnr fra plist
version_number_file = File.foreach('Parameters/version_number.txt').first # læser første linje i Parameters/version_number.txt aka defineret versionsnumber
#build_number_plist = latest_testflight_build_number(version: version_number_file, app_identifier: ENV["APP_IDENTIFIER"]) # ind kommenter for at sætte build-nummeret til det nyeste fra testflight
unless version_number_file == "\n" # Checker om der står noget i Parameters/version_number.txt filen
version_number_file = version_number_file.gsub(/\n/,"")
clean_version_number_plist = version_number_plist.gsub(".","")
clean_version_number_file = version_number_file.gsub(".","")
if clean_version_number_plist == clean_version_number_file # Hvis versionnummer i Parameters/version_number.txt og plist er de samme lægges der bare 1 til build-nummeret.
new_build_number_plist = build_number_plist.to_i + 1
set_info_plist_value(path: ENV["PLIST_PATH"], key: "CFBundleVersion", value: "#{new_build_number_plist}") # Skriver nyt Build-number i plisten
if appType["parent"]
puts("########################################################")
set_info_plist_value(path: ENV["PLIST_WATCH_PATH"], key: "CFBundleVersion", value: "#{new_build_number_plist}") # Build-number sættes til 1 i plisten
set_info_plist_value(path: ENV["PLIST_WATCH_EXTENSION_PATH"], key: "CFBundleVersion", value: "#{new_build_number_plist}") # Build-number sættes til 1 i plisten
end
puts("Build-number opdateret til: #{new_build_number_plist}")
elsif clean_version_number_plist.to_i < clean_version_number_file.to_i # Hvis versions-nummeret i Parameters/version_number.txt filen er højere end versions-nummeret i plisten
set_info_plist_value(path: ENV["PLIST_PATH"], key: "CFBundleShortVersionString", value: version_number_file) # Skriver nyt versions-nummer i plisten
set_info_plist_value(path: ENV["PLIST_PATH"], key: "CFBundleVersion", value: "1") # Build-number sættes til 1 i plisten
if appType["parent"]
puts("########################################################")
set_info_plist_value(path: ENV["PLIST_WATCH_PATH"], key: "CFBundleShortVersionString", value: version_number_file) # Skriver nyt versions-nummer i plisten
set_info_plist_value(path: ENV["PLIST_WATCH_PATH"], key: "CFBundleVersion", value: "1") # Build-number sættes til 1 i plisten
set_info_plist_value(path: ENV["PLIST_WATCH_EXTENSION_PATH"], key: "CFBundleShortVersionString", value: version_number_file) # Skriver nyt versions-nummer i plisten
set_info_plist_value(path: ENV["PLIST_WATCH_EXTENSION_PATH"], key: "CFBundleVersion", value: "1") # Build-number sættes til 1 i plisten
end
puts("Version-nummeret opdateret til: #{version_number_file} i plisten")
puts("Build-nummeret sat til 1 i plisten")
else
puts("Versions-nummeret i din pliste er højere end versions-nummeret i din Parameters/version_number.txt fil")
end
else
puts("Der er ikke angivet et vertionsnummer i Parameters/version_number.txt")
end
end
####### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ANDET ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ########
#######----------------------------------------- ProvisioningProfiles -----------------------------------########
desc "Make provisionProfiles for all apps. Distribution and develop. The name is defined in the envFile The certificate is saved in ~/Certificates/ and ~/Certificates/Test/ (These folders have to exist)"
lane :make_provisioning_profiles_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
make_provisioning_profiles
#sh "cd .. && fastlane get_metadata --env " + envfile.gsub('env/.env.', '')
}
end
desc "->Make provisionProfiles. The certificate is saved in ~/Certificates/Test"
private_lane :make_provisioning_profiles do
sigh(
force: true,
app_identifier: ENV["APP_IDENTIFIER"],
output_path: "~/Certificates/",
filename: ENV["PROVISIONING_PROFILE_NAME"] + ".mobileprovision",
provisioning_name: ENV["PROVISIONING_PROFILE_NAME"]
)
sigh(
force: true,
app_identifier: ENV["APP_IDENTIFIER"],
output_path: "~/Certificates/Test/",
development: true,
filename: ENV["PROVISIONING_PROFILE_NAME"] + " TEST.mobileprovision",
provisioning_name: ENV["PROVISIONING_PROFILE_NAME"] + " TEST"
)
move_env_to_done
end
#######----------------------------------------- TestFlight testing -----------------------------------########
desc "Invite testers to test multiple apps on TestFlight. Testers are defined in ./assets/testflight_testers.csv"
lane :testflight_add_default_testers_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
testflight_add_default_testers
}
end
desc "->Invite testers to test apps on TestFlight"
private_lane :testflight_add_default_testers do
sh "fastlane pilot import -c ./assets/testflight_testers.csv -a #{ENV['APP_IDENTIFIER']}"
move_env_to_done
end
desc "Invite user to test multiple apps on TestFlight !!!Remember to change apple_id"
lane :testflight_add_tester_all do
files = Dir["env/.env.*"]
files.each { |envfile|
Dotenv.overload(envfile)
testflight_add_tester
}
end
desc "->Invite user to test app on TestFlight !!!Remember to change apple_id"
private_lane :testflight_add_tester do
move_env_to_done
end
##------------------------------------------------ Helpers ----------------------------------------##
desc "->If folder named env/done. The envFile is moved after use"
private_lane :move_env_to_done do
if File.exist?("env/.env.#{ENV["ENVNAME"]}") && Dir.exist?("env/done")
File.rename "env/.env.#{ENV["ENVNAME"]}", "env/done/.env.#{ENV["ENVNAME"]}"
end
end
desc "->Delete ipa file and dSYM file"
private_lane :remove_ipa_file do
if File.exist?("ipa/#{ENV["SCHEME"]}.ipa")
File.delete("ipa/#{ENV["SCHEME"]}.app.dSYM.zip")
File.delete("ipa/#{ENV["SCHEME"]}.ipa")
end
end
desc "->Set the common environment variables for all lanes run"
private_lane :set_environment_variables do |options|
appleId = ENV["APPLE_ID"] || options[:apple_id]
ENV["PILOT_USERNAME"] = appleId
ENV["SIGH_USERNAME"] = appleId
ENV["PEM_USERNAME"] = appleId
ENV["CERT_USERNAME"] = appleId
ENV["PRODUCE_USERNAME"] = appleId
ENV["DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS"] = "-t DAV"
ENV["FASTLANE_ITC_TEAM_ID"] = ENV["ITC_TEAM"] || ''
ENV["FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"]= "xxxxxxxxx"
end
desc "->Runs after each lane is called"
after_each do |lane, options|
unless ENV["SCHEME"] == nil
progressvalue = "ended #{lane_context[SharedValues::LANE_NAME]} for " + ENV["SCHEME"]
lines = File.read(progress_file_path)
lines = lines.strip.split("\n")
lines.pop
File.open(progress_file_path, "w+") do |f|
f.puts(lines)
end
open(progress_file_path, 'a') { |file| file.puts progressvalue }
end
end
desc "->Runs after all is done"
after_all do |lane|
# This block is called, only if the executed lane was successful
unless ENV["SCHEME"] == nil
progressvalue = "#{lane_context[SharedValues::LANE_NAME]} Alldone"
open(progress_file_path, 'a') { |file| file.puts progressvalue }
end
notification(
subtitle: "#{lane_context[SharedValues::LANE_NAME]} gik godt" ,
message: "Hurra"
)
end
desc "->executed id error"
error do |lane, exception|
unless ENV["SCHEME"] == nil
progressvalue = "#{lane_context[SharedValues::LANE_NAME]} Error with " + ENV["SCHEME"] + "\nError:\n#{exception.message}"
open(progress_file_path, 'a') { |file| file.puts progressvalue }
end
notification(
subtitle: "#{lane_context[SharedValues::LANE_NAME]} Error with " + ENV["SCHEME"] ,
message: exception.message
)
end
end
# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
# All available actions: https://docs.fastlane.tools/actions
# fastlane reports which actions are used. No personal data is recorded.
# Learn more at https://github.com/fastlane/fastlane#metrics
`./fastlane/Appfile`
apple_id ENV["APPLE_ID"] # Your Apple email address
team_id ENV["APPLE_DEV_TEAM_ID"] # Developer Portal Team ID
itc_team_id ENV["APP_STORE_CONNECT_TEAM_ID"] # iTunes Connect Team ID
fastlane gems
Gem | Version | Update-Status |
---|---|---|
fastlane | 2.156.0 | ✅ Up-To-Date |
Loaded fastlane plugins:
No plugins Loaded
Loaded gems
Gem | Version |
---|---|
did_you_mean | 1.1.0 |
slack-notifier | 2.3.2 |
atomos | 0.1.3 |
CFPropertyList | 2.3.5 |
claide | 1.0.2 |
colored2 | 3.1.2 |
nanaimo | 0.2.6 |
xcodeproj | 1.15.0 |
rouge | 2.0.7 |
xcpretty | 0.3.0 |
terminal-notifier | 2.0.0 |
unicode-display_width | 1.3.0 |
terminal-table | 1.8.0 |
plist | 3.3.0 |
public_suffix | 2.0.5 |
addressable | 2.5.2 |
multipart-post | 2.0.0 |
word_wrap | 1.0.0 |
tty-screen | 0.6.3 |
tty-cursor | 0.5.0 |
tty-spinner | 0.8.0 |
babosa | 1.0.3 |
colored | 1.2 |
highline | 1.7.8 |
commander-fastlane | 4.4.6 |
excon | 0.71.1 |
faraday | 1.0.1 |
unf_ext | 0.0.7.4 |
unf | 0.1.4 |
domain_name | 0.5.20170404 |
http-cookie | 1.0.3 |
faraday-cookie_jar | 0.0.6 |
faraday_middleware | 1.0.0 |
fastimage | 2.1.0 |
gh_inspector | 1.1.3 |
json | 2.0.4 |
mini_magick | 4.9.5 |
rubyzip | 2.3.0 |
security | 0.1.3 |
xcpretty-travis-formatter | 1.0.0 |
dotenv | 2.2.1 |
bundler | 1.16.0 |
naturally | 2.1.0 |
simctl | 1.6.3 |
jwt | 2.1.0 |
uber | 0.1.0 |
declarative | 0.0.10 |
declarative-option | 0.1.0 |
representable | 3.0.4 |
retriable | 3.1.1 |
mini_mime | 1.0.2 |
multi_json | 1.12.2 |
signet | 0.14.0 |
memoist | 0.16.0 |
os | 0.9.6 |
googleauth | 0.13.1 |
httpclient | 2.8.3 |
google-api-client | 0.38.0 |
google-cloud-env | 1.3.3 |
google-cloud-core | 1.2.7 |
digest-crc | 0.4.1 |
google-cloud-storage | 1.25.1 |
emoji_regex | 0.1.1 |
jmespath | 1.4.0 |
aws-partitions | 1.286.0 |
aws-eventstream | 1.0.3 |
aws-sigv4 | 1.1.1 |
aws-sdk-core | 3.92.0 |
aws-sdk-kms | 1.30.0 |
aws-sdk-s3 | 1.61.1 |
openssl | 2.0.5 |
io-console | 0.4.6 |
psych | 2.2.2 |
generated on: 2020-08-12
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Reactions: 3
- Comments: 18 (1 by maintainers)
I am experiencing the same issue. Let me know if you figure it out
I’m also getting the same issue.
I’m also getting the same issue.
FYI: I got this error due to creating an API Key with the Developer role. When I created a new key with role Admin, it went well!
I think the issue is when you create a new app that doesnt have screenshots. It seems to work if you modify line 138 of
deliver/lib/deliver/upload_screenshots.rb
toduplicate = app_screenshot_set.app_screenshots ? app_screenshot_set.app_screenshots.any? { |s| s.source_file_checksum == checksum } : nil
turns out I’d miscopied an env variable- everything is working smoothly for me. thanks for your work and follow up @rogerluan 🥇
Hi from the fact that Fastlane broke when Apple updated the app store connect APIS and from the countless stories that was posted on Fastlanes github page, this beeing one of them: https://github.com/fastlane/fastlane/pull/16626