_deliver_ uploads screenshots, metadata and binaries to iTunes Connect. Use _deliver_ to submit your app for App Store review.
-------
Features •
Quick Start •
Usage •
Tips
-------
deliver
is part of fastlane: The easiest way to automate beta deployments and releases for your iOS and Android apps.
# Features
- Upload hundreds of localised screenshots completely automatically
- Upload a new ipa/pkg file to iTunes Connect without Xcode from any Mac
- Maintain your app metadata locally and push changes back to iTunes Connect
- Easily implement a real Continuous Deployment process using [fastlane](https://fastlane.tools)
- Store the configuration in git to easily deploy from **any** Mac, including your Continuous Integration server
- Get a HTML preview of the fetched metadata before uploading the app metadata and screenshots to iTC
- Automatically uses [precheck](/actions/precheck) to ensure your app has the highest chances of passing app review the first time
To upload builds to TestFlight check out [pilot](/actions/pilot).
##### [Do you like fastlane? Be the first to know about updates and new fastlane tools](https://tinyletter.com/fastlane-tools)
# Quick Start
The guide will create all the necessary files for you, using the existing app metadata from iTunes Connect.
- ```cd [your_project_folder]```
- ```fastlane deliver init```
- Enter your iTunes Connect credentials
- Enter your app identifier
- Enjoy a good drink, while the computer does all the work for you
From now on, you can run `fastlane deliver` to deploy a new update, or just upload new app metadata and screenshots.
# Usage
Check out your local `./fastlane/metadata` and `./fastlane/screenshots` folders (if you don't use [fastlane](https://fastlane.tools) it's `./metadata` instead)
![/img/actions/deliver_metadata.png](/img/actions/deliver_metadata.png)
You'll see your metadata from iTunes Connect. Feel free to store the metadata in git (not the screenshots). You can now modify it locally and push the changes back to iTunes Connect.
Run `fastlane deliver` to upload the app metadata from your local machine
```no-highlight
fastlane deliver
```
Provide the path to an `ipa` file to upload and submit your app for review:
```no-highlight
fastlane deliver --ipa "App.ipa" --submit_for_review
```
or you can specify path to `pkg` file for macOS apps:
```no-highlight
fastlane deliver --pkg "MacApp.pkg"
```
If you use [fastlane](https://fastlane.tools) you don't have to manually specify the path to your `ipa`/`pkg` file.
This is just a small sub-set of what you can do with _deliver_, check out the full documentation in [#more-options](#more-options)
Download existing screenshots from iTunes Connect
```no-highlight
fastlane deliver download_screenshots
```
Download existing metadata from iTunes Connect
```no-highlight
fastlane deliver download_metadata
```
To get a list of available options run
```no-highlight
fastlane action deliver
```
Select a previously uploaded build and submit it for review.
```no-highlight
fastlane deliver submit_build --build_number 830
```
### Use in a `Fastfile`
```ruby
deliver
```
```ruby
deliver(
submit_for_review: true,
force: true,
metadata_path: "./metadata"
)
```
## More options
View all available options and their valid values
## Available options
All the options below can easily be added to your `Deliverfile`. The great thing: if you use _fastlane_ you can use all these options from your `Fastfile` too, for example:
```ruby
deliver(
submit_for_review: true,
metadata_path: "../folder"
)
```
##### app_identifier
The bundle identifier (e.g. "com.krausefx.app")
##### username
Your Apple ID email address
##### ipa
A path to a signed ipa file, which will be uploaded. If you don't provide this value, only app metadata will be uploaded. If you want to submit the app for review make sure to either use `fastlane deliver --submit_for_review` or add `submit_for_review true` to your `Deliverfile`
```ruby-skip-tests
ipa "App.ipa"
```
if you use [fastlane](https://fastlane.tools) the ipa file will automatically be detected.
##### pkg
A path to a signed pkg file, which will be uploaded. Submission logic of ipa applies to pkg files.
```ruby-skip-tests
pkg "MacApp.pkg"
```
##### app_version
Optional, as it is usually automatically detected. Specify the version that should be created / edited on iTunes Connect:
```ruby-skip-tests
app_version "2.0"
```
##### skip_app_version_update
In the case if _deliver_ uploads your application to iTunes Connect it will automatically update "Prepare for submission" app version (which could be found on iTunes Connect->My Apps->App Store page)
The option allows uploading your app without updating "Prepare for submission" version.
This could be useful in the case if you are generating a lot of uploads while not submitting the latest build for Apple review.
The default value is false.
```ruby-skip-tests
skip_app_version_update true
```
##### submit_for_review
Add this to your `Deliverfile` to automatically submit the app for review after uploading metadata/binary. This will select the latest build.
```ruby-skip-tests
submit_for_review true
```
##### screenshots_path
A path to a folder containing subfolders for each language. This will automatically detect the device type based on the image resolution. Also includes Watch Support.
![/img/actions/deliver_screenshots.png](/img/actions/deliver_screenshots.png)
##### metadata_path
Path to the metadata you want to use. The folder has to be structured like this
![/img/actions/deliver_metadata.png](/img/actions/deliver_metadata.png)
If you run `deliver init` this will automatically be created for you.
##### force
```ruby-skip-tests
force true
```
If set to `true`, no HTML report will be generated before the actual upload. You can also pass `--force` when calling _deliver_.
##### price_tier
Pass the price tier as number. This will be active from the current day.
```ruby-skip-tests
price_tier 0
```
##### trade_representative_contact_information
Trade Representative Contact information for Korean App Store. Available options: `first_name`, `last_name`, `address_line1`, `address_line2`, `address_line3`, `city_name`, `state`, `country`, `postal_code`, `phone_number`, `email_address`, `is_displayed_on_app_store`.
```ruby-skip-tests
trade_representative_contact_information(
first_name: "Felix",
last_name: "Krause",
address_line1: "1 Infinite Loop",
address_line2: "",
address_line3: null,
city_name: "Cupertino",
state: "California",
country: "United States",
postal_code: "95014",
phone_number: "+43 123123123",
email_address: "github@krausefx.com",
)
```
You can also provide these values by creating files in a `metadata/trade_representative_contact_information/` directory. The file names must match the pattern `.txt` (e.g. `first_name.txt`, `address_line1.txt` etc.). The contents of each file will be used as the value for the matching key. Values provided in the `Deliverfile` or `Fastfile` will be take priority over values from these files.
`is_displayed_on_app_store` is the option on iTunes Connect described as: `Display Trade Representative Contact Information on the Korean App Store`
##### app_review_information
Contact information for the app review team. Available options: `first_name`, `last_name`, `phone_number`, `email_address`, `demo_user`, `demo_password`, `notes`.
```ruby-skip-tests
app_review_information(
first_name: "Felix",
last_name: "Krause",
phone_number: "+43 123123123",
email_address: "github@krausefx.com",
demo_user: "demoUser",
demo_password: "demoPass",
notes: "such notes, very text"
)
```
You can also provide these values by creating files in a `metadata/review_information/` directory. The file names must match the pattern `.txt` (e.g. `first_name.txt`, `notes.txt` etc.). The contents of each file will be used as the value for the matching key. Values provided in the `Deliverfile` or `Fastfile` will be take priority over values from these files.
##### submission_information
Must be a hash. This is used as the last step for the deployment process, where you define if you use third party content or use encryption. [A list of available options](https://github.com/fastlane/fastlane/blob/master/spaceship/lib/spaceship/tunes/app_submission.rb#L18-L69).
```ruby-skip-tests
submission_information({
add_id_info_serves_ads: true,
...
})
```
##### automatic_release
Should the app be released to all users once Apple approves it? If set to `false`, you'll have to manually release the update once it got approved.
```ruby-skip-tests
automatic_release true
# or
automatic_release false
```
##### phased_release
Enable or disable the phased releases feature of iTunes Connect. If set to `true`, the update will be released over a 7 day period. Default behavior is to leave whatever you defined on iTunes Connect.
```ruby-skip-tests
phased_release true
# or
phased_release false
```
##### app_rating_config_path
You can set the app age ratings using _deliver_. You'll have to create and store a `JSON` configuration file. Copy the [template](https://github.com/fastlane/fastlane/blob/master/deliver/assets/example_rating_config.json) to your project folder and pass the path to the `JSON` file using the `app_rating_config_path` option.
The keys/values on the top allow values from 0-2, and the items on the bottom allow only 0 or 1. More information in [#reference](#reference).
## Metadata
All options below are useful if you want to specify certain app metadata in your `Deliverfile` or `Fastfile`
### Localised
Localised values should be set like this
```ruby-skip-tests
description({
'en-US' => "English Description here",
'de-DE' => "Deutsche Beschreibung hier"
})
```
##### name
The title/name of the app
##### subtitle
Localised subtitle of the app
```ruby-skip-tests
subtitle(
"en-US" => "Awesome English subtitle here",
"de-DE" => "Jetzt mit deutschen Untertiteln!"
)
```
##### description
The description of the app
##### release_notes
The release_notes (What's new / Changelog) of the latest version
##### support_url, marketing_url, privacy_url
These URLs are shown in the AppStore
##### keywords
Keywords separated using a comma.
```ruby-skip-tests
keywords(
"en-US" => "Keyword1, Keyword2"
)
```
##### promotional_text
Localised promotional text
```ruby-skip-tests
promotional_text(
"en-US" => "Hey, you should totally buy our app, it's the best",
"de-DE" => "App kaufen bitte"
)
```
##### app_icon
A path to a new app icon, which must be exactly 1024x1024px
```ruby-skip-tests
app_icon './AppIcon.png'
```
##### apple_watch_app_icon
A path to a new app icon for the Watch, which must be exactly 1024x1024px
```ruby-skip-tests
apple_watch_app_icon './AppleWatchAppIcon.png'
```
##### platform
The platform of your application (a.e. ios, osx).
This option is optional. The default value is "ios" and deliver should be able to figure out the platform from your binary.
However, in the case if multiple binaries present, you can specify a platform which you want to deliver explicitly.
The available options:
- 'ios'
- 'appletvos'
- 'osx'
### Non-Localised
##### copyright
The up to date copyright information.
```ruby-skip-tests
copyright "#{Time.now.year} Felix Krause"
```
##### primary_category
The english name of the category you want to set (e.g. `Business`, `Books`)
See [#reference](#reference) for a list of available categories
##### secondary_category
The english name of the secondary category you want to set
##### primary_first_sub_category
The english name of the primary first sub category you want to set
##### primary_second_sub_category
The english name of the primary second sub category you want to set
##### secondary_first_sub_category
The english name of the secondary first sub category you want to set
##### secondary_second_sub_category
The english name of the secondary second sub category you want to set
# Credentials
A detailed description about how your credentials are handled is available in a [credentials_manager](https://github.com/fastlane/fastlane/tree/master/credentials_manager).
### How does this thing even work? Is magic involved? 🎩
Your password will be stored in the macOS keychain, but can also be passed using environment variables. (More information available on [CredentialsManager](https://github.com/fastlane/fastlane/tree/master/credentials_manager))
Before actually uploading anything to iTunes, _deliver_ will generate a HTML summary of the collected data.
_deliver_ uses the following techniques under the hood:
- The iTMSTransporter tool is used to upload the binary to iTunes Connect. iTMSTransporter is a command line tool provided by Apple.
- For all metadata related actions _deliver_ uses [spaceship](https://github.com/fastlane/fastlane/tree/master/spaceship)
# Tips
## Available language codes
```
no, en-US, en-CA, fi, ru, zh-Hans, nl-NL, zh-Hant, en-AU, id, de-DE, sv, ko, ms, pt-BR, el, es-ES, it, fr-CA, es-MX, pt-PT, vi, th, ja, fr-FR, da, tr, en-GB
```
## Reference
View all available categories, languages, etc.
### Available Categories
You can always prefix the category using `MZGenre.` (e.g. `MZGenre.Book`). _deliver_ supports both notations.
- `Book`
- `Business`
- `Apps.Catalogs`
- `Education`
- `Entertainment`
- `Finance`
- `Apps.Food_Drink`
- `Games`
- `Healthcare_Fitness`
- `Lifestyle`
- `Medical`
- `Music`
- `Navigation`
- `News`
- `Apps.Newsstand`
- `Photography`
- `Productivity`
- `Reference`
- `Apps.Shopping`
- `SocialNetworking`
- `Sports`
- `Stickers`
- `Travel`
- `Utilities`
- `Weather`
### Available Game Subcategories
- `MZGenre.Action`
- `MZGenre.Adventure`
- `MZGenre.Arcade`
- `MZGenre.Board`
- `MZGenre.Card`
- `MZGenre.Casino`
- `MZGenre.Dice`
- `MZGenre.Educational`
- `MZGenre.Family`
- `MZGenre.Music`
- `MZGenre.Puzzle`
- `MZGenre.Racing`
- `MZGenre.RolePlaying`
- `MZGenre.Simulation`
- `MZGenre.Sports`
- `MZGenre.Strategy`
- `MZGenre.Trivia`
- `MZGenre.Word`
### Available Magazines & Newspapers Subcategories
- `MZGenre.Apps.Arts_Photography`
- `MZGenre.Apps.Automotive`
- `MZGenre.Apps.Brides_Weddings`
- `MZGenre.Apps.Business_Investing`
- `MZGenre.Apps.Childrens_Magazines`
- `MZGenre.Apps.Computers_Internet`
- `MZGenre.Apps.Cooking_Food_Drink`
- `MZGenre.Apps.Crafts_Hobbies`
- `MZGenre.Apps.Electronics_Audio`
- `MZGenre.Apps.Entertainment`
- `MZGenre.Apps.Fashion_Style`
- `MZGenre.Apps.Health_Mind_Body`
- `MZGenre.Apps.History`
- `MZGenre.Apps.Home_Garden`
- `MZGenre.Apps.Literary_Magazines_Journals`
- `MZGenre.Apps.Mens_Interest`
- `MZGenre.Apps.Movies_Music`
- `MZGenre.Apps.News_Politics`
- `MZGenre.Apps.Outdoors_Nature`
- `MZGenre.Apps.Parenting_Family`
- `MZGenre.Apps.Pets`
- `MZGenre.Apps.Professional_Trade`
- `MZGenre.Apps.Regional_News`
- `MZGenre.Apps.Science`
- `MZGenre.Apps.Sports_Leisure`
- `MZGenre.Apps.Teens`
- `MZGenre.Apps.Travel_Regional`
- `MZGenre.Apps.Womens_Interest`
### Available Stickers Subcategories
- `MZGenre.Apps.Stickers.Animals`
- `MZGenre.Apps.Stickers.Art`
- `MZGenre.Apps.Stickers.BirthdaysAndCelebrations`
- `MZGenre.Apps.Stickers.Celebrities`
- `MZGenre.Apps.Stickers.Characters`
- `MZGenre.Apps.Stickers.FoodAndDrink`
- `MZGenre.Apps.Stickers.Emotions`
- `MZGenre.Apps.Stickers.Fashion`
- `MZGenre.Apps.Stickers.Games`
- `MZGenre.Apps.Stickers.KidsAndFamily`
- `MZGenre.Apps.Stickers.MoviesAndTV`
- `MZGenre.Apps.Stickers.Music`
- `MZGenre.Apps.Stickers.People`
- `MZGenre.Apps.Stickers.Places`
- `MZGenre.Apps.Stickers.Sports`
### Available Languages
- `da`
- `de-DE`
- `el`
- `en-AU`
- `en-CA`
- `en-GB`
- `en-US`
- `es-ES`
- `es-MX`
- `fi`
- `fr-CA`
- `fr-FR`
- `id`
- `it`
- `ja`
- `ko`
- `ms`
- `nl-NL`
- `no`
- `pt-BR`
- `pt-PT`
- `ru`
- `sv`
- `th`
- `tr`
- `vi`
- `zh-Hans`
- `zh-Hant`
### Available age rating groups
#### Non Boolean
**Values**
- 0: None
- 1: Infrequent/Mild
- 2: Frequent/Intense
**Keys**
- `CARTOON_FANTASY_VIOLENCE`
- `REALISTIC_VIOLENCE`
- `PROLONGED_GRAPHIC_SADISTIC_REALISTIC_VIOLENCE`
- `PROFANITY_CRUDE_HUMOR`
- `MATURE_SUGGESTIVE`
- `HORROR`
- `MEDICAL_TREATMENT_INFO`
- `ALCOHOL_TOBACCO_DRUGS`
- `GAMBLING`
- `SEXUAL_CONTENT_NUDITY`
- `GRAPHIC_SEXUAL_CONTENT_NUDITY`
#### Boolean
**Keys**
- `UNRESTRICTED_WEB_ACCESS`
- `GAMBLING_CONTESTS`
## Default values
Deliver has a special `default` language code which allows you to provide values that are not localised, and which will be used as defaults when you don’t provide a specific localised value.
In order to use `default`, you will need to tell _deliver_ which languages your app uses. You can do this in either of two ways:
1. Create the folders named with the language in the metadata folder (i.e. fastlane/metadata/en-US or fastlane/metadata/de-DE)
2. Add the following to your `Deliverfile` `languages(['en-US','de-DE'])`
You can use this either in json within your `Deliverfile` and/or as folders in your metadata folder. _deliver_ will take the union of both language sets from the `Deliverfile` and from the metadata folder and create on single set of languages which will be enabled.
Imagine that you have localised data for the following language codes: ```en-US, de-DE, el, it```
You can set the following in your `Deliverfile`
```ruby-skip-tests
release_notes({
'default' => "Shiny and new",
'de-DE' => "glaenzend und neu"
})
```
Deliver will use "Shiny and new" for en-US, el and it.
It will use "glaenzend und neu" for de-DE.
You can do the same with folders
```
default
keywords.txt
marketing_url.txt
name.txt
privacy_url.txt
support_url.txt
release_notes.txt
en-US
description.txt
de-DE
description.txt
el
description.txt
it
description.txt
```
In this case, default values for keywords, urls, name and release notes are used in all localisations, but each language has a fully localised description
## Automatically create screenshots
If you want to integrate _deliver_ with [snapshot](https://github.com/fastlane/fastlane/tree/master/snapshot), check out [fastlane](https://fastlane.tools)!
## Jenkins integration
Detailed instructions about how to set up _deliver_ and _fastlane_ in `Jenkins` can be found in the [fastlane README](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Jenkins.md).
## Firewall Issues
_deliver_ uses the iTunes Transporter to upload metadata and binaries. In case you are behind a firewall, you can specify a different transporter protocol using
```
DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV" fastlane deliver
```
## HTTP Proxy
iTunes Transporter is a Java application bundled with Xcode. In addition to utilizing the `DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV"`, you need to configure the transporter application to use the proxy independently from the system proxy or any environment proxy settings. You can find the configuration file within Xcode:
```bash
TOOLS_PATH=$( xcode-select -p )
REL_PATH='../Applications/Application Loader.app/Contents/itms/java/lib/net.properties'
echo "$TOOLS_PATH/$REL_PATH"
```
Add necessary proxy configuration values to the net.properties according to [Java Proxy Configuration](http://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html).
As an alternative to editing the properties files, proxy configuration can be specified on the command line directly:
```bash
DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV -Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=8080"
```
## Limit
iTunes Connect has a limit of 150 binary uploads per day.
## Editing the `Deliverfile`
Change syntax highlighting to *Ruby*.