App Store Connect APIからアプリのダウンロード数を取得する時にハマったポイントとその解決法

公開:2020/12/20
更新:2020/12/21
3 min読了の目安(約3100字TECH技術記事

この記事は、GMO ペパボエンジニア Advent Calendar 2020、20 日目です。
19日目は、harasho さんによる、Webエンジニアに転職してからの1年半を振り返る でした!

こんにちは。普段の業務では、iOS アプリの開発をメインに、時々 Android や CI/CD をいじったりしています。

私は現在、iOS アプリのダウンロード数を Slack に投稿する bot を作っています(途中)。iOS アプリのダウンロード数を取得するために、App Store Connect APIを使っています。(Reporter というコマンドラインツールもあるそうですがここでは触れません。参考)そこで今回は、この API を使う時にハマった箇所とその解決策を紹介します。

権限の設定

App Store Connect API からアプリのダウンロード数を取得するためには、https://api.appstoreconnect.apple.com/v1/salesReportsのエンドポイントを使います。このエンドポイントに関するドキュメントはこちらです。App Store Connect API の各エンドポイントにアクセスするためにはそれに応じた権限を付与したキーを取得しなければいけません。権限は、

  • Admin
  • App Manager
  • Developer
  • Finance
  • Sales および Reports

があります。ダウンロード数を取得するためには、Financeの権限を付与したキーを発行しましょう。私はSales および Reportsの権限でやっていたので、ずっと 403 エラーが返ってきました。

レスポンスの形式

このレポートのレスポンスは、Json 形式では返ってきません! 私は WebAPI のレスポンス = Json や XML 形式で返ってくるという先入観のもとに作業をしていましたので、つまりました。
POSTMANでデバッグ作業をしていたのですが、レスポンスが文字化けしていました。こちらの記事を読んでレスポンスが gzip 形式だということに気づきました。App Store Connect APIにある、OpenAPI の仕様の 12288 行目にもきちんと書いてあります。しっかりと最初から公式ドキュメントを読んでおけばこんなにハマることはありませんでした…
ちなみに、POSTMAN でファイル形式でレスポンスを受け取りたい場合は、Sendの右側にあるをクリックして、Send and Downloadをクリックすることで保存できます。

リクエストパラメータ

レポートを取得するときは、filter[frequency]キーに、

  • DAILY
  • WEEKLY
  • MONTHLY
  • YEARLY

を指定し、filter[reportDate]に日時を指定することで、期間に応じたレポートを取得できます。WEEKLYのレポートを取得するときは、filter[reportDate]で取得したい、週の日曜日の日付を指定しなければなりません。

tsv 形式

ダウンロードした中身を見ると txt ファイルが入っていました。txt ファイルの中身を見て???になりました。私は初めて見たのですが、これは tsv という csv のタブで区切られたバージョンみたいなものでした。初めてだったので、これはどうやってパースするんだ?と思っていました。私は Go 言語で実装しているのですが、標準パッケージのencoding/csvを使ってパースできます。tsv をパースするときは、

reader.Comma = '\t'

と指定すればパースできるそうです(参考)。

私は、パースしたものを構造体で扱いたいので、そこら辺の扱いをいい感じにしてくれるgocsvを使う予定です(現状ファイルのダウンロードまでは実装できており、パースからは未実装です…)。
公式ドキュメントを読む感じ、gocsv でも区切り文字をカスタマイズできるそうです。
取りあえず、tsv ファイルの中身を綺麗に見たいときは、Numbers を使うと綺麗に見れます(Excelでも見れそうですが未確認です...)。

ダウンロード数はどこに書いてあるのか

ダウンロードした tsv ファイルを見てもらえれば分かると思いますが、同じアプリでも色々な箇所に情報が散らばっており、どこの数字が新規ダウンロード数なのか分かりにくいと思います。見るべき箇所は、Product Type Identifierの列です。ここの数字が、新規ダウンロード数や、アップデート数などを、区別しています。Apple の Developer Forums にも各数字の説明があります。その横のUnitsProduct Type Identifierの数だと思います(未調査)。

最後に

以上が私がハマった箇所とその解決方法です。この作成中の bot は、社内のGitHub Actions の Action として登録し、 スケジュール機能で定期実行することによって動かす予定です。完成したら、クラウド版の GitHub でも Action として公開したいなと思っています。
この bot は、Go 言語で書いているのですが、書いていてまだまだ Go 言語らしい書き方が出来ていないな〜と思いつつやっています。早く一人前の Gopher になりたいです!