Beautiful HD Wallpapersや浮世絵壁紙アプリに寄せられるレビューは、英語・日本語・スペイン語・ポルトガル語・ドイツ語・韓国語・中国語など8言語以上にまたがります。累計5,000万DLを超えるアプリを1人で運営していると、レビュー返信は毎週1〜2時間を消費する地味に重い作業です。
Antigravityを使って多言語レビュー返信のワークフローを設計したのは2026年初頭のことでした。現在は1セッション30〜40件を、一定の品質を保ちながら30〜45分で処理できています。ただし「完全自動化」には至っていません。App Storeには各送信間に約8秒の待機が必要という実運用上の制約があり、これを軽視すると返信が表示されずに消えてしまうことがあります。設計過程と実際のプロンプト構造を以下に記録しておきます。
Antigravity を使う前の状況
2013年に独立系スマートフォンアプリ事業を始めてから、アプリストアのレビュー管理は常に後回しになりがちな作業でした。低評価レビューには特に丁寧な対応が必要で、ユーザーの言語に合わせた返信を書こうとすると、Google翻訳と行き来しながら1件あたり5〜10分かかることも珍しくありませんでした。
週に30件以上のレビューが来る時期は、それだけで1〜2時間以上消えます。個人開発者として開発・保守・マーケティングを1人でこなしながら、この作業を毎週続けるのは現実的ではありませんでした。
最初に試したのは、単純にAIに「このレビューに返信して」と投げる方法でした。返答の質は悪くありませんでしたが、問題は2点ありました。
- アプリの個性やトーンが統一されない
- App Storeへの送信操作は結局手動で、件数が増えるとどこまで処理したか管理が煩雑になる
Antigravityのエージェント機能を使うようになったのは、この2点を解決したかったからです。
App Store の「8秒ルール」を発見したとき
Antigravityでレビュー返信の自動化スクリプトを組んだとき、最初に直面したのは「返信が送信されているように見えるが、実際にはApp Store Connectに反映されない」という問題でした。
調べてみると、App Store Connectに対して短時間に連続してAPIリクエストを送ると、返信がサイレントに破棄されることがあるとわかりました。実運用での体感として、各送信間に約8秒の待機を入れると安定することが確認できました。
import time
def reply_to_review(review_id: str, reply_text: str, client) -> bool:
"""App Store Connectへのレビュー返信(レート制限対策済み)"""
try:
response = client.post(
f"/v1/customerReviewResponses",
json={
"data": {
"type": "customerReviewResponses",
"attributes": {"responseBody": reply_text},
"relationships": {
"review": {
"data": {"type": "customerReviews", "id": review_id}
}
}
}
}
)
return response.status_code == 201
except Exception as e:
print(f"Error: {e}")
return False
finally:
# App Storeのレート制限を回避するための待機
time.sleep(8)この8秒ルールはApp Storeの公式ドキュメントには明記されていません。Google Playは比較的制限が緩く、この問題は主にApp Store Connectで発生します。
Antigravity でのレビュー返信ワークフロー設計
Antigravityのエージェントに渡すタスクを整理すると、以下の3段階になります。
1. レビューの取得と分類
App Store Connect APIからレビューを取得し、Antigravityが感情(ポジティブ/ネガティブ/バグ報告/機能要望)と言語を自動分類します。
2. 返信文の生成
分類結果に基づいて、アプリのトーンガイドを参照しながら各言語に合わせた返信文を生成します。ここでAntigravityに渡すシステムプロンプトが品質の要になります。
3. 送信の実行(8秒間隔)
生成した返信文を確認してからスクリプトを実行し、8秒待機を挟みながら順次送信します。
この3段階のうち、人間が介在するのは「2」と「3」の間の確認フェーズのみです。1件ずつ内容を確認し、問題があれば修正してから送信します。
多言語プロンプトの構造
Antigravityに渡すシステムプロンプトの設計で最も時間を使いました。単純に「この言語で返信して」と指示するだけでは、アプリの雰囲気から外れた硬い返信になりがちです。
以下は実際に使用しているプロンプト構造の簡略版です。
# Beautiful HD Wallpapers レビュー返信ガイドライン
## アプリの位置づけ
癒しと美しさを届けるウォールペーパーアプリ。ユーザーとの対話は温かく、感謝を基調とする。
## 返信の原則
- 感謝を先に伝える(批判的なレビューにも)
- バグ報告には具体的な次のアクション(アップデート予定など)を添える
- 文化的なニュアンスを尊重する(韓国語は丁寧さを重視、英語はカジュアルに)
## 各言語の注意点
- 日本語: 敬体(です/ます調)を必ず使う
- 英語: "Thank you for your feedback!" より "Thanks for taking the time to review" の方が自然
- スペイン語/ポルトガル語: ラテン文化の温かさを出す
- 韓国語: 존댓말(丁寧語)を維持する
- ドイツ語/フランス語: "Sie/vous" のフォーマル表記を使う
このガイドラインを持たせることで、生成される返信の品質が大きく改善しました。特に「各言語の注意点」は、自動生成では見落としがちな文化的ニュアンスを補うために有効です。
Google Play と App Store の差異への対応
同じワークフローをGoogle PlayのBeautiful 4K/HDR Wallpapers(Android版)にも適用しています。Google PlayとApp Storeでは、APIの仕様と制限が異なります。
主な差異をまとめると以下の通りです。
- 送信間隔: Google Playは3〜5秒程度でも安定、App Storeは8秒必要
- 文字数制限: App Store は350文字以内が推奨(超えると表示が崩れる)、Google Playは500文字
- APIの安定性: Google Play Developer Publishing APIは比較的安定している
- 返信の修正: App Storeは一度送信した返信を修正しにくい
App Store向けには350文字以内の制約を意識して、Antigravityに返信生成時に文字数チェックも組み込んでいます。
def generate_reply(review_text: str, rating: int, language: str,
platform: str = "ios") -> str:
"""プラットフォーム別の文字数制限を考慮した返信生成"""
max_chars = 350 if platform == "ios" else 500
prompt = f"""
レビュー言語: {language}
評価: {rating}星
レビュー内容: {review_text}
上記のレビューへの返信を{language}で生成してください。
- 文字数: {max_chars}文字以内
- ガイドライン: [システムプロンプト参照]
"""
# ... Antigravity APIへの送信半自動化してわかったこと
2026年初頭から運用を続けて4ヶ月ほど経ちます。感じていることをいくつか書きます。
完全自動化より「半自動化」が現実的
特に1〜2星の低評価レビューは、AIが生成した返信をそのまま送ることに抵抗があります。批判的なフィードバックには人間の判断と言葉が必要で、ここは省力化しすぎると逆効果になる場面があります。Antigravityはあくまで「下書きを高速に用意してくれるアシスタント」として位置づけています。
トーンガイドラインの整備が核心
プロンプトに投資した時間の半分以上は、このガイドラインの改善です。「どんな言葉で返すか」を事前に言語化しておくことで、AIが出す返信の品質が安定してきます。これはAntigravityに限らず、どのAIツールを使う場合でも同じだと感じます。
レビュー返信の質がApp Storeの露出に影響する可能性
Apple公式には明言されていませんが、レビューへの返信率が高いアプリは一定の評価を受けているという話を複数の個人開発者から聞いています。少なくとも、ユーザーが「開発者がちゃんと見ている」と感じることで追加レビューや口コミに繋がる体験はしています。
まず試すとしたら、普段対応しているレビューの中から「よくある質問・バグ報告・感謝」の3パターンを抜き出して、Antigravityにトーンガイドラインを渡した状態で返信案を生成してみてください。想定より自然な返信が出てくることに気づくはずです。
Antigravity のエージェントセットアップ
Antigravityを使ったレビュー返信自動化の最小構成を共有します。エージェントはインタラクティブではなく、定期タスクとして動かしています。
App Store Connect APIへの接続はJWT認証が必要です。以下のような構成で未返信レビューを取得します。
import jwt
import time
import requests
from datetime import datetime, timedelta
def generate_app_store_token(key_id: str, issuer_id: str, private_key: str) -> str:
"""App Store Connect JWT生成(有効期間20分)"""
payload = {
"iss": issuer_id,
"iat": int(time.time()),
"exp": int(time.time()) + 1200,
"aud": "appstoreconnect-v1"
}
headers = {"kid": key_id, "typ": "JWT"}
return jwt.encode(payload, private_key, algorithm="ES256", headers=headers)
def fetch_unresponded_reviews(app_id: str, token: str, days_back: int = 7) -> list:
"""未返信レビューを取得"""
url = f"https://api.appstoreconnect.apple.com/v1/apps/{app_id}/customerReviews"
headers = {"Authorization": f"Bearer {token}"}
params = {"sort": "-createdDate", "limit": 200}
reviews = requests.get(url, headers=headers, params=params).json()
cutoff = datetime.now() - timedelta(days=days_back)
unresponded = []
for review in reviews.get("data", []):
created = datetime.fromisoformat(
review["attributes"]["createdDate"].replace("Z", "+00:00")
)
if created.replace(tzinfo=None) >= cutoff:
# 既存の返信がなければキューに追加
if not review.get("relationships", {}).get("response", {}).get("data"):
unresponded.append(review)
return unrespondedAntigravityのエージェントがこのリストとトーンガイドラインを受け取り、返信案をJSONで出力します。私はそのJSONを確認・修正してから送信スクリプトを実行します。
確認作業は30件で5〜10分、その後の送信は30件 × 8秒で4分ほど無人実行されます。
品質の自動チェック
最初の1ヶ月の運用後に追加したのが、送信前の自動チェックです。
def basic_quality_check(reply: str, language: str, rating: int) -> list[str]:
"""送信前の簡易品質チェック"""
warnings = []
if len(reply) > 350:
warnings.append(f"文字数超過: {len(reply)}文字(App Storeは350文字以内推奨)")
if language == "ja" and not any(c in reply for c in ["す", "ます", "です"]):
warnings.append("日本語の敬体(です/ます)が含まれていない可能性")
if rating <= 2 and len(reply) < 80:
warnings.append(f"{rating}星への返信が短すぎます({len(reply)}文字)")
if "[" in reply or "]" in reply:
warnings.append("プレースホルダーが未入力の可能性")
return warnings日本語版が英語で返ってきたケース、1星のレビューへの返信が2文しかなかったケース、プレースホルダーが残ったままのケースなど、実際に検出されたことがある問題をそれぞれチェックしています。このチェックを通じて確認作業が明らかに速くなりました。