SpaceshipでApp Store ConnectのApp内課金アイテムの登録を自動化してみた

MoriKensukePosted by

こんにちは。サーバーサイドエンジニアの森と申します。
今回はApp Store ConnectのApp内課金アイテムの登録を自動化したので、その詳細をご紹介します。

実装したモチベーション

私の携わっているプロジェクトでは、月に数十個の課金アイテムをApp Store ConnectとGoogle Play Consoleに登録をする必要があります。
Google Play Consoleはcsvのインポート機能があるのでそれほど大変ではないのですが、App Store Connectはブラウザからアイテム名や価格帯、説明などの記入、スクリーンショットをアップロードする必要があり、これが手間がかかる上にミスしやすいという精神を消耗する作業でした。確認作業を含めるとだいたい1〜2時間くらいかかっていたと思います。

App Store Connectの


これがとても辛かったので、なんとか自動化できないかと調べてみたところ、すでに自動化をしている外国の方がブログを書いていました。
こちらの記事をみて、spaceshipというライブラリを使えばよさそうということがわかり、実装してみました。

Spaceshipとは?

spaceship exposes both the Apple Developer Center and the App Store Connect API. It’s super fast, well tested and supports all of the operations you can do via the browser.

一言でいうと、Apple Developer CenterとApp Store Connect APIを提供してくれるRuby製のライブラリです。fastlaneというライブラリの一部です。
App Store Connectのブラウザ上で入力するととても時間がかかりますが、Spaceshipは高速に動作します。

環境作成

実際に動かした環境は以下になります。

MacOSCatalina 10.15.7
ruby2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin19]
gem3.1.4
bundleBundler version 2.1.4
fastlane2.171.0
App Store Connectアカウント2段階認証をまだ設定していない(追記参照)
動作環境

私の環境ではrubyのバージョンが2.6や3.0だとspaceshipがうまく動きませんでした。
まず、rubyの2.7系を入れます。今回はHomebrewで入れましたが、rbenvなどのRubyバージョン管理ツールを使っても良いでしょう。

brew install ruby@2.7

続いて、fastlaneのライブラリをインストールします。
以下のGemfileを作成します。

source "https://rubygems.org"

gem "fastlane", :git => "https://github.com/fastlane/fastlane.git", :branch => "joshdholtz-skip-2fa-upgrade"

Gemfileのあるディレクトリで以下のコマンドを叩きます。

bundle install

これで、spaceshipを使う準備ができました!

次に、ストアに登録するアイテムのデータを準備します。今回はcsvを採用します。
うちのプロジェクトでは商品ごとに変わるのは「商品名」、「製品ID」、「価格帯」、「説明文」なので今回は以下のような形のcsv形式にしました(値は仮のものです)。


このcsvも手で作成するのではなく、アプリ内で使っている商品データなどから自動で生成するといいでしょう。

さらに、spaceshipでは審査に使うスクリーンショット画像もあげることができます。
画像を準備し、そのパスを指定するだけです。

なお、App Store Connectの仕様で一度使ったproduct_idを再度使用することはできないので、テストする際は将来使われないようなproduct_idでテストしてください。

スクリプトの実装

require "spaceship"
require "json"
require "csv"

Spaceship::Tunes.login("(apple_id)", "(パスワード)")
app = Spaceship::Application.find("(アプリのBUNDLE_ID)")

CSV.foreach("(アイテム情報csvのパス)", headers: true) do |row|
  p row

  app.in_app_purchases.create!(
    type: Spaceship::Tunes::IAPType::CONSUMABLE,
    versions: { # App Store情報
                'ja': { # 日本語
                        name: row["name"], # 表示名
                        description: row["description"] # 説明
                }
    },
    reference_name: row["name"], # 参照名
    product_id: row["product_id"], # 製品ID
    cleared_for_sale: true, # 配信可能か
    merch_screenshot: nil, # App Store プロモーション
    review_notes: "購入確認画面です", # 審査メモ
    review_screenshot: "./screenshot/review_screenshot.jpeg", # 審査スクショ
    pricing_intervals:
      [
        {
          country: "WW", # Product Territory WW=World Wide
          begin_date: nil,
          end_date: nil,
          tier: row["tier"]
        }
      ]
  )
end

puts "done!"

Spaceship::Tunes.loginメソッドでApp Store Connectにログインし、Spaceship::Application.findメソッドで対象のアプリケーションを指定します。app.in_app_purchases.create メソッドを呼ぶことでストアにアイテムが登録されます。引数を指定することで登録するアイテムをかなり細かく設定することができます。

このスクリプトを以下のように叩くことで、アイテム登録を実行できます。

SPACESHIP_SKIP_2FA_UPGRADE=1 bundle exec ruby (スクリプト名)

今回はApp Store ConnectのApp内課金アイテムの登録を自動化してみました。うちのプロジェクトではこのスクリプトを使って、今まで1時間近くかかっていた登録作業が数分に短縮できました!
また、登録するアイテムをcsv化することでダブルチェックのレビューがしやすくなり、安全性も上がりました。
始めの導入コストはありますが、驚くほどアイテム登録が楽になるので、アイテム登録に悩んでいる方は是非やってみてください!

2/15 追記

2021年2月からApp Store Connectにサインインするのに2ファクタ認証が必要になりました
この影響で、spaceshipでのログイン時に以下のエラーが出るようになってしまいました。

Need to acknowledge to Apple’s Apple ID and Privacy statement. Please manually log into https://appleid.apple.com (or https://appstoreconnect.apple.com) to acknowledge the statement. (Spaceship::AppleIDAndPrivacyAcknowledgementNeeded)

こちらのissueで解決方法が述べられており、以下の手順で解決できます。

  1. Gemfileを以下のように変更
source "https://rubygems.org"

gem "fastlane", :git => "https://github.com/fastlane/fastlane.git", :branch => "joshdholtz-skip-2fa-upgrade"
  1. スクリプトの実行の際に、 SPACESHIP_SKIP_2FA_UPGRADE=1 の環境変数を設定する
SPACESHIP_SKIP_2FA_UPGRADE=1 bundle exec ruby (スクリプト名)

ただ、この方法は2段階認証をまだ設定していないApple Store Connectのアカウントしかできないようです。
2段階認証したアカウントで実行する方法は分かり次第追記したいと思います。