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

# SDK для iOS на Swift

> Добавьте SDK PNLight для Swift в нативное приложение iOS через Swift Package Manager и инициализируйте его при запуске, чтобы отслеживать установки, отправлять атрибуцию и отображать Remote UI.

Используйте SDK для Swift в нативных приложениях iOS.

## Требования

* iOS 13.0+
* Swift 5.7+
* Swift Package Manager

## Установка через Swift Package Manager

Репозиторий пакета: [pnlight-dev/sdk-swift](https://github.com/pnlight-dev/sdk-swift).

[![Версия SDK для Swift](https://img.shields.io/github/v/tag/pnlight-dev/sdk-swift?label=Swift%20SDK\&sort=semver)](https://github.com/pnlight-dev/sdk-swift/tags)

Добавьте пакет в Xcode:

<Steps>
  <Step title="Откройте настройки пакетов">
    В Xcode нажмите **File**, затем **Add Packages...**.
  </Step>

  <Step title="Введите URL репозитория">
    Введите `https://github.com/pnlight-dev/sdk-swift.git`.
  </Step>

  <Step title="Добавьте пакет">
    Добавьте пакет в таргет приложения.
  </Step>
</Steps>

## Инициализация SDK

Вызовите инициализацию при запуске приложения.

```swift theme={null}
import PNLightSDK

await PNLightSDK.shared.initialize(apiKey: "pnlight_sdk_token")
```

## Основные вызовы

```swift theme={null}
let userId = PNLightSDK.shared.getUserId()

await PNLightSDK.shared.addAttribution(
    provider: .appsFlyer,
    data: ["af_status": "Non-organic"],
    identifier: "appsFlyerCustomerId"
)

await PNLightSDK.shared.logEvent("paywall_viewed", eventArgs: [
    "placement": "paywall"
])
```

`logEvent` отправляет необязательные события приложения в PNLight. Их можно просматривать в разделе **Аналитика → События приложения**, на странице **События** и в хронологии клиентов.

## IDFA после ATT

Если PNLight инициализируется до завершения запроса App Tracking Transparency, после получения разрешения вызовите `updateIdfa()`, чтобы PNLight получил разрешённый IDFA.

```swift theme={null}
import AppTrackingTransparency
import PNLightSDK

await ATTrackingManager.requestTrackingAuthorization()
await PNLightSDK.shared.updateIdfa()
```

## Remote UI

Используйте `RemoteUiView` в SwiftUI, когда хотите, чтобы PNLight отобразил настроенный плейсмент.

```swift theme={null}
import PNLightSDK
import SwiftUI

struct PaywallScreen: View {
    var body: some View {
        RemoteUiView(placement: "paywall", cardId: "paywall_card") { action in
            if action.logId == "purchase_button" {
                let productId = action.params["id"] ?? ""
                Task {
                    let success = await purchase(productId)
                    if success {
                        showMainScreen()
                    }
                }
            }
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}
```

Если нужно самостоятельно получить конфигурацию плейсмента, используйте `getUIConfig`. При первом запуске приложения подождите 4–5 секунд после инициализации AppsFlyer, если требуется атрибуция. SDK также ожидает атрибуцию внутри, если `attributionRequired` равно `true`.

```swift theme={null}
try? await Task.sleep(nanoseconds: 5_000_000_000)

let config = await PNLightSDK.shared.getUIConfig(placement: "paywall")
```

Используйте `getUIConfigResult`, когда приложению нужно отличить отсутствие UI для плейсмента от ошибки загрузки.

```swift theme={null}
let result = await PNLightSDK.shared.getUIConfigResult(
    placement: "paywall",
    ignoreCache: true
)
```

Рекомендации по плейсментам и действиям приведены в разделе [Remote UI](/ru/sdk/remote-ui).
