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

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

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

Avatar for Shinya Suefusa

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個ご紹介しましたが、 実際はもっとた くさんノウハウが溜まりました。