React Native SDKでモバイルアプリ内の購入を行う
モバイルアプリ内でペイウォールを表示することは、ユーザーにプレミアムコンテンツやサービスへのアクセスを提供するための重要なステップです。ただし、Adapty が画面をレンダリングする場合、つまりフローまたは旧ペイウォールビルダーのペイウォールを使用する場合に限り、ペイウォールの表示だけで購入が完結します。
独自のコードで画面をレンダリングする場合は、購入を完了してコンテンツをアンロックするために、.makePurchase() という別のメソッドを使用する必要があります。このメソッドは、ユーザーがペイウォールを通じて希望するトランザクションを実行するための入り口となります。
ペイウォールに、ユーザーが購入しようとしているプロダクトに対してアクティブなプロモーションオファーがある場合、Adapty は購入時に自動的にそのオファーを適用します。
初回オファーが自動的に適用されるのは、Adapty が画面をレンダリングする場合のみである点に注意してください。
それ以外の場合は、iOSで初回オファーの利用資格をユーザーが持っているか確認する必要があります。このステップをスキップすると、リリース時にアプリが審査で却下される可能性があります。また、初回オファーの対象ユーザーに通常価格が請求されてしまう恐れもあります。
すべてのステップを漏れなく完了した上で初期設定を終えていることを確認してください。設定が完了していないと、購入の検証ができません。
購入を実行する
Adaptyがスクリーンをレンダリングしていますか? フローまたはペイウォールビルダーのペイウォールの場合、購入は自動的に処理されます。このステップはスキップできます。
ステップバイステップのガイドをお探しですか? クイックスタートガイドで、完全なコンテキストとともにエンドツーエンドの実装手順を確認してください。
try {
const purchaseResult = await adapty.makePurchase(product);
switch (purchaseResult.type) {
case 'success':
const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
if (isSubscribed) {
// Grant access to the paid features
}
break;
case 'user_cancelled':
// Handle the case where the user canceled the purchase
break;
case 'pending':
// Handle deferred purchases (e.g., the user will pay offline with cash)
break;
}
} catch (error) {
// Handle the error
}
リクエストパラメーター:
| パラメーター | 必須 | 説明 |
|---|---|---|
| Product | 必須 | ペイウォールから取得した AdaptyPaywallProduct オブジェクト。 |
レスポンスパラメーター:
| パラメーター | 説明 |
|---|---|
| Profile | リクエストが成功した場合、このオブジェクトがレスポンスに含まれます。AdaptyProfile オブジェクトは、アプリ内のユーザーのアクセスレベル、サブスクリプション、および買い切り購入に関する包括的な情報を提供します。 アクセスレベルのステータスを確認して、ユーザーがアプリへの必要なアクセス権を持っているかどうかを判断してください。 |
注意: Apple の StoreKit バージョンが v2.0 未満、かつ Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに Apple App Store の共有シークレットを提供する必要があります。この方法は現在 Apple によって非推奨とされています。
購入時にサブスクリプションを変更する
ユーザーが現在のサブスクリプションを更新する代わりに新しいサブスクリプションを選択した場合、その動作はアプリストアによって異なります。
- App Store の場合、サブスクリプションはサブスクリプショングループ内で自動的に更新されます。ユーザーがあるグループのサブスクリプションを購入した時点で別のグループのサブスクリプションをすでに持っている場合、両方のサブスクリプションが同時にアクティブになります。
- Google Play の場合、サブスクリプションは自動的に更新されません。以下に説明するように、アプリのコード内で切り替えを管理する必要があります。
Androidでサブスクリプションを別のものに切り替えるには、追加パラメータを指定して .makePurchase() メソッドを呼び出します。
try {
const purchaseResult = await adapty.makePurchase(product, params);
switch (purchaseResult.type) {
case 'success':
const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
if (isSubscribed) {
// 有料機能へのアクセスを付与する
}
break;
case 'user_cancelled':
// ユーザーが購入をキャンセルした場合の処理
break;
case 'pending':
// 延期購入を処理する(例:ユーザーが後で現金で支払う場合)
break;
}
} catch (error) {
// エラーを処理する
}
追加のリクエストパラメーター:
| パラメーター | 必須/任意 | 説明 |
|---|---|---|
| params | required | MakePurchaseParamsInput 型のオブジェクト。 |
バージョン 3.8.2 以降: MakePurchaseParamsInput の構造が更新されました。oldSubVendorProductId と prorationMode は subscriptionUpdateParams の下にネストされるようになり、isOfferPersonalized は上位レベルに移動しました。
makePurchase(product, {
android: {
subscriptionUpdateParams: {
oldSubVendorProductId: 'old_product_id',
prorationMode: 'charge_prorated_price'
},
isOfferPersonalized: true
}
});
:::
サブスクリプションと置き換えモードの詳細については、Google デベロッパー ドキュメントをご覧ください:
- 交換モードについて
- 交換モードに関するGoogleの推奨事項
- 交換モード
CHARGE_PRORATED_PRICE。注意: この方法はサブスクリプションのアップグレードにのみ使用できます。ダウングレードはサポートされていません。 - 交換モード
DEFERRED。注意: 実際のサブスクリプション変更は、現在のサブスクリプション請求期間が終了したときにのみ行われます。
iOSでオファーコードを利用する
オファーコードについて
オファーコードを使うと、特定のユーザーに割引や無料トライアルを提供できます。自動適用される通常のオファーとは異なり、オファーコードはメールキャンペーン、SNS、印刷物などアプリの外で配布されます。ユーザーはApp Storeでコードを入力するか、引き換えURLにアクセスするか、アプリ内ダイアログを通じて利用できます。
オファーコードを設定するには、App Store ConnectでサブスクリプションをのページにあるOpening a subscription, Offer Codes セクションを開きます。オファーコードには3種類あります:
- Free — 一定期間サブスクリプションが無料になり、次の更新から通常料金が適用されます。
- Pay as you go — 一定期間、各請求サイクルごとに割引価格で支払い、その後は通常料金で更新されます。
- Pay up front — オファー期間全体に対して割引価格を一括で支払い、その後は通常料金で更新されます。
オファーコードをAdaptyに追加する必要はありません。Appleはオファー期間中のすべてのトランザクションにオファーコードカテゴリのタグを付けます。これには最初の引き換えとその後の割引更新がすべて含まれます。Adaptyはそのタグを検出し、各トランザクションをオファーカテゴリ offer_code として記録します。オファー期間が終了してサブスクリプションが通常料金で更新されると、タグは付かなくなります。Adapty ダッシュボードの Offer Code オファータイプでアナリティクスをフィルタリングできます。
収益の差異のトラブルシューティング
オファーコードのトランザクションが割引後の価格ではなく定価でAdaptyに記録されている場合は、App Store Connectで以下を確認してください:
- ユーザーが引き換え可能なすべての地域に対して、オファーコードに正しい価格が設定されているか。
- ユーザーの特定の国や地域に対してオファー価格が設定されているか。Appleはトランザクションに地域ごとの価格を含めて送信します。オファーに地域価格が設定されていない場合、Appleは定価を送信することがあります。
Adapty ダッシュボードで Offer Code オファータイプと Offer Discount Type フィルターを使って、オファーコードのトランザクションをフィルタリングして確認できます。
従来のプロモコード(廃止済み)
Appleは2026年3月にアプリ内課金のプロモコードを廃止しました。オファーコードはより多くの機能を備えた代替手段です:対象者の設定、有効期限の指定、1四半期あたり最大100万コードの発行が可能です。アプリ内課金にプロモコードを使用していた場合は、App Store Connectでオファーコードに移行してください。
従来のプロモコード(アプリのバージョンごとに最大100枚)はサブスクリプションへの無料アクセスを付与するものでした。オファーコードとは異なり、Appleはプロモコードのトランザクションに割引情報を含めず、レシートには定価が送信されていました。そのため、Adaptyはこれらのトランザクションを定価で記録しており、Adaptyアナリティクスとインターネット Store Connectの間で収益の差異が生じていました。
定価で記録されているが本来は無料であるべき過去のトランザクションが見つかった場合、それらは従来のプロモコードによるものと考えられます。これらのコードは廃止されたため、正確な収益トラッキングのためにオファーコードに移行してください。
アプリ内にコード利用シートを表示するには:
adapty.presentCodeRedemptionSheet();
弊社の観測によると、一部のアプリではオファーコード利用シートが正常に動作しない場合があります。ユーザーを App Store に直接リダイレクトすることをお勧めします。
そのためには、以下の形式のURLを開く必要があります:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}
App Storeからのプロモートされたアプリ内課金
アプリは SDK バージョン 4.1 以降、iOS 16.4 以降でプロモートされたアプリ内課金を引き受けることができます。iOS 16.4 未満および Android では、'onPromotedPurchaseReceived' イベントは発火しません。
ユーザーが App Store のプロダクトページから購入を開始し、そのトランザクションがアプリに引き継がれると、SDK は自動的に処理を完了します — Apple の購入システム画面がすぐに表示され、Adapty は他の購入と同様にトランザクションを処理します。この動作にはコードの変更は不要です。
プロモーションされたプロダクトにサブスクリプションオファーが含まれている場合、SDKは購入時に自動的にそのオファーを適用します。オファーはApp Storeの購入インテントから読み取られ、iOS 18.0以降で利用可能です。iOS 16.4〜17.xでは、通常価格で購入が処理されます。
完了処理を自分で制御したい場合(たとえば、先に独自の画面を表示したい場合など)、'onPromotedPurchaseReceived'イベントをリッスンし、プロダクトをmakePromotedPurchaseに渡してください:
adapty.addEventListener('onPromotedPurchaseReceived', async product => {
const result = await adapty.makePromotedPurchase(product);
// process the purchase result
});
リスナーが登録されている間、SDK はプロモーション購入の完了を自動的に行いません。ハンドラーが makePromotedPurchase を呼び出さない場合、購入は完了しません。App Store はプロダクトをアプリに渡して待機し続けます。
makePromotedPurchase は購入パラメータを受け取りません。プロモーションされたプロダクトはペイウォールではなく App Store から来るため、ペイウォールのコンテキストを持ちません。makePurchase と同じ AdaptyPurchaseResult を返します。
リスナーは加算式で機能します。複数登録した場合、それぞれのリスナーがプロダクトを受け取りますが、あるリスナーが別のリスナーの代わりに購入を完了させることはありません。
プリペイドプランの管理(Android)
アプリのユーザーがプリペイドプラン(例:数ヶ月分の非更新型サブスクリプションを購入)を利用できる場合、プリペイドプランの保留中のトランザクションを有効にすることができます。
adapty.activate("PUBLIC_SDK_KEY", {
android: { pendingPrepaidPlansEnabled: true }
});