iosdc2019_ihara

©︎ iOSDC Japan

AbemaTVでiOSエンジニアをしている@funzinです。

9月5日(木) 〜 9月7日(土)にかけて開催されたiOSDC Japan 2019において、サイバーエージェントは今年もダイアモンドスポンサーを務め、 5名のエンジニアが登壇しました。
今日は、iOSDC Japan 2019で井原さん(@nonchalant0303)が発表された「動画アプリの投げ銭機能における消耗型課金の仕組みと実装」についてレポートしていきます。

 

登壇者ノート付き資料: iOSDC 20190906: 動画アプリの投げ銭機能における消耗型課金の仕組みと実装 with 発表ノート – Speaker Deck

自己紹介

今回井原さんは、AbemaTVに消耗型課金を導入したことについて登壇されました。
Twitterでは技術のことはあまりつぶやかず、趣味のツイートが多いそうです。

App内課金

本題ですが、iOSのApp内課金では、大きく以下4つに分類されます。

  1. 消耗型
  2. 非消耗型
  3. 自動更新サブスクリプション
  4. 非更新サブスクリプション

非消耗型の例としては、広告の非表示、消耗型の例として、ソシャゲの魔法石などがあげられます。
AbemaTVでは、自動更新サブスクリプションと消耗型課金の2種類のApp内課金を使用しており、今回のセッションでは消耗型課金についての説明がメインでした。

消耗型課金の注意点

消耗型課金の実装時に注意しなければいけない点として、消耗型では何回でもコンテンツを購入できるため、購入するたびに購入履歴が上書きされてしまいます。
そのため、App Storeによる購入は完了しているものの、コンテンツが配布されないといった不整合が発生する場合があります。

不整合が発生するケースとしては、以下の2つが考えられます。

  1. サーバー側からレシート(購入情報)を送るときに失敗する
  2. コンテンツを付与したサーバーからのレスポンスが受け取れない

不整合の対策

そのため、未完了のトランザクション(購入取引)が存在する場合は、リトライする機能を追加することで対応しました。

リトライ処理のタイミングとしては以下の3つを組み入れています。

  1. アプリ起動時
  2. バックフォア時
  3. コイン残高表示時

これらの対策によって、万が一未完了のトランザクション存在していても、リトライ処理が実行されるため消耗型課金が正しく処理されます。

QA対応

リリースする前にQA(品質保証)を通す際に、QAチームでは失敗条件(例: App Storeで購入が完了したが、コンテンツが配信されない)を見た目で判断することが難しく、検証項目を作成しにくい問題がありました。
そこでMindMeisterを使用することで認識を合わせ、デバッグモードで失敗するケースを用意することで対応をしました。

まとめ

これらの発表からユーザー側が消耗型コンテンツを購入したときに失敗する可能性があるためリトライ機能を実装することの重要性がわかりました。
消耗型課金を実装しようとしている方はぜひ参考にしてみてください。