Идентификация пользователей в Capacitor SDK

Adapty создаёт внутренний ID профиля для каждого пользователя. Однако если у вас есть собственная система аутентификации, вы можете задать свой Customer User ID. По нему можно находить пользователей в разделе Профили и использовать его в server-side API — он будет передаваться во все интеграции.

Передача идентификатора пользователя при конфигурации

Если у вас есть идентификатор пользователя на момент конфигурации, просто передайте его в параметре customerUserId метода .activate():


try {
  await adapty.activate({
    apiKey: 'YOUR_PUBLIC_SDK_KEY',
    params: {
      customerUserId: 'YOUR_USER_ID'
    }
  });
} catch (error) {
  console.error('Failed to activate Adapty:', error);
}

Установка идентификатора пользователя после конфигурации

Если при конфигурации SDK у вас не было идентификатора пользователя, его можно задать позже в любой момент с помощью метода .identify(). Чаще всего этот метод используется после регистрации или авторизации — когда анонимный пользователь становится аутентифицированным.


try {
  await adapty.identify({ customerUserId: 'YOUR_USER_ID' });
  console.log('User identified successfully');
} catch (error) {
  console.error('Failed to identify user:', error);
}
ПараметрОбязательныйОписание
customerUserIdобязательныйСтроковый идентификатор пользователя.

Повторная отправка важных данных пользователя

В некоторых случаях, например когда пользователь снова входит в свой аккаунт, серверы Adapty уже располагают информацией об этом пользователе. В таких сценариях Adapty SDK автоматически переключится на работу с новым пользователем. Если вы передавали какие-либо данные анонимному пользователю — например, пользовательские атрибуты или атрибуции из сторонних сетей — необходимо повторно отправить эти данные для идентифицированного пользователя. Также важно отметить, что после идентификации пользователя необходимо повторно запросить все пейволы и продукты, так как данные нового пользователя могут отличаться.

Выход и вход пользователя

Вы можете выйти из аккаунта пользователя в любой момент, вызвав метод .logout():


try {
  await adapty.logout();
  console.log('User logged out successfully');
} catch (error) {
  console.error('Failed to logout user:', error);
}

После этого можно авторизовать пользователя с помощью метода .identify().

Назначение appAccountToken (iOS)

appAccountToken — это UUID, который позволяет связывать транзакции App Store с внутренним идентификатором пользователя.
StoreKit прикрепляет этот токен к каждой транзакции, поэтому бэкенд может сопоставлять данные App Store с вашими пользователями.

Используйте стабильный UUID, сгенерированный для каждого пользователя, и применяйте его для одного и того же аккаунта на всех устройствах. Это гарантирует, что покупки и уведомления App Store будут правильно привязаны. Токен можно задать двумя способами — при активации SDK или при идентификации пользователя.

appAccountToken нужно всегда передавать вместе с customerUserId. Если передать только токен, он не попадёт в транзакцию.

// При настройке:
await adapty.activate({
    apiKey: 'YOUR_PUBLIC_SDK_KEY',
    params: {
        customerUserId: 'YOUR_USER_ID',
        ios: { appAccountToken: "YOUR_APP_ACCOUNT_TOKEN" },
    }
});
// Или при идентификации пользователей
await adapty.identify({
    customerUserId: 'YOUR_USER_ID',
    params: {
        ios: { appAccountToken: 'YOUR_APP_ACCOUNT_TOKEN' },
    }
});

Установите обфусцированные идентификаторы аккаунта (Android)

Google Play требует обфусцированные идентификаторы аккаунта для ряда сценариев — это помогает защитить конфиденциальность и безопасность пользователей. Такие идентификаторы позволяют Google Play отслеживать покупки, не раскрывая личные данные пользователей, что особенно важно для предотвращения мошенничества и аналитики.

Устанавливать эти идентификаторы нужно, если приложение работает с чувствительными пользовательскими данными или если вы обязаны соблюдать определённые нормы конфиденциальности. Обфусцированные идентификаторы позволяют Google Play отслеживать покупки, не раскрывая реальные пользовательские данные.

// При настройке:
await adapty.activate({
  apiKey: 'YOUR_PUBLIC_SDK_KEY',
  params: {
    android: { obfuscatedAccountId: 'YOUR_OBFUSCATED_ACCOUNT_ID' },
  }
});
// Или при идентификации пользователей
await adapty.identify({
    customerUserId: 'YOUR_USER_ID',
    params: {
        android: { obfuscatedAccountId: 'YOUR_OBFUSCATED_ACCOUNT_ID' },
    }
});

Обнаружение пользователей на разных устройствах

При активации 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 updatedsubscription_started не срабатывает.Отслеживайте событие Access level updated. Полную матрицу событий см. в разделе Apple Family Sharing.
Один аккаунт Apple/Google, разные пользователи внутри приложенияПервый профиль, зафиксировавший покупку, становится родительским. Последующие профили видят подписку через цепочку наследования с одним событием Access level updated.Требуйте входа в аккаунт, затем выберите режим совместного использования, подходящий для вашей модели.

Восстановление покупок на новом устройстве

Добавьте кнопку «Восстановить покупки», инициируемую пользователем, на свой пейвол. Apple App Review (руководство 3.1.1) её требует, и она служит запасным вариантом на случай, если автоматическая синхронизация пропустит граничный случай. Кнопка должна вызывать restorePurchases в вашем SDK.

Программный вызов restorePurchases при первом запуске не нужен для обычного использования — SDK уже выполняет аналогичную операцию при activate(). Программные вызовы стоит использовать только для принудительной проверки чека, например при отладке отсутствующего доступа после завершения activate().