---
title: "Идентификация пользователей в iOS SDK"
description: "Быстрый старт по настройке Adapty для управления встроенными покупками."
---

:::important
Этот гайд для вас, если у вас есть собственная система аутентификации. Здесь вы узнаете, как работать с профилями пользователей в Adapty, чтобы они соответствовали вашей существующей системе аутентификации.
:::

То, как вы управляете покупками пользователей, зависит от модели аутентификации в вашем приложении:
- Если приложение не использует бэкенд-аутентификацию и не хранит данные пользователей, смотрите [раздел об анонимных пользователях](#anonymous-users).
- Если в приложении есть (или планируется) бэкенд-аутентификация, смотрите [раздел об идентифицированных пользователях](#identified-users).
**Ключевые понятия**:
- **Профили** — сущности, необходимые для работы SDK. Adapty создаёт их автоматически.
- Они могут быть анонимными **(без customer user ID)** или идентифицированными **(с customer user ID)**.
- Вы передаёте **customer user ID**, чтобы связать профили в Adapty с вашей внутренней системой авторизации.

Вот чем отличаются анонимные и идентифицированные пользователи:
|                         | Анонимные пользователи                                          | Идентифицированные пользователи                                                                     |
|-------------------------|----------------------------------------------------------------|------------------------------------------------------------------------------------------------------|
| **Управление покупками** | Восстановление покупок на уровне стора                        | История покупок сохраняется на всех устройствах через customer user ID  |
| **Управление профилем**  | Новый профиль при каждой переустановке                        | Один и тот же профиль во всех сессиях и на всех устройствах             |
| **Хранение данных**      | Данные анонимных пользователей привязаны к установке приложения | Данные идентифицированных пользователей сохраняются между установками приложения |
## Анонимные пользователи \{#anonymous-users\}

Если у вас нет серверной аутентификации, **вам не нужно обрабатывать аутентификацию в коде приложения**:
1. Когда SDK активируется при первом запуске приложения, Adapty **создаёт новый профиль для пользователя**.
2. Когда пользователь совершает покупку в приложении, она **привязывается к его профилю в Adapty и к его аккаунту в сторе**.
3. Когда пользователь **переустанавливает** приложение или устанавливает его на **новом устройстве**, Adapty **создаёт новый анонимный профиль при активации**.
4. Если пользователь ранее совершал покупки в вашем приложении, по умолчанию они автоматически синхронизируются из App Store при активации SDK.
:::note
Восстановление из резервной копии работает иначе, чем переустановка. По умолчанию при восстановлении из бэкапа SDK сохраняет кэшированные данные и не создаёт новый профиль. Это поведение можно настроить с помощью параметра `clearDataOnBackup`. [Подробнее](sdk-installation-ios#clear-data-on-backup-restore).
:::

Таким образом, для анонимных пользователей при каждой установке будет создаваться новый профиль — но это не проблема, поскольку в аналитике Adapty можно [настроить, что считать новой установкой](general#4-installs-definition-for-analytics).
Для анонимных пользователей установки считаются по **идентификаторам устройств**. При этом каждая установка приложения на устройство считается отдельной установкой, включая повторные.
## Идентифицированные пользователи \{#identified-users\}

У вас есть два способа идентифицировать пользователей в приложении:

- [**При входе/регистрации:**](#during-loginsignup) Если пользователи входят в систему после запуска приложения, вызовите `identify()` с идентификатором пользователя в момент аутентификации.

- [**При активации SDK:**](#during-the-sdk-activation) Если идентификатор пользователя уже сохранён на момент запуска приложения, передайте его при вызове `activate()`.
:::important
По умолчанию, когда Adapty получает покупку от Customer User ID, который в данный момент привязан к другому Customer User ID, уровень доступа становится общим — оба профиля получают платный доступ. Вы можете настроить это поведение так, чтобы платный доступ передавался от одного профиля к другому, или полностью отключить совместное использование. Подробнее см. в [статье](general#6-sharing-paid-access-between-user-accounts).
:::

  <img src="/assets/shared/img/identify-diagram.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

### При входе в систему или регистрации \{#during-loginsignup\}

Если вы идентифицируете пользователей уже после запуска приложения (например, после входа в аккаунт или регистрации), используйте метод `identify`, чтобы задать их customer user ID.

- Если вы **раньше не использовали этот customer user ID**, Adapty автоматически привяжет его к текущему профилю.
- Если вы **уже использовали этот customer user ID для идентификации пользователя**, Adapty переключится на работу с профилем, связанным с этим customer user ID.
:::important
Идентификаторы пользователей должны быть уникальными для каждого пользователя. Если задать значение параметра жёстко в коде, все пользователи будут считаться одним.
:::

Всегда используйте `await` для `identify` перед вызовом других методов SDK. Параллельные вызовы приводят к ошибке `#3006 profileWasChanged` или попаданию в анонимный профиль. Подробнее: [Порядок вызовов в iOS SDK](ios-sdk-call-order).

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="Swift" default>
```swift showLineNumbers
do {
    try await Adapty.identify("YOUR_USER_ID") // Уникальный для каждого пользователя
} catch {
    // обработайте ошибку
}
```
</TabItem>
<TabItem value="swift-callback" label="Swift-Callback" default>

```swift showLineNumbers
// Идентификаторы пользователей должны быть уникальными для каждого пользователя
Adapty.identify("YOUR_USER_ID") { error in
    if let error {
        // обработайте ошибку
    }
}
```
</TabItem>
</Tabs>
### При активации SDK \{#during-the-sdk-activation\}

Если вы знаете customer user ID в момент активации SDK, его можно передать прямо в методе `activate`, не вызывая `identify` отдельно.

Если вы знаете customer user ID, но задаёте его только после активации, то при активации Adapty создаст новый анонимный профиль и переключится на существующий лишь после того, как вы вызовете `identify`.
Вы можете передать как существующий customer user ID (тот, что использовался ранее), так и новый. Если передать новый, профиль, созданный при активации, автоматически привяжется к этому customer user ID.

:::note
По умолчанию создание анонимных профилей не влияет на аналитические дашборды, поскольку установки считаются на основе идентификаторов устройств.
Идентификатор устройства соответствует одной установке приложения из стора на конкретном устройстве и обновляется только при переустановке приложения.
Он не зависит от того, первая это установка или повторная, и используется ли существующий пользовательский ID.

Создание профиля (при активации SDK или выходе из аккаунта), вход в систему или обновление приложения без переустановки не генерируют дополнительных событий установки.
Если вы хотите считать установки по уникальным пользователям, а не устройствам, перейдите в **App settings** и настройте [**Installs definition for analytics**](general#4-installs-definition-for-analytics).
:::

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="Swift" default>
```swift showLineNumbers
// Place in the app main struct for SwiftUI or in AppDelegate for UIKit

let configurationBuilder =
    AdaptyConfiguration
        .builder(withAPIKey: "PUBLIC_SDK_KEY")
        .with(customerUserId: "YOUR_USER_ID") // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.

do {
  try await Adapty.activate(with: configurationBuilder.build())
} catch {
  // handle the error
}
```
</TabItem>

<TabItem value="swift-callback" label="Swift-Callback" default>
```swift showLineNumbers
// Place in the app main struct for SwiftUI or in AppDelegate for UIKit

let configurationBuilder =
    AdaptyConfiguration
        .builder(withAPIKey: "PUBLIC_SDK_KEY")
        .with(customerUserId: "YOUR_USER_ID") // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.

Adapty.activate(with: configurationBuilder.build()) { error in
  // handle the error
}
```

</TabItem>

</Tabs>
### Выход пользователей из системы \{#log-users-out\}

Если в вашем приложении есть кнопка выхода, используйте метод `logout`.

:::important
При выходе из системы для пользователя создаётся новый анонимный профиль.
:::

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="Swift" default>

```swift showLineNumbers
do {
    try await Adapty.logout()
} catch {
    // handle the error
}
```
</TabItem>
<TabItem value="swift-callback" label="Swift-Callback" default>

```swift showLineNumbers
Adapty.logout { error in
    if error == nil {
        // successful logout
    }
}
```
</TabItem>
</Tabs>
:::info
Чтобы повторно авторизовать пользователей в приложении, используйте метод `identify`.
:::
### Разрешение покупок без авторизации \{#allow-purchases-without-login\}

Если пользователи могут совершать покупки как до, так и после входа в аккаунт, необходимо убедиться, что после авторизации они сохранят доступ к приобретённому контенту:
1. Когда пользователь без аккаунта совершает покупку, Adapty привязывает её к анонимному ID профиля.
2. Когда пользователь входит в аккаунт, Adapty переключается на работу с его идентифицированным профилем.
    - Если customer user ID новый (например, покупка была совершена до регистрации), Adapty присваивает этот customer user ID текущему профилю, сохраняя всю историю покупок.
    - Если customer user ID уже существует (он уже привязан к другому профилю), нужно получить актуальный уровень доступа после переключения профиля. Можно вызвать [`getProfile`](ios-check-subscription-status) сразу после идентификации или [подписаться на обновления профиля](ios-check-subscription-status), чтобы данные синхронизировались автоматически.
## Следующие шаги \{#next-steps\}

Поздравляем! Вы реализовали логику встроенных покупок в своём приложении! Желаем вам успехов в монетизации!
Чтобы получить от Adapty ещё больше, изучите эти темы:
- [**Тестирование**](test-purchases-in-sandbox): убедитесь, что всё работает как ожидается
- [**Онбординги**](ios-onboardings): вовлекайте пользователей с помощью онбордингов и повышайте удержание
- [**Интеграции**](configuration): интегрируйтесь с сервисами маркетинговой атрибуции и аналитики буквально в одну строку кода
- [**Установка пользовательских атрибутов профиля**](setting-user-attributes): добавляйте пользовательские атрибуты к профилям, создавайте сегменты и запускайте A/B-тесты или показывайте разные пейволы разным пользователям