iOS SDKでのアプリ内購入

モバイルアプリ内でペイウォールを表示することは、ユーザーにプレミアムコンテンツやサービスへのアクセスを提供するうえで欠かせないステップです。ただし、ペイウォールビルダーを使ってペイウォールをカスタマイズしている場合に限り、ペイウォールを表示するだけで購入をサポートできます。

ペイウォールビルダーを使用しない場合は、購入を完了してコンテンツをアンロックするために、.makePurchase() という別のメソッドを使用する必要があります。このメソッドは、ユーザーがペイウォールを通じて購入手続きを進めるための入口となります。

ペイウォールに購入しようとしているプロダクトへのアクティブなプロモーションオファーがある場合、Adapty は購入時に自動的にそれを適用します。

Warning

初回オファーが自動的に適用されるのは、ペイウォールビルダーを使用して設定されたペイウォールを使用している場合のみであることに注意してください。

それ以外の場合は、iOS での初回オファーの利用資格を確認する必要があります。この手順を省略すると、リリース時にアプリが審査で却下される可能性があります。また、初回オファーの対象ユーザーに通常価格が請求される可能性もあります。

一つのステップも省略せずに初期設定を完了していることを確認してください。設定が完了していないと、購入の検証ができません。

購入を行う

Note

ペイウォールビルダーを使用していますか? 購入は自動的に処理されます。このステップはスキップできます。

ステップバイステップのガイドが必要ですか? 完全なコンテキストとエンドツーエンドの実装手順については、クイックスタートガイドをご覧ください。

リクエストパラメーター:

パラメーター必須説明
Product必須ペイウォールから取得した AdaptyPaywallProduct オブジェクト。

レスポンスパラメーター:

パラメーター説明
Profile

リクエストが成功した場合、レスポンスにはこのオブジェクトが含まれます。AdaptyProfile オブジェクトは、アプリ内でのユーザーのアクセスレベル、サブスクリプション、非サブスクリプション購入に関する包括的な情報を提供します。

ユーザーがアプリへの必要なアクセス権を持っているかどうかを確認するために、アクセスレベルのステータスをチェックしてください。

Warning

注意: Apple の StoreKit バージョンが v2.0 未満、かつ Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに Apple App Store 共有シークレットを提供する必要があります。このメソッドは現在 Apple によって非推奨とされています。

App Storeからのアプリ内課金

ユーザーがApp Storeで購入を開始し、そのトランザクションがアプリに引き継がれると、SDKはAdaptyPromotedProductオブジェクトを引数としてdidReceivePromotedPurchaseデリゲートメソッドを呼び出します。この場合、2つの選択肢があります。

  • トランザクションをすぐに処理する: didReceivePromotedPurchase を実装しない。デフォルトの実装ではすぐに購入が開始され、Apple の購入システム画面が自動的に表示される。
  • プロダクトオブジェクトを後で処理するために保存する: didReceivePromotedPurchase を実装し、プロダクトを保存しておき、後から保存したプロダクトを使って makePurchase を呼び出す。購入をトリガーする前にユーザーにカスタムの画面を表示したい場合に便利。

プロモーション対象のプロダクトにサブスクリプションオファーが付いている場合、SDKは購入時に自動的に適用します。オファーはApp Storeの購入インテントから読み取られ、iOS 18.0以降で利用可能です。iOS 16.4〜17.xでは、subscriptionOfferは常にnilとなり、通常価格で購入が進みます。

完全なスニペットはこちらです:

final class YourAdaptyDelegateImplementation: AdaptyDelegate {
    // 1. Store the product object to defer the transaction.
    // To process the transaction immediately instead, don't implement this method —
    // the default implementation starts the purchase right away.
    nonisolated func didReceivePromotedPurchase(_ product: AdaptyPromotedProduct) {
        // store the product object
    }

    // 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate
    func continueDeferredPurchase() async {
        let storedProduct: AdaptyPromotedProduct = // get the product object from 1.
        do {
            let purchaseResult = try await Adapty.makePurchase(product: storedProduct)
            // process the purchase result
        } catch {
            // handle the error
        }
    }
}
Warning

didReceivePromotedPurchase APIはSDKバージョン4.1以降で利用可能で、iOS 16.4以降が必要です。SDKバージョン4.0はプロモートされたアプリ内課金をまったくサポートしておらず、iOS 16.4未満のデバイスではこのメソッドは呼び出されません。それより古いiOSバージョンでプロモート購入が必要な場合は、SDK 3.xを使用し、以下に示すshouldAddStorePaymentを引き続きご利用ください。

Adapty SDK 3.xをご利用の場合

SDK 3.xでは、SDKは代わりにshouldAddStorePaymentデリゲートメソッドを呼び出します:

  • 即座にトランザクションを処理する: shouldAddStorePaymenttrue を返します。これにより、Appleの購入システム画面がすぐに表示されます。
  • 後で処理するためにプロダクトオブジェクトを保存する: shouldAddStorePaymentfalse を返し、後で保存したプロダクトを使って makePurchase を呼び出します。
final class YourAdaptyDelegateImplementation: AdaptyDelegate {
    nonisolated func shouldAddStorePayment(for product: AdaptyDeferredProduct) -> Bool {
        // 1a.
        // Return `true` to continue the transaction in your app. The Apple purchase system screen will show automatically.

        // 1b.
        // Store the product object and return `false` to defer or cancel the transaction.
        false
    }
    
    // 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate
    func continueDeferredPurchase() async {
        let storedProduct: AdaptyDeferredProduct = // get the product object from 1b.
        do {
            try await Adapty.makePurchase(product: storedProduct)
        } catch {
            // handle the error
        }
    }
}

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 フィルターを使って、オファーコードのトランザクションをフィルタリングして確認できます。

従来のプロモコード(廃止済み)

Warning

Appleは2026年3月にアプリ内課金のプロモコードを廃止しました。オファーコードはより多くの機能を備えた代替手段です:対象者の設定、有効期限の指定、1四半期あたり最大100万コードの発行が可能です。アプリ内課金にプロモコードを使用していた場合は、App Store Connectでオファーコードに移行してください。

従来のプロモコード(アプリのバージョンごとに最大100枚)はサブスクリプションへの無料アクセスを付与するものでした。オファーコードとは異なり、Appleはプロモコードのトランザクションに割引情報を含めず、レシートには定価が送信されていました。そのため、Adaptyはこれらのトランザクションを定価で記録しており、Adaptyアナリティクスとインターネット Store Connectの間で収益の差異が生じていました。

定価で記録されているが本来は無料であるべき過去のトランザクションが見つかった場合、それらは従来のプロモコードによるものと考えられます。これらのコードは廃止されたため、正確な収益トラッキングのためにオファーコードに移行してください。

アプリ内でコード引き換えシートを表示するには:

Adapty.presentCodeRedemptionSheet()
Danger

確認された問題として、一部のアプリでオファーコード引き換えシートが正常に動作しない場合があります。ユーザーを直接 App Store にリダイレクトすることをお勧めします。

そのためには、以下の形式の URL を開く必要があります: https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}