【解決】Expo × RevenueCat × TestFlightでアプリ内課金が動かない原因は「env設定ミス」だった話

結論

アプリ内課金(In-App Purchase)が動かない原因は
EAS環境変数(env)の設定ミスと競合でした。


前提環境

  • Expo(EAS Build)
  • React Native
  • RevenueCat導入済み
  • App Store Connect設定済み
  • TestFlightで課金テスト中

発生した問題

  • TestFlightで課金できない
  • RevenueCatも正常に見える
  • App Store Connectも問題なし
  • コードもエラーなし

👉 なのに 課金だけ動かない


最初に疑ったこと(全部やった)

① RevenueCatの設定確認

  • Product ID一致 → OK
  • Offering設定 → OK
  • Entitlement → OK

② App Store Connect確認

  • In-App Purchase作成済み → OK
  • ステータス → OK
  • サンドボックステスター → OK

③ コード確認

Purchases.configure({ apiKey: process.env.EXPO_PUBLIC_RC_API_KEY_IOS });

👉 問題なし


それでも動かない…

ここでかなりハマる。


原因:envの「競合」と「設定ミス」

これが実際の状態👇

EXPO_PUBLIC_RC_API_KEY_IOS=*****(Secret)
EXPO_PUBLIC_RC_API_KEY_IOS=appl_appl_XXXXX(間違い)

問題点

① 同じenvが2つ存在していた

👉 EAS上で競合


② 値が壊れていた

appl_appl_XXXXX

👉 正しくは

appl_XXXXX

③ SecretとSensitiveが混在

👉 process.envで読めない可能性あり


なぜ起きたか

  • eas secret:create(旧コマンド)を使用
  • eas env:create(新仕様)と混在
  • 上書きできずに2重登録

👉 envの管理ミス


正しい解決手順

① envを全削除

eas env:delete

👉 同名のものを全部削除


② 正しく再登録

eas env:create \
--name EXPO_PUBLIC_RC_API_KEY_IOS \
--value "appl_XXXXX" \
--environment production

👉 visibilityは Sensitive


③ 確認

eas env:list --environment production

👉 こうなればOK

EXPO_PUBLIC_RC_API_KEY_IOS=appl_XXXXX

④ eas.json修正

"production": {
  "autoIncrement": true,
  "environment": "production"
}

⑤ 再ビルド

eas build --platform ios --profile production

なぜこれで解決するのか

EASの仕組み👇

ビルド時にenvがコードに埋め込まれる
↓
TestFlightで実行

👉 envが間違ってると
👉 APIキーが空 or 無効になる


ハマる理由(重要)

この問題は:

  • エラーが出ない
  • 見た目も正常
  • 他の設定も全部OK

👉 原因特定がめちゃくちゃ難しい


同じ現象が起きる人の特徴

  • Expo + RevenueCat使ってる
  • .envとEAS envを混同してる
  • コマンドを複数回試している
  • envを上書きしてるつもり

学び

  • envは「上書き」ではなく「競合」する
  • SecretとSensitiveは別物
  • EAS Buildはローカル.envを使わない

まとめ

アプリ内課金が動かないときは👇

  1. RevenueCat
  2. App Store Connect
  3. env(ここ超重要)

👉 特にEAS使ってる人は
👉 envを最優先で疑うべき


SEOキーワード

  • Expo アプリ内課金 動かない
  • RevenueCat 課金できない
  • TestFlight 課金テストできない
  • EAS env 反映されない
  • React Native IAP エラーなし動かない

最後に

「全部正しいのに動かない」は
だいたい envが原因です。

これはマジで盲点でした。

おすすめの記事