App Store Connect APIを利用してアプリ情報を取得する

[ディップ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/dip-dev) の2日目です。

## はじめに
2018年のWWDCで発表された「[App Store Connect API](https://developer.apple.com/jp/app-store-connect/api/)」が先日から利用可能となりました。本記事では、利用登録から実際に利用するまでの手順を紹介します。

執筆時点（2018年12月）において用意されているAPIは以下の通りです。

- TestFlight
  - Appのベータ版ビルドやテスター、グループを管理
- ユーザーとアクセス
  - ユーザーの招待、ユーザー権限の設定、ユーザーの削除
- レポート
  - 販売レポートと財務レポートを取得

プロビジョニングについては「近日中に公開」となっています。また、API利用ができるのは組織として登録しているアカウントに限られています。

## 1. キー情報の発行
本APIはJWT（JSON Web Token）による認証が使われています。ヘッダに`Authorization: Bearer (トークン)`の形式でトークンを指定して各APIを使います。トークン文字列を生成するためには下記のキー情報が必要です。

- Issuer ID
- キーID
- PRIVATE KEY

これらの情報は、App Store Connectで発行します。下記に発行手順を示します。

1. App Store Connect にアクセスし、「ユーザとアクセス」から「キー」タブをクリックします（権限がない場合「キー」タブは表示されません）。
![](https://qiita-image-store.s3.amazonaws.com/0/32146/5b7e913d-27e6-93af-1d9f-499bd131e3c7.png)

2. 初めてAPIを生成する場合は確認画面が表示されますので、内容を確認し「提出」ボタンをクリックすると、下記の画面に遷移します。
![](https://qiita-image-store.s3.amazonaws.com/0/32146/f458e69f-d67c-ba7e-f040-33f247107442.png)

3. 上記画面で「APIキーを生成」をクリック、または「＋」ボタンをクリックすると、登録画面が表示されます。
![](https://qiita-image-store.s3.amazonaws.com/0/32146/9b9b1ab3-89f2-338e-5d79-37dd32bae104.png)
「名前」には識別しやすい任意の名前を、「アクセス」は下記のプルダウンから権限を設定し、「生成」ボタンをクリックしてキーを生成します。
![アクセス](https://qiita-image-store.s3.amazonaws.com/0/32146/50059f81-8e4d-5874-9de7-21ff3c34a7a2.png)

4. 上記の操作を終えると、接続のための情報が発行されます。「APIキーをダウンロード」をクリックして、PRIVATE KEYファイルをダウンロードしておきましょう。このファイルは1度しかダウンロードできないため注意してください。
![](https://qiita-image-store.s3.amazonaws.com/0/32146/5d3b909b-5c74-a6ff-071a-df9fe78e1118.png)

### 2. トークンの発行
次に1で得たキーからトークン文字列を生成します。トークン文字列は、Header、Payload、Signatureの3要素を決められたルールに従って加工し「.」で接続したものです。文字列を生成するためのオープンソースのライブラリが様々なプログラミング言語で用意されているため、それらを利用すると良いでしょう。たとえばRubyでは下記のようなコードで発行ができます。

```createtoken.rb
require "base64"
require "jwt"

ISSUER_ID = "[Issuer ID]欄に表示された文字列"
KEY_ID = "[キーID]欄に表示された文字列"
private_key = OpenSSL::PKey.read(File.read("ダウンロードしたPRIVATE KEYファイル名"))

token = JWT.encode(
   {
    iss: ISSUER_ID,
    exp: Time.now.to_i + 20 * 60,  # トークンの有効期限は20分以内とAppleが規定している
    aud: "appstoreconnect-v1"      # audは appstoreconnect-v1 固定
   },
   private_key,
   "ES256",                        # 署名方式は ES256 固定
   header_fields={
     kid: KEY_ID
   }
)
puts token
```

上記のファイルを保存し、下記のコマンドで生成できます。

```
$ ruby createtoken.rb
```

その他の言語のライブラリについては、[こちらのサイト](https://jwt.io)を参照してください。

### 3. APIの利用

では実際にAPIを利用してみましょう。今回は自アカウントがApp Store Connectにアップしているアプリのリストをcurlコマンドで取得してみます。

```shell
# トークンを生成
$ ruby createtoken.rb
# APIを実行
$ curl -v -H 'Authorization: Bearer (上記で得たトークン)' https://api.appstoreconnect.apple.com/v1/apps
```

レスポンスはJSON形式で返却されます。キーと値は下記の通りです。

- data（1〜n）
    - type : スマホアプリなら「apps」
    - id : アプリID,
    - attributes
        - name : アプリ名
        - bundleId : バンドルID
        - sku : SKU
        - primaryLocale : ロケール
    - relationships
        - プレリリースやベータテスタの情報を取得するためのAPIのURLが返される
    - links
        - self : この情報を取得するためのAPIのURL
- links
    - self : この情報を取得するためのAPIのURL

`createtoken.rb`のコードでも示しましたが、トークンは生成から20分間利用可能です。複数のAPIを実行する場合は、その処理の最初でトークンを発行し、まとめてAPIを叩けば同じトークンが利用できます。有効期限が切れるとHTTPステータス401エラーが返却されますので、その場合は再度トークン生成が必要です。


## さいごに
その他のAPIについては、下記を参考にしてください。APIをうまく利用して、より確実でより効率的なアプリ開発を行なっていきましょう。

- TestFlight
    - https://developer.apple.com/documentation/appstoreconnectapi/testflight
- Users
    - https://developer.apple.com/documentation/appstoreconnectapi/users
- User Invitations
    - https://developer.apple.com/documentation/appstoreconnectapi/user_invitations
- Sales and Finance Reports
    - https://developer.apple.com/documentation/appstoreconnectapi/sales_and_finance_reports