fastlaneでAppStoreのPrivacyDetails(プライバシー詳細情報)を管理する

## 概要
2021/08 現在での `fastlane` アクションを利用したAppStoreプライバシー詳細情報のダウンロード・アップロード方法などを記載します。

## なぜ？？
今後 Apple がプライバシーポリシーに力を入れていくことは明白であり、プロダクトベンダー側も逐一サービスやアプリがプライバシーポリシーを徹底して管理していくことが求められます。
そうなった時、AppStoreのGUIだけではバージョン管理やissue起票などの観点から不安要素が多々あり、メタデータによる管理・更新の機構があった方が安全といえます。

## 前準備
#### ■ プライシー詳細情報に関するメタデータのダウンロード
すでにアプリがAppStoreConnectに作成済みであれば、現状のプライバシー詳細設定をダウンロードすることができます。
メタデータ送信用の設定項目を1から作成するのは大変なので、AppStoreConnect からGUI上で一度プライバシー詳細情報を更新し、そのファイルをダウンロードして管理していくことをおすすめします。

**ドキュメントはこちら**

https://developer.apple.com/jp/app-store/app-privacy-details/#data-type

`fastlane` からメタデータをダウンロードするには `download_app_privacy_details_from_app_store` のアクションを利用しますが、こちらは `AppStore API Key` に対応していないので、CIでの駆動は現状難しいです。
したがって `fastlane` に[AppStoreConnectへのログインを可能に](https://docs.fastlane.tools/getting-started/ios/authentication/)した上で、ローカル実行することになります。
この場合、コマンド途中に 2FA 認証のパスワードが聞かれることになります。

```ruby
desc 'Json定義のプライバシー要件をAppStoreConnectからダウンロード'
lane :upload_privacy_details do
  download_app_privacy_details_from_app_store(
    username: "your@email.com",
    team_name: "Your Team",
    app_identifier: "com.your.bundle",
    output_json_path: "fastlane/app_data_usages.json"
  )
end
```

**アクション説明ドキュメント**

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

完了すると下記のようなプライバシー情報のJSONが落とせると思います。

```json
[
  {
    "category": "BROWSING_HISTORY",
    "purposes": [
      "ANALYTICS",
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "CRASH_DATA",
    "purposes": [
      "ANALYTICS",
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "CUSTOMER_SUPPORT",
    "purposes": [
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_LINKED_TO_YOU"
    ]
  },
  {
    "category": "DEVICE_ID",
    "purposes": [
      "ANALYTICS",
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "EMAIL_ADDRESS",
    "purposes": [
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_LINKED_TO_YOU"
    ]
  },
  {
    "category": "OTHER_USAGE_DATA",
    "purposes": [
      "ANALYTICS"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "OTHER_USER_CONTENT",
    "purposes": [
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "PERFORMANCE_DATA",
    "purposes": [
      "ANALYTICS",
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "PHOTOS_OR_VIDEOS",
    "purposes": [
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "PRECISE_LOCATION",
    "purposes": [
      "ANALYTICS"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "PRODUCT_INTERACTION",
    "purposes": [
      "ANALYTICS"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "PURCHASE_HISTORY",
    "purposes": [
      "ANALYTICS",
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "SEARCH_HISTORY",
    "purposes": [
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  },
  {
    "category": "USER_ID",
    "purposes": [
      "ANALYTICS",
      "APP_FUNCTIONALITY"
    ],
    "data_protections": [
      "DATA_NOT_LINKED_TO_YOU"
    ]
  }
]

```

## プライバシー詳細情報のアップロード
ファイルが用意できたらアップロードを行います。
`fastlane` の `upload_app_privacy_details_to_app_store` アクションを利用します。
ここで一つ注意なのが、アクションの引数に設定する `team_id` が、他の箇所で利用しているような `英数字のID` ではなく `数値のみのID` であることです。
これを調べる方法がよくわからなかったのですが、一度このアクションを実行すると、ログインしているアカウントのチームID(数値のもの)がコマンドラインにプリントされますので、そこで確認してみてください。

```ruby
#### プライバシー要件のアップロード

desc 'Json定義のプライバシー要件をアップロード'
lane :upload_privacy_details do
  upload_app_privacy_details_to_app_store(
    team_id: "1******1",
    json_path: "fastlane/app_privacy_details.json"
  )
end
```

**ドキュメント**

https://docs.fastlane.tools/uploading-app-privacy-details/

成功すれば以上で完了です。
AppStoreConnectのGUIで一度更新状態を確認してみてください。

以上です！