【Swift】fastlane deliverを利用してストア申請情報の更新を自動化する

ストア申請作業にかける時間がもったいないので自動化を導入することにしました。プロジェクトでfastlaneのセットアップが完了していることが前提です!

編集するファイルについて

編集するファイルはmetadataディレクトリです。ここにストアで編集できる項目に該当するファイルが言語別で格納されています。

今回は下記3つを自動化してみたいと思います

・プロモーションテキスト
・概要
・リリースノート

実装手順

自分のアプリは日本で利用されることがメインのためjaディレクトリ内のファイルを編集し、多言語への翻訳はChatGPTを利用して翻訳させる対応を行います。

Bitriseでシークレットキーを登録

OpenAIのAPIキーをBitriseのシークレットに登録します。

ChatGPTをRubyで呼び出すスクリプトを作成

まずはプロジェクトのfastlane直下にscriptsディレクトリを作成します。

scripts内にchatgpt_translate_from_ja.rbという名前でRubyファイルを作成します。

AIに依頼したRubyファイルの内容は下記となります。

Ruby
require "net/http"
require "json"
require "fileutils"

API_KEY = ENV["OPENAI_API_KEY"]
raise "OPENAI_API_KEY not set" unless API_KEY

METADATA_DIR = File.expand_path("fastlane/metadata", __dir__)

# 翻訳対象の言語
target_langs = {
  "en-US" => "English",
  "fr-FR" => "French",
  "de-DE" => "German",
  "es-ES" => "Spanish",
  "ru" => "Russian",
  "zh-Hant" => "Traditional Chinese"
}

# 翻訳対象ファイル
FILES_TO_TRANSLATE = [
  "description.txt",       # 概要
  "release_notes.txt",     # リリースノート
  "promotional_text.txt"   # プロモーションテキスト
]

# ChatGPT翻訳関数
def translate(text, lang)
  uri = URI("https://api.openai.com/v1/chat/completions")
  headers = {
    "Content-Type" => "application/json",
    "Authorization" => "Bearer #{API_KEY}"
  }
  body = {
    model: "gpt-4o-mini",
    messages: [
      { role: "system", content: "You are a professional app store localization translator." },
      { role: "user", content: "Translate this from Japanese to #{lang}. Keep line breaks and tone natural.\n\n#{text}" }
    ]
  }
  res = Net::HTTP.post(uri, body.to_json, headers)
  JSON.parse(res.body).dig("choices", 0, "message", "content")
end

# 翻訳処理
FILES_TO_TRANSLATE.each do |filename|
  path = File.join("#{METADATA_DIR}/ja", filename)
  next unless File.exist?(path)

  ja_content = File.read(path)

  target_langs.each do |folder, lang|
    translated = translate(ja_content, lang)
    output_dir = File.join(METADATA_DIR, folder)
    FileUtils.mkdir_p(output_dir)
    File.write("#{output_dir}/#{filename}", translated)
    puts "✅ Translated #{filename} -> #{folder}"
  end
end

puts "🎉 Translation complete!"

FILES_TO_TRANSLATEに指定したファイルを元に各言語に翻訳して保存されます。試しにローカル環境で実行して確認してみてください。

本当AI感謝です…泣

Fastfileにlaneを作成

Fastfileにlaneを作成してBitrise上から呼び出せるようにします。

Ruby
  lane :release do
    translate_metadata
    upload_to_app_store
  end

  lane :upload_to_app_store do
    deliver(
      force: true,             # 常にアップロード
      skip_metadata: false,    # メタデータも更新
      skip_screenshots: true,  # スクショはスキップ
      automatic_release: true  # 承認後自動でリリース
    )
  end

 lane :translate_metadata do
   # ストアメタデータの翻訳スクリプトを実行
   sh "ruby fastlane/scripts/chatgpt_translate_from_ja.rb"
 end

このlaneをBitrise上から呼び出すことで自動翻訳が実行された状態となります。