> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# iOS

> SFSafariViewControllerでiOSアプリからDodo Paymentsのホスト型チェックアウトを開き、1回の呼び出しで型付きの結果を取得します。

<Info>
  これはSwift向けの公式Dodo Payments iOSチェックアウト SDKです。ネイティブブラウザビューでDodoのホスト型チェックアウトを開き、型付きの結果を返します。
</Info>

<CardGroup cols={2}>
  <Card title="Checkout Sessions API" icon="cart-shopping" href="/developer-resources/checkout-session">
    バックエンドから、このSDKが開くcheckout\_urlを作成します。
  </Card>

  <Card title="Mobile Integration Guide" icon="mobile" href="/developer-resources/mobile-integration">
    これがモバイル決済フロー全体の中でどのように機能するかを確認します。
  </Card>
</CardGroup>

iOS SDKはDodoのホスト型チェックアウトを`SFSafariViewController`で開き、API keyを保持せず、Dodo APIを直接呼び出すこともありません。チェックアウトのロジックはすべてブラウザで実行され、SDKはビューのライフサイクルを管理し、return URLを取得するだけです。

iOS 16以降、Swift 6が必要です。

## インストール

<Steps>
  <Step title="Add the Package">
    Xcodeで **File → Add Package Dependencies** に移動し、次を入力します。

    ```
    https://github.com/dodopayments/dodopayments-mobile-sdk-ios
    ```

    バージョン1.0.0以降を選択します。

    または、`Package.swift`に追加します。

    ```swift Package.swift theme={null}
    .package(url: "https://github.com/dodopayments/dodopayments-mobile-sdk-ios", from: "1.0.0")
    ```
  </Step>

  <Step title="Register a Callback URL Scheme">
    アプリは、チェックアウトからのreturn URLを受け取るためにURL schemeを登録する必要があります。これを`Info.plist`に追加します。

    ```xml Info.plist theme={null}
    <key>CFBundleURLTypes</key>
    <array>
      <dict>
        <key>CFBundleURLName</key>
        <string>myapp</string>
        <key>CFBundleURLSchemes</key>
        <array>
          <string>myapp</string>
        </array>
      </dict>
    </array>
    ```

    Xcodeの **Info → URL Types** UIから追加することもできます。
  </Step>
</Steps>

## 使用方法

```swift theme={null}
import DodoCheckout

let result = try await DodoCheckout.start(
    checkoutUrl: checkoutUrl,   // from your backend's checkout session
    returnUrl: URL(string: "myapp://checkout/return")!,
    onEvent: { event in print(event.name) }  // logging only
)

switch result.status {
case .succeeded: showSuccess(result.paymentId)
case .failed:    showFailure()
case .cancelled: dismiss()
case .pending:   showPending()
case .expired:   showExpired()
}
```

## Return URLの転送

`SFSafariViewController`には、自身のreturn URLを捕捉するプロセス内の方法がありません。アプリで受信したURLをSDKに転送する必要があります。

<Tabs>
  <Tab title="SwiftUI">
    ```swift theme={null}
    .onOpenURL { url in
        DodoCheckout.handleOpenURL(url)
    }
    ```
  </Tab>

  <Tab title="SceneDelegate">
    ```swift SceneDelegate.swift theme={null}
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        guard let url = URLContexts.first?.url else { return }
        DodoCheckout.handleOpenURL(url)
    }
    ```
  </Tab>
</Tabs>

<Note>
  ここではすべてのURLを安全に転送できます。`handleOpenURL`は、登録済みの`returnUrl`に一致するURLに対してのみ動作し、それ以外の場合は`false`を返します。
</Note>

## 結果の意味

<Warning>
  `result.status`はUI上のヒントであり、支払いの証明ではありません。すべての支払いを、`payment.succeeded` / `subscription.active` webhookを介してバックエンドで確認してください。
</Warning>

<ParamField body="status" type="CheckoutStatus" required>
  `succeeded`、`failed`、`cancelled`、`pending`、`expired`のいずれかです。
</ParamField>

<ParamField body="paymentId" type="String?">
  return URLに含まれている場合に設定されます。UIに表示しますが、アクセスの許可には使用しないでください。詳しくは以下の「支払いの確認」を参照してください。
</ParamField>

<ParamField body="subscriptionId" type="String?">
  subscription checkoutの場合に設定されます。
</ParamField>

<ParamField body="licenseKeys" type="[String]?">
  チェックアウトにlicense key productsが含まれている場合に設定されます。
</ParamField>

<ParamField body="customerEmail" type="String?">
  チェックアウトでemailが取得された場合に設定されます。
</ParamField>

<ParamField body="raw" type="[String: String]">
  return URLのすべてのquery parameterをそのまま保持します。
</ParamField>

## 支払いの確認

<CardGroup cols={2}>
  <Card title="Webhooks" icon="webhook" href="/developer-resources/webhooks">
    支払いが成功したとき、またはsubscriptionが有効になったとき、Dodo Paymentsはバックエンドを呼び出します。
  </Card>

  <Card title="Get Payment Detail" icon="magnifying-glass" href="/api-reference/payments/get-payments-1">
    secret keyを使用して`paymentId`を検索し、そのstatusを直接確認します。
  </Card>
</CardGroup>

これらのいずれかによって支払いが確認された後にアクセスを許可してください。`result.status`だけで許可してはいけません。

## エラー

`start`は、誤用またはプラットフォーム障害の場合にのみ`CheckoutError`をthrowします。キャンセルまたはdeclinedとなった支払いは常に結果として返され、exceptionにはなりません。

* `invalidCheckoutUrl`（`INVALID_CHECKOUT_URL`）：`checkout.dodopayments.com`のsession URLではありません。
* `invalidReturnUrl`（`INVALID_RETURN_URL`）：有効なabsolute URLではありません。
* `alreadyInProgress`（`ALREADY_IN_PROGRESS`）：checkoutがすでに実行中です。
* `platformError`（`PLATFORM_ERROR`）：予期しないプラットフォーム障害です。

## 放棄されたセッション

<Info>
  アプリがチェックアウトの途中で終了した場合は、次回起動時にセッションを復元し、バックエンドと照合してください。
</Info>

```swift theme={null}
import DodoCheckout

if let abandoned = DodoCheckout.getAbandonedSession() {
    // reconcile abandoned.sessionId with your backend, then:
    DodoCheckout.clearAbandonedSession()
}
```

## 関連情報

<CardGroup cols={2}>
  <Card title="Mobile Integration Guide" icon="mobile" href="/developer-resources/mobile-integration">
    Android、React Native、Flutterにも同じ契約を適用します。
  </Card>

  <Card title="React Native SDK" icon="react" href="/developer-resources/sdks/react-native">
    iOS上で同じSwift coreをラップします。
  </Card>
</CardGroup>
