◉CLAUDE LABEN
●CODE 2.1.319 — Claude Code で MCP のタスク実行が自動でバックグラウンドに回るようになりました。確認待ちを拒否に倒す denyInsteadOfPrompting 設定も入りました●FABLE 5.2 — Claude Fable 5.2 と fast mode が Claude API に登場しました(11/9)。Mythos 5.2 は検証済みの組織のみが対象です●SONNET 4.5 — Claude API での提供終了は 11/30、残り20日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST — Opus 4.8 の fast mode は非推奨になり、11/30 に除去されます。移行先は Opus 5.5●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●CODE 2.1.319 — Claude Code で MCP のタスク実行が自動でバックグラウンドに回るようになりました。確認待ちを拒否に倒す denyInsteadOfPrompting 設定も入りました●FABLE 5.2 — Claude Fable 5.2 と fast mode が Claude API に登場しました(11/9)。Mythos 5.2 は検証済みの組織のみが対象です●SONNET 4.5 — Claude API での提供終了は 11/30、残り20日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST — Opus 4.8 の fast mode は非推奨になり、11/30 に除去されます。移行先は Opus 5.5●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-08-12中級

課金ユーザーに広告が出る不具合を、判定の一元化で止めるまで

広告除去を購入した方に広告が出てしまう不具合の原因は、フラグの不足ではなく判定の分散でした。Claude Codeで広告SDKの呼び出し口を棚卸しし、単一の純粋な判定関数へ畳み込むまでの実装記録です。期限判定を端末時計に預けない工夫や、消し忘れを構造で防ぐ設計も紹介します。

Claude Code284Android7アプリ内課金広告状態管理

✦ プレミアム記事

広告除去を購入してくださった方から「まだ広告が出ます」という連絡をいただく朝ほど、気の重いものはありません。

クラッシュなら「直しました」で済みます。けれど購入いただいた対価がその場で返っていないという不具合は、返金対応で数字が戻っても、その方の中に残った印象までは戻せません。個人開発で壁紙アプリを長く運用してきて、私がいちばん神経を使っているのはこの一点です。

そして原因を追いかけると、たいてい「フラグが足りなかった」のではありませんでした。フラグは足りていて、それを見に行かない場所が一つ残っていた、というのが実際のところです。

広告を消す入口は、性質の違うものが複数ある

私のアプリでは、広告が消える経路が最初から一本ではありませんでした。

経路状態の持ち主有効期間失われ方
広告除去の購入BillingManager(Google Play Billing)恒久返金・アカウント変更
リワード広告の視聴AdFreeManager(ローカル保存)一定時間時間経過
購入の復元BillingManager(起動時の照会)恒久照会が返るまで未確定

この三つは、寿命も、真偽が確定するタイミングも違います。購入は起動直後にはまだ分かりません。リワードは時計の話です。復元は非同期で後から真になります。

にもかかわらず、画面側のコードはどれも同じ顔をした条件式になります。

// 初期の実装。画面ごとに少しずつ違う条件式が生えていた
if (!billingManager.isAdFree) {
    interstitialAd.show(this)
}

リワードを足したときに、この行は次のように育ちます。

if (!billingManager.isAdFree && !adFreeManager.isRewardAdFree) {
    interstitialAd.show(this)
}

条件が一つ増えるだけなので、その場では正しい修正に見えます。問題は、この形の行がアプリ内に何箇所あるかを誰も把握していないことです。壁紙一覧、詳細、カテゴリ、設定からの戻り、そして戻るボタンの終了フロー。追加したときに一つ書き漏らせば、そこだけが古い判定のまま生き残ります。

探すべきものは、フラグ名ではなく広告 SDK の呼び出し口

棚卸しを始めたとき、私は最初 isAdFree を grep しました。これは半分しか当たりません。書き漏らした箇所には、そもそも isAdFree が書かれていないからです。探すべきは条件式ではなく、広告を出す側の呼び出しでした。

Claude Code にはこの棚卸しをそのまま任せられます。私が使っているのは、探索対象を広告 SDK 側に固定した指示です。

claude -p '広告の表示につながる呼び出しを全て列挙してください。
探索の起点は条件式ではなく、以下の呼び出し側とします。
 
- InterstitialAd.show / RewardedAd.show / RewardedInterstitialAd.show
- AdView.loadAd / AdLoader.loadAd
- AdView をレイアウトXMLに直接置いている箇所
 
各ヒットについて次の3列で表にしてください。
1) ファイルと行番号
2) その呼び出しの手前にある広告非表示の判定(無ければ「なし」と明記)
3) 判定が参照している状態(billing / reward / 両方 / なし)
 
推測は書かず、コード上に存在するものだけを挙げてください。'

ここで効くのは3列目です。「判定あり」で終わらせると、片方の状態しか見ていない箇所が合格してしまいます。私の場合、抜けていたのは条件式が無い箇所ではなく、購入だけを見てリワードを見ていない箇所と、レイアウト XML に直接置かれたバナーでした。XML のバナーはコードを grep しても永遠に出てきません。

判定が「なし」と「片方だけ」の二種類に分かれて出てくると、直す順番も決まります。私は次の順で片づけました。

  1. 判定が「なし」の行を塞ぐ。購入いただいた方に広告が出ている箇所なので、ここが最優先です
  2. 判定が「片方だけ」の行を直す。リワードを視聴した方に広告が出ている箇所で、優先度は次点になります
  3. レイアウト XML のバナーを目視で拾う。コードの grep には載らないため、最後に人の目で確認します

なお私のアプリは AdMob を使っており、バナーとインタースティシャル、リワードが同じ画面に混在します。AdMob のように読み込みと表示が分かれている SDK では、loadAd の側も対象に含めないと、広告は出ないのにリクエストだけ飛び続ける状態が残ります。本番運用ではこれが通信量として静かに積み上がるので、表示側と読み込み側の両方を同じ判定に載せることを推奨します。

✦

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

この記事の続きを読む

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

この記事で得られること
✦購入とリワード視聴で別々に持っていた広告非表示の状態を、1つの判定関数へ統合できるようになる
✦課金いただいた方に広告が出るという、最も信頼を損なう種類の不具合を、実装の段階で予防できるようになる
✦広告表示の分岐が複数画面に散らばったコードから、消し忘れの箇所を体系的に洗い出せるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⟐ Claude Code2026-05-18
Play Store 段階公開を Claude Code で自動監視する — v2.1.0 クラッシュ対応から学んだリリース戦略
Android アプリの段階公開(5%→100%)を Claude Code で自動監視するシステムの実装記録。Beautiful HD Wallpapers v2.1.0 での RecyclerView クラッシュ対応を例に、Crash-free Users 99.7% 基準の自動判定・ロールバック判断ロジックを詳解します。
⟐ Claude Code2026-04-15
Claude Code と作る StoreKit 2 × SwiftUI の課金実装 — 審査を通る最小構成と運用の落とし穴
Claude Code を設計パートナーにした StoreKit 2 × SwiftUI の課金実装を、PurchaseManager・サーバー検証・ペイウォールUIまで通しで組み立てます。Ask to Buy や Transaction.updates の遅延など、公式ドキュメントが触れない運用の詰まりどころも扱います。
⟐ Claude Code2026-04-07
Claude Code で Android / Kotlin アプリを Google Play 公開まで持っていく実装ノート
個人で長年運営してきたAndroidアプリ群の現場から得た、Claude Codeで本番品質を保つ実装パターン。Compose × Hilt × Roomの設計判断、ProGuardクラッシュ対応、Google Play公開直前の14項目チェックリストまでをまとめます。