◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Expo SDK 58 が 10/15 に正式リリースされました(Beta は 09/15 から)。上げる前に依存の対応状況を確認しましょう●SDK 58 ISSUE — Android ウィジェットが定期更新されない、Stripe が静的リンクになるなど初期報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Expo SDK 58 が 10/15 に正式リリースされました(Beta は 09/15 から)。上げる前に依存の対応状況を確認しましょう●SDK 58 ISSUE — Android ウィジェットが定期更新されない、Stripe が静的リンクになるなど初期報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/ビジネス
⟐ ビジネス/2026-10-21上級

起動回数のカウンタが、1回の起動で2ずつ進んでいました — 新規ユーザーの広告猶予が早く終わった原因

新規ユーザーの広告猶予が早く終わった原因は、起動回数を数える処理が二か所から呼ばれ、1回の起動で2進んでいたことでした。数える場所を一か所に絞る部品を、手元で動かして確かめた記録です。

起動回数広告AsyncStorage11競合状態運用実録

✦ プレミアム記事

新規ユーザーには最初の数回の起動だけ広告を出さない——壁紙アプリのひとつに、そんな猶予を入れておりました。しきい値は3回の想定です。

ところが、広告は思っていたより早く出始めていました。原因は、広告の側にはありませんでした。起動回数を数える処理が、アプリの起動時と画面の起動時の両方から呼ばれていて、1回の起動でカウンタが2進んでいたのです。

しきい値が3なら、1回目の起動後の値は2、2回目の起動後は4です。猶予にいられるのは、3回ではなく実質1回でした。

最初にお伝えしたいのは、直した場所が広告の設定ではなく、「数える場所」だったという点です。広告の設定ばかりを疑っていたら、きっと遠回りになっていたのではないかと思います。以下は、その考え方を Expo(Rork が書き出す React Native)向けに組み直し、Node 22 で実際に走らせて確かめた書き残しです。

猶予が3回のはずなのに、算数が合わなくなる

数え方を紙に書くと、こうなります。

起動1回の起動で進む量が 1 のとき2 のとき(今回の不具合)
1回目の起動後1(猶予)2(猶予)
2回目の起動後2(猶予)4(広告が出る)
3回目の起動後3(猶予)6(広告が出る)
4回目の起動後4(広告が出る)8(広告が出る)

猶予の判定は「カウンタがしきい値以下か」だけです。判定そのものは正しく動いていました。誤っていたのは、判定に渡す数字のほうです。

この種の不具合は、地味に厄介です。広告が早く出ても、画面は壊れません。クラッシュも、エラーも出ません。新規ユーザーの体験だけが、設計より少し冷たくなります。数字が合っているかは、数字を見に行かないと分からない——これを点検の最初に置くことにしました。

二か所から呼ばれる、という形

Android 版で見つかったのは、アプリ全体の起動処理と、最初の画面の起動処理の両方に、カウンタを進める呼び出しが入っていた、という形でした。どちらも「起動したから数える」という正しい動機で書かれており、片方ずつ見れば、間違いではありません。重なったことだけが、間違いでした。

Expo のアプリでも、同じ形は作りやすいと思います。次のような場所に、呼び出しが散らばりがちです。

呼び出しの置き場所1回の起動で何度走るか
モジュールの最上位(import しただけで走る)import された回数ではなく、評価された回数に依存します
ルートレイアウトの useEffect通常は1回。StrictMode を有効にした開発中は、2回走ります
最初の画面の useEffect通常は1回。画面を作り直すたびにもう1回走ります
広告 SDK の初期化の直後初期化の呼び出しが二重なら、ここも二重です

開発中に Fast Refresh でファイルを保存したときも、効果は再び走ります。開発機の数字だけを見ていると、本番の数字との違いに気づけません。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦自分のアプリで起動回数を数えている場所を洗い出し、1回の起動で何度カウンタが進むかを、テストで数値として確かめられるようになります
✦非同期ストレージの「読んで、足して、書く」が、呼ぶ間隔しだいで +1 にも +2 にもなる理由を理解し、出荷前に同じ型の不具合を見分けられるようになります
✦何か所から呼ばれても1回の起動で1だけ進める部品を、AsyncStorage 向けに手元へ置き、猶予の判定とは切り離して自動テストできるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ ビジネス2026-10-19
アプリに課金を入れる前に決める、特商法表記の住所と電話番号の扱い方
有料プランを入れると、個人でも特定商取引法の表記ページが必要になる場面があります。住所と電話番号を載せる・請求時に開示する・別住所を使う、の3択を、消費者庁ガイドの表記事項に沿って比べ、決める順番を整理します。
⟐ ビジネス2026-10-18
提出ログを貼っても直らなかった夜は、末尾ではなく「最初のエラー」から読み直します
Rork の App Store 提出が失敗し、ログを貼って直してもらっても同じ失敗が続くとき。ログの最初のエラー行だけを取り出す 40 行ほどのスクリプトと、公式ドキュメントが挙げる 4 つの原因との突き合わせ方をまとめました。
⟐ ビジネス2026-10-17
予約や物販のアプリで Stripe を使ってよいか — Apple の線引きは「どこで消費されるか」です
予約や物販のアプリに Stripe を入れてよいのか、アプリ内課金を求められるのか。App Review Guidelines の 3.1.1 と 3.1.3 を「どこで消費されるか」で読み分け、売るもの別の判定表と審査メモの書き方をまとめました。