Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アプリ内課金のはまりどころ

 アプリ内課金のはまりどころ

Shinya Suefusa

December 12, 2018
Tweet

More Decks by Shinya Suefusa

Other Decks in Programming

Transcript

  1. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 2/57 今回は 最新技術スゲェ!

    最新技術スゲェ! ではなく ナレッジの共有 ナレッジの共有 を目的として発表いたします
  2. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 6/57 もちろんMonaca でも使えます。

    公式のチュートリアルに書いてあります。 ただしサードパーティーなので有償プランで! https://docs.monaca.io/ja/tutorials/in-app_purchase
  3. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 7/57 ここで ここで

    さらっとアプリ内課金のポイントだけ ご説明しておきます (この場に無課金ユーザーはいないはず!)
  4. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 11/57 1. 商品をプラグインに登録する

    2. ストアから商品情報を取得する 3. 商品を購入する 4. 商品を消費する store.register(product); store.refresh(); store.order(product); product.finish();
  5. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 17/57 プロジェクトにを追加するとき、 ※Monaca

    だとプラグインのインポートですが。 とすると、 なんか古いプラグインが追加されて動かない。 (正確には現在はなおったっぽい?) cordova plugin add cordova-plugin-purchase
  6. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 22/57 Android で動かすなら、リリース版の署名が必要。

    課金を試すのにストアへ内部テスト版としてAPK を 登録しなければならない。 この時、APK がdebuggable=true になっているとAPK がストアに弾かれるので、デバッグはできなくな る。
  7. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 23/57 署名無しやStore にAPK

    を登録せずに動かすと、 みたいなエラーが出る。 6777017: E/IabHelper: In-app billing error: Purchase signature verification FAILED for sku android.test.purchased
  8. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 26/57 Android でどうしてもデバッグしたい場合。

    1. リリースビルドAPK をストアに登録 2. 同じ署名でデバッグ版を作る 3. 実機インストール! すればデバッグが有効になった状態でアプリ内課 金を試せる。 adb install -d xxx.apk
  9. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 30/57 そして、 しれっと

    GooglePlay のライセンステストの登録が 外れることがある。 (タイミングは不明)
  10. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 34/57 事例4 事例4

    iOS の審査時のレシート検証に iOS の審査時のレシート検証に 注意 注意 for iOS
  11. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 35/57 iOS のレシート検証は、テスト用の「Sandbox

    」と 「本番」がある。 アプリリリースするには、本番用の設定のビルド をするわけですが、審査時の(審査員の)レシー トは「Sandbox 」のものになるため、「本番」の検 証サーバにアクセスするとエラーになる。
  12. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 39/57 プラグインのrefresh 関数をコールすると、状態が

    OWNED から再度、APPROVED に遷移する。 (APPROVED イベントが発火する) で、再度レシート検証をして期限切れになってい ないかチェックする必要がある。
  13. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 41/57 プラグインのAndroid 側にバグがあって、前の事例

    に書いたレシート検証で期限切れとした場合で も、商品の所有状態(OWNED )がfalse に戻ってく れない(!!)
  14. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 42/57 検証NG でEXPIRED

    にするとき、一緒に product.owned = false にする必要がある。 これ重要! なお、iOS 版はちゃんとfalse になる。
  15. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 44/57 iOS 版は購入状態の「リストア」機能が無いとリジ

    ェクトされる。 iPhone を買い替えたーとか、iPad でも使うー、と か。 同じAppleID 使えば同じ購入状態にせよ。 という厳しいルールがある。
  16. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 45/57 ところが、iOS 版のプラグインは、refresh

    関数を2 回呼ぶと、リストアが自動的に行われる仕様にな っている。 SPA なUI を採用していると、2 回以上呼んじゃうっ てところにはまって、勝手にリストアされて新し いレシートが発行されて。。 と面倒なので、担当した案件では勝手にリストア されないように細工した。
  17. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 46/57 storekit.restore の中にリストア処理を呼ぶ実装があ

    るので、空の関数に差し替える。 if (window.storekit) { // StoreKit(iOS) 場合 refresh時 restore 防 // restore関数 無効化 const storekit = Object.getPrototypeOf(window.storekit) storekit.originalRestore = storekit.restore storekit.restore = () => {} }
  18. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 47/57 事例8 事例8

    StoreKit にアクセスすると毎回 StoreKit にアクセスすると毎回 ID/PASS を聞かれる ID/PASS を聞かれる for iOS
  19. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 48/57 iOS のSandbox

    でテストする時、StoreKit 経由でStore にアクセスしたタイミングでAppleID を毎回入力す る必要がある。 (iPhone のStore の設定にテストアカウントは登録 することはできない) 一応、入力ダイアログをキャンセルすることもで きる。
  20. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 50/57 事例9 事例9

    ローカルストレージがパンクす ローカルストレージがパンクす る る for iOS
  21. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 51/57 iOS 版はトランザクションをfinish

    するとレシート情 報やトランザクションID が取れなくなるため、ロ ーカルストレージに情報を保持している。 しかし、レシート情報が結構なサイズなので、定 期購読するとローカルストレージがいずれパンク する。
  22. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 52/57 レシート情報をあとで使いたいシーンがないので あれば、下記3つはアプリ起動時とかに消すよう

    にする。 if (window.localStorage) { // iOS 情報 使用 破棄 window.localStorage.removeItem('sk_receiptForProduct') window.localStorage.removeItem('sk_receiptForTransaction') window.localStorage.removeItem('sk_appStoreReceipt') }
  23. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 53/57 事例10 事例10

    プラグインは SPA に配慮されて プラグインは SPA に配慮されて いない? いない? for iOS/Android
  24. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 54/57 プロダクトのregister は初回のrefresh

    にしか反応し ない。 つまり、SPA アプリで一度register→refresh でロード してしまうと、WebAPI とかで再度最新のプロダク トID を追加取得しても追加ロードができない。 グローバル変数でカウントしているため、どうに もならない。。
  25. 2018/12/13 RevealJS : /Users/s-suefusa/Desktop/md/MonacaUG OKAYAMA #3/slide.1.md http://localhost:50115/?print-pdf-now#/ 55/57 という感じで という感じで

    事例を10個ご紹介しましたが、 実際はもっとた くさんノウハウが溜まりました。