Capacitor (Cordova プラグイン利用) のアプリ内課金が、手元では動くのに審査では「課金ボタンを押しても何も起きない」で 3 回連続却下された。
真犯人は、課金プラグインのグローバルオブジェクトが初期化完了前に「空の {} 」として先に現れること。typeof チェックは通るのに中身が無い。
再現してから直すまでの記録と、二度と踏まないための見張りを書く。
Capacitor (Cordova プラグイン利用) のアプリ内課金が、手元では動くのに審査では「課金ボタンを押しても何も起きない」で 3 回連続却下された。
真犯人: グローバルが空 {} で先に現れる
Cordova のプラグインは clobber という仕組みで window.CdvPurchase のようなグローバルを生やす。問題は、初期化が終わる前に空のオブジェクト {} として先に現れるタイミングがあること。
こちらのコードはこう判定していた:
if (typeof CdvPurchase !== 'undefined') { /* 準備できたとみなす */ }
typeof チェックは準備完了の証拠にならない。 空 {} でも通る。空を本物と誤認して初期化処理が throw し、さらに「試行済み」フラグが立ったままになって再試行もされず、全商品が無価格のまま死んでいた。
なぜ 3 回も却下されたか
最初の 2 回は、再現しないまま推測で直した。これが敗因。起動タイミングは端末や状況で揺れるので、手元の 1 台で動いた、は何の証拠にもならない。
3 回目の前にようやく実機相当のログを取った。シミュレータなら:
xcrun simctl launch --console-pty <device> <bundle-id>
これで「空 {} → 後から本物」の順で現れるのが確認できた。再現してから直す。推測修正は却下回数を増やすだけ。
直し方
2 点セット:
- 使う部品を名指しして形をチェックする。 存在確認でなく、
CdvPurchase.storeやCdvPurchase.ProductTypeなど実際に使うプロパティが揃っているかを見る - 失敗した試行を「試行済み」に数えない。 初期化に失敗したらフラグを戻し、本物が現れた時にもう一度走れるようにする
見張り
「空 {} → 本物」の順で現れる状況をテストで再現した (偽の CdvPurchase を差し替えて register → order → approved → finish の順に流す)。修正前のコードでこのテストが赤くなることを確認してから出荷した。
まとめ
- Cordova 系グローバルの typeof チェックは信用しない。使う部品の形まで見る
- 失敗した初期化を試行済みに数えない
- 審査固有の不具合は、推測で直す前に console-pty でログを取って再現する
コメント (0)
まだコメントなし。