こんにちは。207 でソフトウェアエンジニアをやっている原口 (id:nagamejun)です。 今回は Expo InAppPurchases から RevenueCat に移行した内容について話します。
1年前に Expo の InAppPurchases に移行しましたが今回 RevenueCat に移行しました。その理由と導入方法・注意点についてまとめました。
expo SDK 45 に update 出来ない
207では先日のエントリーの通り EXPO のサポート期間中にバージョンアップを進めています。
expo SDK 45 に update した際に Android にて課金しようとするとエラーが発生し、課金できないという不具合が発生しました。issueはこちら
他にも解決してない issue があり brent氏 が expo-in-app-purchases は積極的に取り組んでいないので、revenuecat 使うと良いと思う(意訳)とコメントしてました。
i'd recommend trying out revenuecat's integration for a more fully featured option than what is available as of june 2022 in expo-in-app-purchases. we aren't actively working on this module at the moment so you will likely have more success with revenuecat's library. see this post for more info: https://www.revenuecat.com/blog/using-revenuecat-with-expos-managed-workflow/
Ruby3 に update 出来ない
サーバーサイドで receipt 情報のチェックに candy_check という gem を使ってましたが、メンテされてなく Ruby3 に update 出来ない状況です。
こうした問題があったので RevenueCat の導入をしました。
RevenueCatとは
iOS や Android アプリの課金処理をサポートするプラットフォームです。
App Store / Play Store での課金処理を実装する際に、バックエンドで receipt の検証などを代わりに実施してくれます。
導入
$10,000 MTR 以上ある場合は課金する必要があるのでポチります。
今回は既存のプロジェクトがあるので移行ガイドを元に導入します。
RevenueCat への移行は2つの方法があり、データベースに base64 のレシートや購入トークンを全て保存しているならサーバーサイドで移行できます。
今回はクライアントサイドで移行する手順を記載します。
RevenueCat のセットアップ
実装の前に RevenueCat の設定をします。事前に Entitlements / Offering / Producs の説明を本家のドキュメントで確認しておくと良さそうです。
Configuring in-app products – RevenueCat
Products(製品)の作成
Entitlements(資格)の作成
Package(パッケージ)の作成
Offering(提供品)の作成
実装
react: 18.0.0
expo: 45.0.0
react-native-purchases: 5.0.2
react-native-purchases 5系で破壊的変更が入ってます。当時 document が更新されてなかったので Release 5.0.0 · RevenueCat/react-native-purchases · GitHub で確認
ライブラリを追加
Expo Bare Workflow の場合
SDKの初期化
クライアントサイドで古いシステムから移行する場合は、購読者を正しく追跡するために、RevenueCat SDK に1度だけ同期するように指示する必要があります。Purchases.syncPurchases(); を使います。初期化処理に書いておき、sync が終わってる場合は Purchases.logIn で customerInfo を取得します。
購入ボタン
購入処理は Purchases.purchaseProduct(productIdentifier: string) を実行します。 RevenueCat では明示的に指定されてない限り日付は UTC で表されます。ここでは latestExpirationDate を JST に変換しています。
復元ボタン
復元処理は Purchases.restorePurchases() を実行します。
顧客情報が更新されたときに呼び出されるリスナー関数を設定します。updateExpiresAt 関数でアプリ内の state が更新できます。
以上で終わりです。
必要があればバックエンドの方でも RevenueCat の API を叩いて有料コンテンツの出し分けを制御します。
REST API の Document Get or Create Subscriber
動作確認
TestFlight、内部テストでの購入が正常に動作しているか RevenueCat のサンドボックスモードで確認できます。
おわりに
こんな感じで簡単に置き換えができました。課金コンテンツですが課金状況の分析なども可能になります。個人開発であれば無料枠で十分だと思うので気になる方は利用してみて下さい。
いつもの
207株式会社では、レガシーな物流業界の変革に挑む配達員向け効率化アプリ「TODOCUサポーター」を開発しています。 フロントエンドの開発をしたいメンバーを大絶賛募集中です!
もし少しでもご興味がありましたら以下のnotionをご覧ください!