> ## 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 का hosted checkout खोलें और एक ही कॉल में typed result प्राप्त करें।

<Info>
  यह Swift के लिए आधिकारिक Dodo Payments iOS checkout SDK है। यह Dodo का hosted checkout native browser view में खोलता है और typed result लौटाता है।
</Info>

<CardGroup cols={2}>
  <Card title="Checkout Sessions API" icon="cart-shopping" href="/developer-resources/checkout-session">
    अपने backend से वह checkout\_url बनाएँ जिसे यह SDK खोलेगा।
  </Card>

  <Card title="Mobile Integration Guide" icon="mobile" href="/developer-resources/mobile-integration">
    देखें कि यह संपूर्ण mobile payment flow में कैसे शामिल होता है।
  </Card>
</CardGroup>

iOS SDK Dodo का hosted checkout `SFSafariViewController` में खोलता है, कोई API key नहीं रखता और Dodo API को सीधे कभी कॉल नहीं करता। Checkout का पूरा logic browser में चलता है; SDK केवल view lifecycle प्रबंधित करता है और 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">
    Checkout से 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 को forward करना

`SFSafariViewController` के पास अपने return URL को पकड़ने का कोई in-process तरीका नहीं है। आपके ऐप को आने वाले URLs को SDK में forward करना होगा।

<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 को forward करना सुरक्षित है। `handleOpenURL` केवल आपके पंजीकृत `returnUrl` से मेल खाने वाले URLs पर काम करता है और अन्य सभी के लिए `false` लौटाता है।
</Note>

## Result का अर्थ

<Warning>
  `result.status` एक UI संकेत है, payment का प्रमाण नहीं। हर payment की पुष्टि अपने backend से, `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 में दिखाएँ, access देने के लिए इसका उपयोग न करें। नीचे Verify the Payment देखें।
</ParamField>

<ParamField body="subscriptionId" type="String?">
  Subscription checkouts के लिए सेट होता है।
</ParamField>

<ParamField body="licenseKeys" type="[String]?">
  जब checkout में license key products शामिल हों, तब सेट होता है।
</ParamField>

<ParamField body="customerEmail" type="String?">
  जब checkout में email कैप्चर हो, तब सेट होता है।
</ParamField>

<ParamField body="raw" type="[String: String]">
  Return URL का हर query parameter, जैसा का तैसा।
</ParamField>

## Payment सत्यापित करें

<CardGroup cols={2}>
  <Card title="Webhooks" icon="webhook" href="/developer-resources/webhooks">
    Payment सफल होने या subscription सक्रिय होने पर Dodo Payments आपके backend को कॉल करता है।
  </Card>

  <Card title="Get Payment Detail" icon="magnifying-glass" href="/api-reference/payments/get-payments-1">
    इसकी स्थिति सीधे जाँचने के लिए अपनी secret key से `paymentId` देखें।
  </Card>
</CardGroup>

इनमें से किसी एक से payment की पुष्टि होने के बाद access दें; केवल `result.status` के आधार पर कभी नहीं।

## Errors

`start` केवल गलत उपयोग या platform failure के लिए `CheckoutError` throw करता है। Cancelled या declined payment हमेशा result होता है, exception नहीं।

* `invalidCheckoutUrl` (`INVALID_CHECKOUT_URL`): यह कोई `checkout.dodopayments.com` session URL नहीं है।
* `invalidReturnUrl` (`INVALID_RETURN_URL`): यह मान्य absolute URL नहीं है।
* `alreadyInProgress` (`ALREADY_IN_PROGRESS`): कोई checkout पहले से चल रहा है।
* `platformError` (`PLATFORM_ERROR`): अप्रत्याशित platform failure।

## Abandoned Sessions

<Info>
  यदि checkout के बीच में ऐप बंद हो जाए, तो अगले launch पर session recover करें और अपने backend के साथ उसका reconciliation करें।
</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 के लिए यही contract।
  </Card>

  <Card title="React Native SDK" icon="react" href="/developer-resources/sdks/react-native">
    iOS पर इसी Swift core को wrap करता है।
  </Card>
</CardGroup>
