fastlaneのdeliverからAppStoreのメタデータ送信する際の留意点

## 概要
2021/08現在における `fastlane deliver` を使った AppStore へのメタデータ送信について、ドキュメントが少なかったので留意点を記しておきます。

## 前準備
#### ■ AppStre API Key

2021/08現在では `deliver` からメタデータをCI経由で送る場合 `AppStore API Key` が必要です。
これがないと 2FA をクリアできないので、、
ローカルで実行するだけであれば、`fastlane` で利用できる通常のログイン機構で大丈夫です。
その場合、コマンドの途中で 2FA のパスワードを求められることになります。

ちなみに.envなどを利用して環境変数に必要keyを格納し、下記のようにAPIKeyを取得できるような `fastlane private action` を `Fastfile` に作っておくと便利です。

```ruby
#### App Store API への認証Key生成

desc "App Store Connect API Key"
# private_lane :app_store_connect_key do
lane :app_store_connect_key do
  api_key = app_store_connect_api_key(
    key_id: ENV["APP_STORE_API_KEY_ID"],
    issuer_id: ENV["APP_STORE_API_ISSUE_ID"],
    key_content: ENV["APP_STORE_API_KEY_CONTENT"],
    duration: 1200,
    in_house: false
  )
end

#### Deliverによるメタ情報＆app送信

desc "Upload with Deliver"
lane :deliver_app do |options|
  deliver(
    api_key: app_store_connect_key,
    〜 割愛 〜
  )
end
```

**AppStoreAPIに関するドキュメント**

https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api

https://docs.fastlane.tools/app-store-connect-api/

#### ■ AppStore に送信するメタデータ
AppStoreに送信するメタデータはAppStoreConnectのGUIに沿って設定したものをダウンロードすると良いです。
メタデータ用のファイル群だけでは何が何だかわかりずらく、一つ一つゼロから構築するのは大変なので。
ダウンロードはAppStoreへのログイン機構を利用したアクションの実行が必要です。
`deliver` の `download_metadata` 関数は `api_key` に対応していないので。。。
したがって [Appfile](http://docs.fastlane.tools/advanced/Appfile/#appfile) などにログインに必要な項目を記載して実行してください。

下記のコマンドを実行すると 2FA を介してメタデータのダウンロードが行えます。

```sh
fastlane deliver download_metadata
```

以下を参考に更新があれば行ってみてください。

https://developer.apple.com/documentation/appstoreconnectapi/app_metadata



#### ■ AppStore に送信するスクリーンショット
下記にまとめているので参照してみてください。

https://qiita.com/rc_code/items/18d51ca5bb512c6dbdfd


#### ■ レーティングに関するメタデータ
`deliver` でのメタデータ管理を行うのであれば、レーティングに関してもデータ送信できるようにしておいた方が良いです。
この辺の変更もGithubなどでバージョン管理できると、後続の関係者に意図が伝わると思います。
レーティング情報については fastlane 経由のダウンロード方法がわからなかったので、わかり次第追記したいと思います。
直接APIから取得する方法は [こちら](https://developer.apple.com/documentation/appstoreconnectapi/get_v1_appinfos_id_ageratingdeclaration)。
差し当たり、下記の json を用意して、プロダクトにあった設定値にしてください。

```json
{
  "alcoholTobaccoOrDrugUseOrReferences": "NONE",
  "contests": "NONE",
  "gamblingSimulated": "NONE",
  "horrorOrFearThemes": "NONE",
  "matureOrSuggestiveThemes": "NONE",
  "medicalOrTreatmentInformation": "NONE",
  "profanityOrCrudeHumor": "NONE",
  "sexualContentGraphicAndNudity": "NONE",
  "sexualContentOrNudity": "NONE",
  "violenceCartoonOrFantasy": "NONE",
  "violenceRealisticProlongedGraphicOrSadistic": "NONE",
  "violenceRealistic": "NONE",
  "gambling": false,
  "seventeenPlus": false,
  "unrestrictedWebAccess": false
}
```

以前は[こちらのプルリク差分](https://github.com/fastlane/fastlane/commit/addb520b0f2405fdb917ea479c3a2f4a12a01b8b#diff-57d4a30733a5f11983204f5bef3248688a19c5a12808ba91cf55aa7fa5ebd44c)のように大文字での指定になっていましたが、指定が新しくなっているので注意してください。

**レーティングのKeyValueドキュメント**

https://developer.apple.com/documentation/appstoreconnectapi/ageratingdeclarationupdaterequest/data/attributes


## deliverからの送信
さてでは実際に `deliver` を利用してデータ送信する際のパラメータ設定についてです。
下記に基本的なものを羅列しておきました。
`fastlane` のドキュメントサイトにデフォルト値が記載されているので、改めて指定不要なものは削除してください。
注意書きですが、バイナリの送信を行う場合、当然ですが前もって `fastlane` の `gym` などを利用したアプリ生成が必要です。
また生成されたアプリバージョンがすでに AppStore に存在する場合エラーになるので注意してください。

```ruby
    deliver(
      api_key: app_store_connect_key,   # <- 前述で説明した api_key を設定
      submit_for_review: true,   # <- バイナリ送信時にレビューに送信するか否か
      skip_binary_upload: true,   # <- 生成されたバイナリをアップロードするか否か
      force: true,   # <- おそらくですが送信時に生成されるHTMLレポートの検証をスキップするか否か。基本trueで良いようです
      reject_if_possible: true,   # <- 申請中であれば取り消して上書きするかどうか
      metadata_path: "fastlane/metadata",   # <- metadata のフォルダ指定
      skip_screenshots: false,   # <- スクショのアップをスキップするかどうか
      screenshots_path: "fastlane/screenshots",   # <- スクショのフォルダ指定
      overwrite_screenshots: true,   # <- スクショを上書きするか否か
      automatic_release: true,   # <- 申請通過時の自動リリース設定
      app_rating_config_path: "fastlane/app_rating_config.json",   # <- レーティングのjson指定
      run_precheck_before_submit: false,    # <- 送信前の検証。api_keyを利用するとこけるので false
      submission_information: {
        add_id_info_uses_idfa: false,        # <- 広告ID情報-idfaを使用するか否か
        add_id_info_serves_ads: false,       # <- 広告ID情報-広告を配信するか否か
        add_id_info_tracks_install: false,   # <- 広告ID情報-インストールの追跡を行なっているかどうか
        add_id_info_tracks_action: false,    # <- 広告ID情報-アクションの追跡を行なっているかどうか
        export_compliance_encryption_updated: false  # <- 暗号化について更新があるかどうか
      }
    )
```

**deliver公式ドキュメント**

https://docs.fastlane.tools/actions/deliver/

　

##【補足】プライバシー詳細情報に関するメタデータについて
現状 deliver を利用してプライバシー詳細情報に関する設定値をアップロードすることはできませんが、バージョン管理の観点からメタデータによる fastlane　経由のアップロードを行うのも良いかと思います。
以下の記事を参照してみてください。

https://qiita.com/rc_code/items/d92e6d81c1fdc0fe8374

　
　
　
以上です。