ハイブリッドアプリの課金ボタンが、審査で 4 回連続「動かない」と言われた。手元の iPhone では動く。原因は 1 行の UA 判定だった。
iPadOS の Safari / WebView は、ユーザーエージェントに iPad と書かない。Macintosh と名乗る。
ハイブリッドアプリ (Capacitor 製) の課金ボタンが、審査で 4 回連続「動かない」と言われた。手元の iPhone では動く。再現できないまま推測で 2 回直して、2 回落ちた。原因は 1 行の UA 判定だった。
症状
- 審査却下 4 連続、理由はガイドライン 2.1 (動作不良)。「課金ボタンを押しても商品が出ない」
- 手元の iPhone 実機でもシミュレータでも再現しない
真因
課金ライブラリの初期化コードに、こう書いてあった。
const isIos = /iPhone|iPad|iPod/.test(navigator.userAgent);
iPadOS 13 以降、iPad の Safari / WebView のユーザーエージェントには「iPad」の文字が無い。「Macintosh; Intel Mac OS X」と名乗る (デスクトップ表示が既定になったため)。
結果、iPad では Apple 端末と判定されず、全商品が Google Play 側のストアに登録され、App Store には 1 つも載らず、課金ボタンが全部「取り扱いを停止しています」になった。
**審査は iPad で行われることが多い。**だから iPhone では通って、審査だけが落ち続けた。例外も出ない。課金だけが静かに死ぬ。
直し方
UA で OS を当てない。シェル側に聞く。Capacitor なら:
const platform = Capacitor.getPlatform(); // 実機の iPad で 'ios' が返る
皮肉なことに、同じプロジェクトの広告側のコードは最初からこの書き方で正しかった。正しい書き方と壊れた書き方が同居していると、壊れた方に気づけない。
見張りを残した
iPad の実 UA 文字列 (Macintosh 表記) を固定値にしたテストを書いた。古いコードに戻すとちゃんと落ちる。
おまけの罠
調査中、WebView の console.log がシミュレータのコンソールにどうしても出なかった。最終的に、ログを DOM に直接描いてスクリーンショットで読んだ。WebView のデバッグは、出力の経路から疑った方が早い。
コメント (0)
まだコメントなし。