iOS SDKにおける高度なトランザクション管理

高度なトランザクション管理は、Adapty iOS SDK バージョン3.12以降でサポートされています。

Adaptyの高度なトランザクション管理を使用すると、トランザクションの処理、検証、完了をより細かく制御できます。

高度なトランザクション管理には、連携して動作する3つのオプション機能が含まれています。

機能目的
appAccountTokenAppleのトランザクションを内部ユーザーIDに紐付ける
jwsTransactionバリデーション用にAppleの署名済みトランザクションペイロードを提供する
手動完了バックエンドが成功を確認した後にのみトランザクションを完了できる

これらのツールを組み合わせることで、AdaptyがバックエンドとのトランザクションSync機能を維持しながら、堅牢なカスタムバリデーションフローを構築できます。

ほとんどのアプリにはこの機能は不要です。 デフォルトでは、AdaptyはStoreKitトランザクションを自動的に検証・完了します。 このガイドは、独自のバックエンドバリデーションを実行する場合や、購入ライフサイクルを完全に制御したい場合にのみ使用してください。

appAccountTokenを設定する

appAccountTokenは、App Storeのトランザクションを内部ユーザーIDに紐付けるためのUUIDです。 StoreKitはこのトークンをすべてのトランザクションに関連付けるため、バックエンドでApp Storeのデータとユーザーを照合できます。

ユーザーごとに生成した安定したUUIDを使用し、デバイスをまたいで同じアカウントに対して再利用してください。 これにより、購入とApp Storeの通知が正しく紐付けられます。

トークンは2つの方法で設定できます。SDK初期化時またはユーザーを識別するときです。

appAccountTokenは必ずcustomerUserIdと一緒に渡す必要があります。 トークンのみを渡した場合、トランザクションに含まれません。

JWS表現にアクセスする

購入を行うと、結果にはAppleのトランザクションがJWSコンパクトシリアライゼーション形式で含まれます。 この値をバックエンドに転送して、独自のバリデーションやログ記録に活用できます。

let result = try await Adapty.makePurchase(product: paywallProduct)
let jwsRepresentation = result.jwsTransaction

トランザクション完了の動作を制御する

transaction-management.png

デフォルトでは、AdaptyはバリデーションAfterにStoreKitトランザクションを自動的に完了します。 バックエンドが成功を確認するまで完了を遅らせたい場合は、完了動作を手動に設定してください。

このモードでは:

  • Adaptyは引き続き購入を検証し、バックエンドとSyncします。
  • finish()を明示的に呼び出すまで、トランザクションは未完了のままです。
var configBuilder = AdaptyConfiguration
    .builder(withAPIKey: "YOUR_API_KEY")
    .with(transactionFinishBehavior: .manual)

try await Adapty.activate(with: configBuilder.build())   

手動トランザクション完了を使用する場合、未完了のトランザクションを処理するためにonUnfinishedTransactionデリゲートメソッドを実装する必要があります。

extension YourApp: AdaptyDelegate {
    func onUnfinishedTransaction(_ transaction: AdaptyUnfinishedTransaction) async {
        // Perform your custom validation logic here
        
        // When ready, finish the transaction
        await transaction.finish()
    }
}

現在の未完了トランザクションをすべて取得するには、getUnfinishedTransactions()メソッドを使用してください。

let unfinishedTransactions = try await Adapty.getUnfinishedTransactions()