Flutter SDKでモバイルアプリのアプリ内課金を行う
モバイルアプリ内でペイウォールを表示することは、ユーザーにプレミアムコンテンツやサービスへのアクセスを提供するうえで欠かせないステップです。ただし、ペイウォールビルダーを使ってペイウォールをカスタマイズしている場合に限り、ペイウォールを表示するだけで購入をサポートできます。
ペイウォールビルダーを使用しない場合は、購入を完了してコンテンツのロックを解除するために、.makePurchase() という別のメソッドを呼び出す必要があります。このメソッドは、ユーザーがペイウォールを通じて希望するトランザクションを進めるための入り口となります。
ペイウォールに購入しようとしているプロダクトのアクティブなプロモーションオファーがある場合、Adapty は購入時に自動的にそれを適用します。
初回オファーが自動的に適用されるのは、ペイウォールビルダーを使用して設定されたペイウォールを使用している場合のみです。
他のケースでは、iOS で初回オファーの利用資格を確認する必要があります。このステップをスキップすると、リリース時にアプリが審査で却下される可能性があります。さらに、初回オファーの対象ユーザーに通常価格が請求されてしまう恐れがあります。
初期設定をひとつも手順をスキップせずに完了していることを確認してください。初期設定が済んでいないと、購入を検証できません。
購入を行う
ペイウォールビルダーを使用していますか? 購入は自動的に処理されるため、この手順はスキップできます。
ステップバイステップのガイドをお探しですか? フルコンテキストでのエンドツーエンドの実装手順については、クイックスタートガイドをご確認ください。
try {
final purchaseResult = await Adapty().makePurchase(product: product);
switch (purchaseResult) {
case AdaptyPurchaseResultSuccess(profile: final profile):
if (profile.accessLevels['premium']?.isActive ?? false) {
// Grant access to the paid features
}
break;
case AdaptyPurchaseResultPending():
break;
case AdaptyPurchaseResultUserCancelled():
break;
default:
break;
}
} on AdaptyError catch (adaptyError) {
// Handle the error
} catch (e) {
// 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 {
final subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters(
'OLD_PRODUCT_ID',
AdaptyAndroidSubscriptionUpdateReplacementMode.immediateWithTimeProration,
);
final result = await Adapty().makePurchase(
product: product,
parameters: AdaptyPurchaseParameters(
subscriptionUpdateParams: subscriptionUpdateParams,
),
);
// successful cross-grade
} on AdaptyError catch (adaptyError) {
// Handle the error
} catch (e) {
// Handle the error
}
追加のリクエストパラメーター:
| パラメーター | 必須/任意 | 説明 |
|---|---|---|
| parameters | required | subscriptionUpdateParams フィールドに AdaptyAndroidSubscriptionUpdateParameters オブジェクトを設定した AdaptyPurchaseParameters オブジェクト。 |
| 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の間で収益の差異が生じていました。
定価で記録されているが本来は無料であるべき過去のトランザクションが見つかった場合、それらは従来のプロモコードによるものと考えられます。これらのコードは廃止されたため、正確な収益トラッキングのためにオファーコードに移行してください。
アプリ内でコード引き換えシートを表示するには:
try {
await Adapty().presentCodeRedemptionSheet();
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
弊社の観測によると、一部のアプリではオファーコード引き換えシートが正常に動作しない場合があります。ユーザーを直接 App Store にリダイレクトすることをおすすめします。
これを行うには、次の形式のURLを開く必要があります:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}
プリペイドプランの管理(Android)
アプリのユーザーがプリペイドプラン(例:数ヶ月分の非更新型サブスクリプションを一括購入)を利用できる場合、プリペイドプランの保留中のトランザクションを有効にすることができます。
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
..withGoogleEnablePendingPrepaidPlans(true),
);