Идентификация пользователей в Kotlin Multiplatform SDK
Adapty создаёт внутренний ID профиля для каждого пользователя. Однако если у вас есть собственная система аутентификации, вам следует задать свой Customer User ID. Вы можете найти пользователей по их Customer User ID в разделе Профили и использовать его в серверном API — он будет передаваться во все интеграции.
Указание идентификатора пользователя при настройке
Если идентификатор пользователя известен в момент настройки, передайте его в параметре customerUserId метода .activate():
Adapty.activate(
AdaptyConfig.Builder("PUBLIC_SDK_KEY")
.withCustomerUserId("YOUR_USER_ID")
.build()
).onSuccess {
// successful activation
}.onError { error ->
// handle the error
}
}
Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Посмотрите наши примеры приложений — они демонстрируют полную настройку: отображение пейволов, совершение покупок и другие базовые функции.
Указание customer user ID после инициализации
Если при настройке SDK у вас не было user ID, его можно задать позже в любой момент с помощью метода .identify(). Чаще всего этот метод используется после регистрации или авторизации — когда пользователь переходит из анонимного состояния в аутентифицированное.
Adapty.identify("YOUR_USER_ID").onSuccess {
// successful identify
}.onError { error ->
// handle the error
}
Параметры запроса:
- Customer User ID (обязательный): строковый идентификатор пользователя.
Повторная отправка важных данных пользователя
В некоторых случаях, например когда пользователь снова входит в аккаунт, серверы Adapty уже располагают информацией об этом пользователе. В таких ситуациях Adapty SDK автоматически переключится на работу с новым пользователем. Если вы передавали какие-либо данные анонимному пользователю — например, пользовательские атрибуты или атрибуцию из сторонних сетей — необходимо повторно отправить эти данные для идентифицированного пользователя.
Также важно учитывать, что после идентификации пользователя следует заново запросить все пейволы и продукты, поскольку данные нового пользователя могут отличаться.
Выход и вход в систему
Вы можете выйти из системы в любой момент, вызвав метод .logout():
Adapty.logout().onSuccess {
// successful logout
}.onError { error ->
// handle the error
}
После этого можно войти снова с помощью метода .identify().
Назначение appAccountToken (iOS)
iosAppAccountToken — это UUID, который позволяет связать транзакции App Store с внутренним идентификатором пользователя.
StoreKit прикрепляет этот токен к каждой транзакции, чтобы ваш бэкенд мог сопоставить данные App Store с конкретными пользователями.
Используйте стабильный UUID, сгенерированный для каждого пользователя, и повторно применяйте его для одного и того же аккаунта на всех устройствах. Это гарантирует, что покупки и уведомления App Store будут корректно связаны с нужным пользователем. Токен можно передать двумя способами — при активации SDK или при идентификации пользователя.
Необходимо всегда передавать iosAppAccountToken вместе с customerUserId.
Если передать только токен, он не будет включён в транзакцию.
// During configuration:
Adapty.activate(
AdaptyConfig.Builder("PUBLIC_SDK_KEY")
.withCustomerUserId(
id = "YOUR_USER_ID",
iosAppAccountToken = "YOUR_IOS_APP_ACCOUNT_TOKEN"
)
.build()
).onSuccess {
// successful activation
}.onError { error ->
// handle the error
}
// Or when identifying users
Adapty.identify(
customerUserId = "YOUR_USER_ID",
iosAppAccountToken = "YOUR_IOS_APP_ACCOUNT_TOKEN"
).onSuccess {
// successful identify
}.onError { error ->
// handle the error
}
Установка обфусцированных идентификаторов аккаунта (Android)
Google Play требует обфусцированные идентификаторы аккаунта в ряде сценариев — для защиты конфиденциальности и безопасности пользователей. Эти идентификаторы позволяют Google Play отслеживать покупки, не раскрывая личные данные пользователей, что особенно важно для предотвращения мошенничества и аналитики.
Задавать такие идентификаторы может потребоваться, если приложение обрабатывает чувствительные пользовательские данные или должно соответствовать определённым требованиям по защите персональных данных. Обфусцированные идентификаторы позволяют Google Play отслеживать покупки, не раскрывая реальные идентификаторы пользователей.
Вы всегда должны передавать androidObfuscatedAccountId вместе с customerUserId.
Если передать только obfuscated account ID, он не будет включён в транзакцию.
// During configuration:
Adapty.activate(
AdaptyConfig.Builder("PUBLIC_SDK_KEY")
.withCustomerUserId(
id = "YOUR_USER_ID",
androidObfuscatedAccountId = "YOUR_OBFUSCATED_ACCOUNT_ID"
)
.build()
).onSuccess {
// successful activation
}.onError { error ->
// handle the error
}
// Or when identifying users
Adapty.identify(
customerUserId = "YOUR_USER_ID",
androidObfuscatedAccountId = "YOUR_OBFUSCATED_ACCOUNT_ID"
).onSuccess {
// successful identify
}.onError { error ->
// handle the error
}
Определение пользователей на разных устройствах
При активации SDK он автоматически считывает существующие права пользователя из StoreKit (iOS) или Google Play Billing (Android) и синхронизирует их с бэкендом Adapty. Активная подписка появляется в профиле Adapty без вызова restorePurchases со стороны приложения.
Что не происходит автоматически — так это распознавание того, что профиль на новом устройстве принадлежит тому же пользователю, что и профиль на исходном устройстве. Adapty сопоставляет профили по Customer User ID, поэтому непрерывность идентификации зависит от того, что вы используете в качестве CUID.
Что Adapty может определить между устройствами
| Ваша настройка | Что Adapty определяет | Что нужно сделать |
|---|---|---|
Customer User ID = device_id (без входа в аккаунт) | Новое устройство получает другой CUID и, следовательно, другой профиль. Подписка синхронизируется с новым профилем через событие Access level updated, но subscription_started не срабатывает — новый профиль считается наследником исходной покупки. Аналитика, основанная на subscription_started, будет занижать количество возвращающихся пользователей. | Используйте стабильный идентификатор аккаунта в качестве Customer User ID, чтобы вернувшийся пользователь соответствовал существующему профилю на разных устройствах. |
| Customer User ID = стабильный идентификатор аккаунта (вход на каждом устройстве) | SDK автоматически синхронизирует подписку при activate(), а identify() сопоставляет существующий профиль по CUID. | Никаких дополнительных действий не требуется — и идентификация, и подписка разрешаются автоматически. |
| Наследник Apple Family Sharing | Член семьи получает подписку только через событие Access level updated — subscription_started не срабатывает. | Отслеживайте событие Access level updated. Полную матрицу событий см. в разделе Apple Family Sharing. |
| Один аккаунт Apple/Google, разные пользователи внутри приложения | Первый профиль, зафиксировавший покупку, становится родительским. Последующие профили видят подписку через цепочку наследования с одним событием Access level updated. | Требуйте входа в аккаунт, затем выберите режим совместного использования, подходящий для вашей модели. |
Восстановление покупок на новом устройстве
Добавьте кнопку «Восстановить покупки», инициируемую пользователем, на свой пейвол. Apple App Review (руководство 3.1.1) её требует, и она служит запасным вариантом на случай, если автоматическая синхронизация пропустит граничный случай. Кнопка должна вызывать restorePurchases в вашем SDK.
Программный вызов restorePurchases при первом запуске не нужен для обычного использования — SDK уже выполняет аналогичную операцию при activate(). Программные вызовы стоит использовать только для принудительной проверки чека, например при отладке отсутствующего доступа после завершения activate().