iOS SDK
DEUNA iOS SDKをインストールし、モーダル、埋め込み、ウォレット、バウチャー、および次アクションのフローを統合します。
このページで
要件#
DEUNA iOS SDK統合の要件を確認してください:
- Swiftバージョン: 5.8以上
- Xcodeバージョン: 16.0以上
- デプロイメントターゲット: コアモーダルエクスペリエンスはiOS 13.0以上、埋め込みSwiftUIはiOS 14.0以上
DeunaWidget - DEUNA認証情報: アクティブなアカウントと有効な認証情報(認証情報の取得に遅延が発生する場合は support@deuna.com に連絡)
インストール#
DEUNA iOS SDKをインストールする方法は2つあります:
Swift Package Manager(推奨)
- Xcodeで、次の場所に移動します: ファイル → パッケージ依存関係を追加...
- 検索バーにリポジトリURLを入力します:
Plain text
https://github.com/deuna-developers/deuna-sdk-ios - パッケージ依存関係ルールをバージョンに固定します
2.12.6(またはそれ以上)。 - この場合、 パッケージ製品を選択 ダイアログが表示されます:
- 選択
DeunaSDKアプリケーションターゲットにリンクします。 - 他のすべての製品(
DeunaSDKCybersource,DeunaSDKKount,DeunaSDKRiskified,DeunaSDKSift,DeunaSDKSignifyd,DeunaSDKMercadoPago,DeunaSDKAccertify)を なし に設定します。ただし、その特定の不正防止プロバイダーを統合で使用する場合は除きます。
- 選択
CocoaPods
iOSプロジェクトでCocoaPodsを使用する場合:
- 最小デプロイメントターゲットを指定し、
DeunaSDKあなたへのPodfile:
platform :ios, '14.0'
target 'YourApp' do
use_frameworks!
pod 'DeunaSDK', '~> 2.12.6'
# Add ONLY the optional fraud provider subspecs you need:
# pod 'DeunaSDK/MercadoPago'
# pod 'DeunaSDK/Riskified'
# pod 'DeunaSDK/Cybersource'
# pod 'DeunaSDK/Signifyd'
# pod 'DeunaSDK/Kount'
# pod 'DeunaSDK/Sift'
# pod 'DeunaSDK/Accertify'
end- 実行:
pod install- ユーザースクリプトのサンドボックス化を無効にする:Xcodeで、ターゲットの ビルド設定に移動し、
User Script Sandboxing(ENABLE_USER_SCRIPT_SANDBOXINGを検索して、 なし.
バウチャー/領収書ダウンロードに必要な権限
初期化#
import DeunaSDKアプリのアーキテクチャに応じて、SDKを2つの方法で初期化できます:
グローバル共有インスタンス
に追加してください。 AppDelegate または App 初期化子など)で一度だけ初期化し、その後は DeunaSDK.shared:
DeunaSDK.initialize(
environment: .sandbox, // .sandbox or .production
publicApiKey: "YOUR_PUBLIC_API_KEY"
)
let deunaSDK = DeunaSDK.sharedコーディネーターまたは画面インスタンス経由でどこからでもアクセスできます。
特定の画面またはコーディネーター用のインスタンスを作成して保持する:
let deunaSDK = DeunaSDK(
environment: .sandbox,
publicApiKey: "YOUR_PUBLIC_API_KEY"
)Payment Widget の起動#
Payment Widgetは、顧客に複数の支払い方法を提供します:
- クレジットカードおよびデビットカード:Visa、Mastercard、American Express、およびコブランドカード。
- 代替支払い方法(APM):OXXO、KueskiPay、Aplazo、Daviplata、Nequiなど。
- デジタルウォレット:Apple Pay および PayPal。
モーダルで表示
コール initPaymentWidget あなたの DeunaSDK インスタンス上で:
deunaSDK.initPaymentWidget(
orderToken: "YOUR_ORDER_TOKEN",
callbacks: PaymentWidgetCallbacks(
onSuccess: { order in
deunaSDK.close() // Close the payment widget modal
// YOUR CODE HERE: Handle successful payment (e.g. navigate to confirmation screen)
},
onError: { error in
// Error handling
if error.type == .initializationFailed {
deunaSDK.close() // Close the widget if initialization fails
// YOUR CODE HERE: Handle initialization failure (e.g. show alert or fallback)
return
}
if error.type == .paymentError {
// YOUR CODE HERE: Handle payment processing failure (e.g. prompt user to retry)
}
},
onClosed: { action in
// Widget closed
// action == .userAction (dismissed manually by customer) or .systemAction (closed via code)
// YOUR CODE HERE: Handle modal dismissal
},
onCardBinDetected: { metadata in
guard metadata != nil else { return }
// YOUR CODE HERE: Handle card brand or BIN detection (e.g. apply discounts)
},
onInstallmentSelected: { installment in
// YOUR CODE HERE: Handle installment plan selection
},
onPaymentProcessing: {
// YOUR CODE HERE: Payment processing started (e.g. disable external buttons)
},
onEventDispatch: { event, payload in
// YOUR CODE HERE: Track analytics event
}
),
userToken: "YOUR_USER_TOKEN", // optional
styleFile: "YOUR_STYLE_FILE_UUID", // optional
language: "en" // optional: "es", "en", "pt"
)パラメータリファレンス
| パラメータ | Type | モーダル | 埋め込み | 説明 |
|---|---|---|---|---|
orderToken | String | ✅ | ✅ | 必須。DEUNA APIで作成された注文の一意トークン。 重要: アプリ内で redirect_url を実行させたい場合は、注文作成時に onSuccess を定義しないでください。 |
callbacks | PaymentWidgetCallbacks | ✅ | ✅ | 必須。ウィジェットイベントを監視するコールバック (onSuccess, onError, onClosed, onCardBinDetected, onInstallmentSelected, onPaymentProcessing, onEventDispatch). |
userToken | String? | ✅ | ✅ | 任意。顧客のDEUNAベアラートークン。 重要:保存済みカードを表示するには、注文作成時に渡された userToken は注文作成時の billing_address.email と一致する必要があります。 |
styleFile | String? | ✅ | ✅ | 任意。カスタムテーマブランディング(色、タイポグラフィ、ロゴ)を適用するためのDEUNA提供のUUID。 |
paymentMethods | [[String: Any]]? | ✅ | ✅ | 任意。ダイレクトフォームフロー用の単一の支払い方法を定義する配列(例: [["paymentMethod": "bnpl", "processors": ["kueski"]]]). |
language | String? | ✅ | ✅ | 任意。言語コード("es", "en", "pt")。加盟店のデフォルト設定を上書きします。 |
behavior | WidgetBehavior? | ✅ | ✅ | 任意。フローカスタマイズ(例: WidgetBehavior(paymentMethods: ["flowType": "twoStep"]) PayPal用、またはSplit Payments WidgetBehavior(paymentMethods: ["creditCard": ["splitPayments": ["maxCards": 2]]]). |
fraudCredentials | [String: Any]? | ✅ | ✅ | 任意。不正防止プロバイダー認証情報(例: ["RISKIFIED": ["storeDomain": "yourdomain.com"]]). |
domain | String? | ✅ | ✅ | 任意。デフォルトのベースホスト(https://pay.deuna.io). |
hidePayButton | Bool | ❌ | ✅ | 任意. 埋め込みモードで、アプリケーションがネイティブボタンをレンダリングする場合、組み込みの支払いボタンを非表示にします。 |
利用可能な機能#
| 体験 | メソッド | 設定タイプ | 重要な入力 |
|---|---|---|---|
| 支払いウィジェット | initPaymentWidget(...) | PaymentWidgetConfiguration | orderToken, PaymentWidgetCallbacks |
| 支払いVault | initElements(...) | ElementsWidgetConfiguration | ElementsCallbacks; types 省略可能 |
| クリック・トゥ・ペイ | initElements(...) | ElementsWidgetConfiguration | types: [["name": ElementsWidget.clickToPay]] |
| 次のアクション | initNextAction(...) | NextActionWidgetConfiguration | 別のアクションを必要とする注文のトークン |
| バウチャー | initVoucher(...) | VoucherWidgetConfiguration | バウチャー注文用のトークン |
SwiftUIを使用してウィジェットを埋め込みます。#
iOS 14 以降では、 DeunaWidget を使用して、支払いエクスペリエンスを SwiftUI 階層内に埋め込んでレンダリングします。
import DeunaSDK
import SwiftUI
struct EmbeddedCheckoutScreen: View {
let deunaSDK: DeunaSDK
let orderToken: String
var body: some View {
VStack {
DeunaWidget(
deunaSDK: deunaSDK,
configuration: PaymentWidgetConfiguration(
orderToken: orderToken,
callbacks: PaymentWidgetCallbacks(
onSuccess: { order in
// Explicitly release widget resources to prevent memory leaks
deunaSDK.dispose()
// YOUR CODE HERE: Handle successful payment
},
onError: { error in
if error.type == .paymentError {
// YOUR CODE HERE: Handle payment error
}
},
onEventDispatch: { event, payload in
// YOUR CODE HERE: Track analytics event
}
),
userToken: nil,
styleFile: nil
)
)
}
}
}自動リサイズとキーボード処理を備えた埋め込み
デフォルトでは、 DeunaWidget は固定高さでコンテナを埋めます。 autoResizeConfig: AutoResizeConfig(initialHeight: 100)を渡すと、ウィジェットは自動リサイズモードに切り替わり、WebViewコンテンツの高さに合わせて動的に拡大・縮小します。
内部に埋め込まれた場合、 ScrollViewを使用します。 ScrollViewFinder 基盤となる UIScrollView をキャプチャして配線する onScrollNeeded フォーカスされたフィールドは自動的にキーボードの上にスクロールします:
import DeunaSDK
import SwiftUI
import UIKit
struct MyCheckoutView: View {
let deunaSDK: DeunaSDK
let widgetConfig: DeunaWidgetConfiguration
@State private var outerScrollView: UIScrollView?
var body: some View {
ScrollView {
VStack(spacing: 0) {
// Invisible helper capturing the underlying UIScrollView
Color.clear.frame(height: 0)
.background(ScrollViewFinder { sv in outerScrollView = sv })
// Your content above the widget
DeunaWidget(deunaSDK: deunaSDK, configuration: widgetConfig)
.onScrollNeeded { overlap in
guard let sv = outerScrollView else { return }
let newOffset = CGPoint(x: 0, y: sv.contentOffset.y + overlap)
UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseOut) {
sv.setContentOffset(newOffset, animated: false)
}
}
// Your content below the widget
}
}
}
}
/// Traverses UIKit view hierarchy to capture the parent UIScrollView
struct ScrollViewFinder: UIViewRepresentable {
let onFound: (UIScrollView) -> Void
func makeUIView(context: Context) -> UIView {
let view = UIView()
view.isHidden = true
DispatchQueue.main.async {
var parent = view.superview
while let p = parent {
if let sv = p as? UIScrollView { onFound(sv); return }
parent = p.superview
}
}
return view
}
func updateUIView(_ uiView: UIView, context: Context) {}
}をComposeのhidePayButton)
アプリケーションがウィジェットの外側に独自のネイティブボタンをレンダリングする場合は、 hidePayButton: true 手動で支払いを実行し、 isValid および submit:
let configuration = PaymentWidgetConfiguration(
orderToken: orderToken,
callbacks: callbacks,
hidePayButton: true
)
// When the user taps your native pay button:
deunaSDK.isValid { isValid in
guard isValid else {
showValidationWarning()
return
}
deunaSDK.submit { result in
if result["status"] as? String == "error" {
print("Submit failed:", result["message"] ?? "")
}
}
}| メソッド | 説明 | 戻り値 |
|---|---|---|
deunaSDK.isValid { valid in ... } | アクティブな支払いフォームのユーザー入力を検証します。 | Bool |
deunaSDK.submit { result in ... } | ウィジェットボタンをクリックするのと同等の支払いを送信します。 | [String: Any] (status: "success" または status: "error") |
支払い方法のフィルタリングと設定#
ダイレクトフォームフロー (paymentMethods)
アプリがウィジェット外に独自のネイティブボタンをレンダリングする場合、 フォームフロー.
を渡し、 paymentMethods は配列型で、現在のチェックアウトエンジンは以下をサポートしています は配列として型付けされていますが、内部のチェックアウトエンジンは現在 DEUNAチェックアウトアーキテクチャは、個別の支払いフォームに直接起動することをサポートしています。これは
deunaSDK.initPaymentWidget(
orderToken: orderToken,
callbacks: callbacks,
paymentMethods: [
[
"paymentMethod": "bnpl",
"processors": ["kueski"]
]
]
)設定の優先順位解決
| 優先度 | ソース | 動作 |
|---|---|---|
| 1 (最高) | paymentMethods を返します .initPaymentWidget() | ダイレクトフォームフロー:指定された単一の支払い方法フォーム(例:Kueski)に直ちに開き、方法セレクターをバイパスします。 |
| 2 | include_payment_options 注文作成時 | 複数方法選択:注文作成時に指定され、かつアカウントで有効な支払い方法のみを表示します。 |
| 3 (フォールバック) | マーチャントレベル設定 (/payment-methods) | フルセレクター:SDK呼び出しと注文ペイロードの両方で省略された場合、マーチャントアカウントに設定されたすべての有効な支払い方法を表示します。 |
PayPal設定
フロータイプ (flowType)
deunaSDK.initPaymentWidget(
orderToken: orderToken,
behavior: WidgetBehavior(
paymentMethods: [
"flowType": "twoStep" // "twoStep" (summary first) or "singleStep" (direct)
]
)
)自動購入 (express)
顧客が以前にPayPalでクイック支払いを承認している場合、即時処理を有効にします:
deunaSDK.initPaymentWidget(
orderToken: orderToken,
callbacks: callbacks,
paymentMethods: [
[
"paymentMethod": "wallet",
"processors": ["paypal_wallet"],
"configuration": ["express": true]
]
]
)動的スタイリングと注文更新#
外観を動的にカスタマイズ (setCustomStyle)
を省略し、注文作成時に
deunaSDK.setCustomStyle(data: [
"theme": [
"colors": [
"primaryTextColor": "#023047",
"buttonPrimaryFill": "#FFB703",
"buttonPrimaryText": "#000000"
]
]
])注文合計を更新 (refetchOrder)
でオプションをフィルタリングするか、DEUNAマーチャントポータルで支払い方法を設定します。 onCardBinDetectedバックエンドで注文を更新し、ウィジェットに通知します:
callbacks: PaymentWidgetCallbacks(
onCardBinDetected: { metadata in
guard let brand = metadata?["cardBrand"] as? String, brand == "Mastercard" else { return }
Task {
await applyDiscountOnBackend(orderId, promoCode: "MASTERCARD_20")
deunaSDK.refetchOrder { updatedOrder in
print("Order refreshed with discount:", updatedOrder)
}
}
}
)Payment Vault と Click to Pay#
Payment Vaultは、カードを安全に保存し、通常のチェックアウトを処理せずにClick to Payで支払いを行うことができるDEUNA Paymentソリューションのコンポーネントです。
モーダルで表示
deunaSDK.initElements(
userToken: "<USER_TOKEN>", // optional if userInfo is provided
userInfo: DeunaSDK.UserInfo(
firstName: "Esteban", // optional if userToken is provided
lastName: "Posada", // optional if userToken is provided
email: "esteban@deuna.com" // required
),
callbacks: ElementsCallbacks(
onSuccess: { response in
deunaSDK.close() // Close the Vault widget
// YOUR CODE HERE: Handle card saved successfully
},
onError: { error in
deunaSDK.close() // Close the Vault widget on error
// YOUR CODE HERE: Handle error
},
onClosed: { action in
// Widget closed: action == .userAction or .systemAction
// YOUR CODE HERE: Handle widget dismissal
},
onEventDispatch: { type, response in
// YOUR CODE HERE: Listen to widget events
}
),
orderToken: "YOUR_ORDER_TOKEN", // optional
widgetExperience: ElementsWidgetExperience( // optional
userExperience: ElementsWidgetExperience.UserExperience(
showSavedCardFlow: true, // optional: show card saving toggle
defaultCardFlow: true // optional: show toggle to save as default
)
)
)埋め込み表示(SwiftUI)
DeunaWidget(
deunaSDK: deunaSDK,
configuration: ElementsWidgetConfiguration(
callbacks: ElementsCallbacks(
onSuccess: { response in
deunaSDK.dispose() // Explicitly release widget resources
// YOUR CODE HERE: Handle success
},
onError: { error in
// YOUR CODE HERE: Handle error
},
onEventDispatch: { type, response in
// YOUR CODE HERE: Listen to widget events
}
),
userInfo: DeunaSDK.UserInfo(
firstName: "Esteban",
lastName: "Posada",
email: "esteban@deuna.com"
),
orderToken: "YOUR_ORDER_TOKEN",
autoResizeConfig: AutoResizeConfig(initialHeight: 150)
)
)クリック・トゥ・ペイ
deunaSDK.initElements(
userInfo: DeunaSDK.UserInfo( // mandatory for Click To Pay
firstName: "Esteban",
lastName: "Posada",
email: "esteban@deuna.com"
),
callbacks: ElementsCallbacks(
onSuccess: { data in
deunaSDK.close() // Close the widget
// YOUR CODE HERE: Handle Click to Pay success
},
onError: { error in
deunaSDK.close() // Close the widget
// YOUR CODE HERE: Handle error
},
onClosed: { action in
// YOUR CODE HERE: Handle widget dismissal
},
onEventDispatch: { type, data in
// YOUR CODE HERE: Listen to widget events
}
),
types: [
[
"name": ElementsWidget.clickToPay // Pass this to render Click to Pay
]
]
)パラメータリファレンス
| パラメータ | Type | モーダル | 埋め込み | 説明 |
|---|---|---|---|---|
callbacks | ElementsCallbacks | ✅ | ✅ | 必須. イベントリスナー (onSuccess, onError, onClosed, onEventDispatch). |
userInfo | DeunaSDK.UserInfo? | ✅ | ✅ | 顧客の firstName, lastName, および email。Click to Payに必須。 |
userToken | String? | ✅ | ✅ | 任意。DEUNAベアラートークン。指定する場合は userInfo. |
types | [[String: Any]]? | ✅ | ✅ | 任意を省略します。デフォルトのCard Vaultエクスペリエンスをレンダリングするには省略します。Click to Payをレンダリングするには [["name": ElementsWidget.clickToPay]] を指定します。 |
orderToken | String? | ✅ | ✅ | 任意。一意の注文トークン。顧客詳細は billing_address. |
styleFile | String? | ✅ | ✅ | 任意から抽出できます。テーマカスタマイズUUID。 |
widgetExperience | ElementsWidgetExperience? | ✅ | ✅ | 任意. showSavedCardFlow (カード保存トグル)と defaultCardFlow (デフォルトとして保存トグル)。 |
domain | String? | ✅ | ✅ | 任意。ホストを上書きします(https://elements.deuna.com). |
hidePayButton | Bool | ❌ | ✅ | 任意。埋め込み時にボタンを非表示にします。カスタムボタンには isValid および submit を使用します。 |
ネイティブ Apple Pay#
Apple Payボタンをレンダリングする前に、マーチャントの設定とデバイスの機能を確認します。
let userInfo = DeunaSDK.UserInfo(email: "ada@example.com")
let params = GetWalletsAvailableParams(
orderToken: "YOUR_ORDER_TOKEN",
userInfo: userInfo
)
deunaSDK.getWalletsAvailable(params: params) { wallets, error in
if let error = error {
// YOUR CODE HERE: Handle wallet availability check error
return
}
// Check if Apple Pay is available on this device and merchant account
let isApplePayAvailable = wallets.contains(.applePay)
// YOUR CODE HERE: Update Apple Pay button visibility in UI
}利用可能な状態が確認できたら、ネイティブのApple Payシートを起動します。 initElements:
deunaSDK.initElements(
userInfo: userInfo,
callbacks: ElementsCallbacks(
onSuccess: { data in
// YOUR CODE HERE: Handle Apple Pay authorization success
},
onError: { error in
// YOUR CODE HERE: Handle Apple Pay error
},
onClosed: { action in
// YOUR CODE HERE: Handle Apple Pay sheet dismissal
}
),
types: [
["name": "APPLE_PAY"]
],
orderToken: "YOUR_ORDER_TOKEN"
)アプリケーションには、Apple Payの権限と、商人の識別子を含むプロビジョニングプロファイルが必要です。詳細は、 Apple Pay の統合について説明します を参照してください。
保留中の操作を続行#
DEUNA が支払いに対してサポートされている 3DS チャレンジまたはリダイレクトが必要であると報告した場合、同じ注文トークンを使用してください。
deunaSDK.initNextAction(
orderToken: "YOUR_ORDER_TOKEN",
callbacks: NextActionCallbacks(
onSuccess: { order in
deunaSDK.close()
// YOUR CODE HERE: Handle 3DS or action completion
},
onError: { error in
deunaSDK.close()
// YOUR CODE HERE: Handle error
},
onClosed: { action in
// YOUR CODE HERE: Handle modal dismissal
}
)
)SDKは、サポートされている外部URLを開き、制御をウィジェットに戻します。インターフェースにはコールバックの状態を使用し、履行には最終的なDEUNA支払い状態を使用します。
クーポンを開く#
deunaSDK.initVoucher(
orderToken: "YOUR_ORDER_TOKEN",
callbacks: VoucherCallbacks(
onSuccess: { order in
// YOUR CODE HERE: Handle voucher display
},
onError: { error in
// YOUR CODE HERE: Handle error
},
onClosed: { action in
// YOUR CODE HERE: Handle modal dismissal
}
)
)バウチャーのコールバックは、他の決済体験と同様に、成功、エラー、クローズ、およびイベント送信のライフサイクルに従います。
不正デバイスデータとフィンガープリンティング#
DEUNA iOS SDKは モジュラーアーキテクチャを採用しています: デフォルトではサードパーティの不正防止SDKをバンドルしません。 使用する特定のプロバイダーのみを追加してください。 プロバイダーを使用しない場合、アプリサイズのペナルティは発生しません。
対応プロバイダー
| プロバイダ | SPMプロダクト | CocoaPodsサブスペック | 必須パラメータ |
|---|---|---|---|
MERCADOPAGO | DeunaSDKMercadoPago | pod 'DeunaSDK/MercadoPago' | (不要 - [:]) |
RISKIFIED | DeunaSDKRiskified | pod 'DeunaSDK/Riskified' | storeDomain |
CYBERSOURCE | DeunaSDKCybersource | pod 'DeunaSDK/Cybersource' | orgId, merchantId (オプション: fpServer) |
SIGNIFYD | DeunaSDKSignifyd | pod 'DeunaSDK/Signifyd' | orgId (オプション: fpServer) |
KOUNT | DeunaSDKKount | pod 'DeunaSDK/Kount' | merchantId, clientId, dataCollectorUrl, environment |
SIFT | DeunaSDKSift | pod 'DeunaSDK/Sift' | accountId, beaconKey |
ACCERTIFY | DeunaSDKAccertify | pod 'DeunaSDK/Accertify' | Xcodeバンドルリソース内の設定ファイル |
Accertifyバンドルアセットの設定
Accertify統合には、Xcodeプロジェクト内に2つの設定ファイルが必要です。両方のファイルがメインターゲットに追加され、 Copy Bundle Resources に追加:
server_keys_message_hosted.json: Accertifyから提供される公開暗号化キーファイル。InMobile.plist: マーチャント詳細を含むプロパティリストファイル:accountID(String): アカウントGUIDregistrationURL(String): InMobile登録エンドポイントlogURL(String): InMobileログエンドポイントserverKeyData(String):server_keys_message_hosted.json
: 経由での直接呼び出し generateFraudId
コール deunaSDK.generateFraudId 契約済みプロバイダーのパラメータを含む:
deunaSDK.generateFraudId(params: [
"RISKIFIED": [
"storeDomain": "yourdomain.com"
],
"CYBERSOURCE": [
"orgId": "your_org_id",
"merchantId": "your_merchant_id"
],
"MERCADOPAGO": [:],
"ACCERTIFY": [:]
]) { fraudId in
// fraudId is a Base64-encoded JSON string, or nil if providers failed or none configured
guard let fraudId = fraudId else { return }
print("Base64 Fraud ID:", fraudId)
}: を渡す fraudCredentials をウィジェットに直接渡す
ウィジェットを起動する際(initPaymentWidget, PaymentWidgetConfigurationなど)、設定を fraudCredentialsに直接渡すことができます。SDKは購入時に内部で不正IDを生成します:
deunaSDK.initPaymentWidget(
orderToken: orderToken,
callbacks: callbacks,
fraudCredentials: [
"RISKIFIED": [
"storeDomain": "yourdomain.com"
],
"CYBERSOURCE": [
"orgId": "your_org_id",
"merchantId": "your_merchant_id"
],
"MERCADOPAGO": [:]
]
): 動作に関する注意点
- ゼロ・ブラウト&クラッシュ・セーフ: プロバイダーが辞書リクエストに含まれていても、そのフレームワークまたはサブスペックがリンクされていない場合、SDKは例外をスローしたりクラッシュしたりせずに安全に無視します。
- : 並列実行: リクエストされたプロバイダーはバックグラウンドスレッドで同時にプロファイリングされます。
- フォールバック動作: 有効なプロバイダーが設定されていないか、デバイスで利用できない場合、完了ハンドラーは
nil.
コールバックとライフサイクル参照を参照してください。#
| コールバック / メソッド | モーダル | 埋め込み | 説明 |
|---|---|---|---|
onSuccess | ✅ | ✅ | 支払いまたはカード保管操作が正常に完了しました。注文または認証情報ペイロードを受け取ります。呼び出し deunaSDK.close() (モーダル)または deunaSDK.dispose() (埋め込み)。 |
onError | ✅ | ✅ | 初期化または支払い処理中にエラーが発生しました。型指定された PaymentsError または ElementsError. |
onClosed | ✅ | ❌ | モーダルが閉じました。受信します CloseAction.userAction (手動で閉じられた)または CloseAction.systemAction (経由でクローズ) close()). |
onPaymentProcessing | ✅ | ✅ | 顧客が支払いをタップし、支払い処理が開始されたときにトリガーされます。ボタンを無効化し、プログレススピナーを表示するために使用します。 |
onCardBinDetected | ✅ | ✅ | カードBINが検出またはクリアされたときにトリガーされます(nil お客様が番号を削除したときに返されます)。フランチャイズ割引に使用します。 |
onInstallmentSelected | ✅ | ✅ | 顧客が分割払いを選択したときにトリガーされます(nil 一括払いのときに返されます)。 |
onEventDispatch | ✅ | ✅ | すべての基盤となる CheckoutEvent または ElementsEvent データペイロード付きの発生。 |
close() | ✅ | ❌ | アクティブなモーダル表示を閉じながら、SDKインスタンスを保持します。 |
dispose() | ❌ | ✅ | ビュー階層がアンマウントされるときに、埋め込みコントローラーとWebViewを解放します。 |
エラーの処理(onError)
検査 error.type 初期化失敗と処理拒否を区別するために:
onError: { error in
switch error.type {
case .initializationFailed:
// Widget failed to load; close presentation and notify user
deunaSDK.close()
showToast("Payment service temporarily unavailable")
case .paymentError:
// Transaction declined or processor error
showRetry(error)
@unknown default:
showGenericError(error)
}
}公式の例とソースコード#
参照 WalletsScreen.swift ネイティブのApple Pay用 EmbeddedScreen.swift および、SwiftUIライフサイクルのための設定。