Open11

読者コミュニティ|React Nativeで作ったスマホアプリにAdmob(広告)とRevenue Cat(課金)を使ってマネタイズする

たも@Flutterくんたも@Flutterくん

アプリストアやrevenuecat上の消耗型課金の設定・実装に悩んでおります💦
アプリ内通貨を実装する方法を教えていただけると嬉しいです。
ちなみに僕の場合は価格設定が3つあります。

僕は以下のようにしました。
アプリストアでの製品IDは100yen , 500yen , 1000yenのようにしました。


■ revenuecat
[Entitlements]
Identifer:points
description:ポイント

[Products]
Identifer:100yen
description:100円

Idetifer:500yen
description:500円

Identifer:1000yen
description:1,000円

//IOS,Google両方同じものを入力しました。

Offerlingsはどうすべきか悩んでいます。

上記のやり方はあまり良くないと思うので、
あまり良くなければHAL様の方で直していただけると助かります。

たも@Flutterくんたも@Flutterくん

Offeringはこんな感じですかね

Annualにするのかと思っていましたが、
Annualにすると二つ目以降エラーが出るので困ってました。

customにして個別にIDを振る形にしたら複数いけました。



https://www.revenuecat.com/docs/non-subscriptions
参考記事

HALHAL

そうですね、非サブスクリプションタイプだと、公式の通りcustomにして作っていく形になると思います。
RevenueCatは基本的にはサブスクリプションで使われることを想定しているので、購入の管理まではできても、消費状態の管理はできないので、その辺はアプリ側で実装していく形になりますね。

ちなみにもう検討済みであればすみませんが、アプリ内通貨を実現するには資金決済法に準拠する必要があるのでご注意ください。
https://topcourt-law.com/finance/fund_settlement_app_charges

たも@Flutterくんたも@Flutterくん

おそらくアプリ内通貨の未使用金額が1,000万円を越すことはないと思うので、
アプリ内通貨の有効期限は無しで行うつもりです。

もしそこまで行ったらすぐに手続きを行います☺️

たも@Flutterくんたも@Flutterくん

正常に購入できたかの確認ってどうされてますか?
ポイントの付与ミスとかを避けたいのですが、revenuecat上の機能にはそれがないっぽいです。

ベストプラクティスがあれば知りたいです☺️

僕は、購入したアプリ内通貨(魔法石)を100として、

もし ( 付与後の魔法石数 - 付与前の魔法石数 == 購入した魔法石数 ) なら、
正しい処理だったと判定しようかと思っております。

例えば、[1,100(付与後) - 1,000(付与前) == 100]なら、正常に付与できてきたことになると思います。

このようなアプリ内通貨の処理を書いたことがないので良いかどうかはわからないので、
ご意見をいただけると嬉しいです。

ちなみにサーバーはfirebaseを使っており、cloud functionsなどを使うことは可能です。

HALHAL

自分が実装するなら以下2つのいずれかですね

  • (公式ドキュメントにあるように)購入完了時に呼び出されるWebhookをfunctionsで受けてアプリ内通貨を増減する(キャンセルを考慮する必要があります)
  • スマホアプリ側で購入完了時のイベントで通過を増減、また、随時でRevenueCatの購入履歴を取得し、そこからこれまでの通貨総計を算出、更にアプリ内の使用済み通貨数から現在通貨数を算出する

firestoreとfunctionsを使ってサーバー側でやると、何か合ったときに調査しやすいメリットがあります。
アプリ側だとサーバーが要らないので楽ですが、データの状態が見れないので何か合ったときにツラいってところはありますね。

たも@Flutterくんたも@Flutterくん

https://zenn.dev/hal1986/books/react-native-monetize/viewer/6_revenuecat_initial_setup#play-store-の設定

Play Store の設定

この部分ですが、Googleのサービスアカウントの作成ってアプリ毎に作られてますか?

HALHAL

自分はサービスアカウントは使いまわしてますね〜。
RevenueCat専用に作ったサービスアカウントなら、基本は使い回しで特に問題ないと思います。

masd_jpmasd_jp

後の読者のために自分が詰まったところを共有しておきます.

  1. 「React Native Google Mobile Ads で確認ダイアログを表示する」の節でAdsConsentDebugGeographyがnot definedになる.

単純にコピペだとimportが足りてなかったです.

#before
import { AdsConsent } from 'react-native-google-mobile-ads';
#after
import { AdsConsent, AdsConsentDebugGeography, AdsConsentStatus } from "react-native-google-mobile-ads";
  1. 「React Native Google Mobile Ads で確認ダイアログを表示する」の節で,testDeviceIdentifiers: をそのままコピペで["TEST-DEVICE-HASHED-ID"]にしてしまっていた.

自分は実機でテストしていたのですが,TEST-DEVICE-HASHED-IDはその機器のハッシュIDを設定する必要がありそうです.公式ドキュメントのeuropean-user-consent#testingに詳細が記載されています.自分はreact-native-device-infoのgetUniqueId()を使用してハッシュ値を取得し,配列に記載しました.

  1. 「React Native Google Mobile Ads で確認ダイアログを表示する」の節で,AdsConsent.requestInfoUpdateで同意の確認が不要判定になってしまう

初回実装時に,isConsentFormAvailableがfalse, statusがOBTAINEDになっていました.
原因が分からず,数時間手順の間違いを探したのですが,原因が分かりませんでした.
その日の夜中,Google AdMobから「お客様のアカウントが承認されました。」というメールが来たので再度確認すると意図した通りの判定になりました.
ですので,恐らくですがGoogle AdMobの審査が通るまではこちらは正常に動作しません.

HALHAL

ご指摘ありがとうございます!
それぞれ修正して反映しました。
(1,2はChapter.2、3はChapter.1に反映)

また何かあれば教えていただけると嬉しいです!