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

:::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.
Итак, при анонимных пользователях новые профили создаются при каждой установке, но это не проблема: в аналитике Adapty можно [настроить, что считать новой установкой](general#4-installs-definition-for-analytics).

Для анонимных пользователей установки нужно считать по **идентификаторам устройств**. В этом случае каждая установка приложения на устройство считается отдельной установкой, включая переустановки.
:::note
Резервное восстановление работает иначе, чем переустановка. По умолчанию при восстановлении из резервной копии SDK сохраняет кешированные данные и не создаёт новый профиль. Это поведение можно настроить с помощью параметра `withAppleClearDataOnBackup`. [Подробнее](sdk-installation-kotlin-multiplatform#clear-data-on-backup-restore).
:::
## Идентификация пользователей \{#identified-users\}

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

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

- [**При активации SDK:**](#during-the-sdk-activation) Если у вас уже есть сохранённый customer user ID на момент запуска приложения, передайте его при вызове `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
Идентификаторы пользователей (Customer User ID) должны быть уникальными для каждого пользователя. Если вы укажете фиксированное значение, все пользователи будут считаться одним.
:::

Дождитесь завершения `identify` (в колбэке `onSuccess`), прежде чем вызывать другие методы SDK. Конкурентные вызовы могут попасть на анонимный профиль. См. [Порядок вызовов в Kotlin Multiplatform SDK](kmp-sdk-call-order).

```kotlin showLineNumbers
Adapty.identify("YOUR_USER_ID") // Уникален для каждого пользователя
    .onSuccess {
        // successful identify
    }
    .onError { error ->
        // handle the error
    }
```
### При активации SDK \{#during-the-sdk-activation\}

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

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

:::note
По умолчанию создание анонимных профилей не влияет на аналитику дашборда, поскольку установки считаются на основе идентификаторов устройств.
A device ID представляет собой одну установку приложения из стора на устройстве и regenerated only after the app is reinstalled.
Он не зависит от того, является ли это первой или повторной установкой, и от того, используется ли существующий customer user ID.

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

```kotlin showLineNumbers
AdaptyConfig.Builder("PUBLIC_SDK_KEY")
    .withCustomerUserId("user123") // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
    .build()
```
### Выход пользователей из системы \{#log-users-out\}

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

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

```kotlin showLineNumbers
Adapty.logout()
    .onSuccess {
        // successful logout
    }
    .onError { error ->
        // handle the error
    }
```

:::info
Чтобы снова войти в приложение, используйте метод `identify`.
:::

### Разрешите покупки без входа \{#allow-purchases-without-login\}

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

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