# Идентификация пользователя в iOS

SDK поддерживает два режима идентификации: SDK-managed и ручной.

## Стандарт CUID на основе телефона (`phone_hash`)

Для LoginEvent и SignUpEvent рекомендуется использовать единый идентификатор пользователя — SHA-256 хеш нормализованного телефона.

Правила:

- номер очищается от всех символов, кроме цифр;
- для РФ и КЗ номер приводится к формату `7XXXXXXXXXX`;
- хеш считается по UTF-8 строке;
- результат передается в lowercase hex;
- в `LoginEvent.cuidType` используется строка `"phone_hash"`.

## SDK-managed режим

Если `setUser(...)` не вызывать:

- `uid`, если он возвращён сервером, сохраняется в `UserDefaults`;
- `ses`, если он возвращён сервером, обновляется из ответов backend и хранится только в памяти процесса;
- последующие запросы используют эти значения автоматически.

После логина рекомендуется отправить `LoginEvent`, чтобы связать анонимный и авторизованный профили.

## Ограничение setUser

Если вам нужен внешний ID в просмотрах и событиях, задайте его явно:

```swift
GravitySDK.instance.setUser(
    userId: "external-user-id",
    sessionId: "session-id"
)
```

`userId` передаётся как `user.custom`, а не заменяет `uid`; `sessionId` задаёт `user.ses`. В iOS 1.0.6 эти значения используются для `/visit` и `/event`. Методы `getContentBySelector`, `getContentByGroupSelector` и `getContentByCampaignId` не передают ручного пользователя в repository и используют кэшированные `uid`/`ses`. Поэтому `setUser` не обеспечивает единую ручную идентификацию всех запросов.

Для единой идентификации просмотров, событий и контента используйте SDK-managed режим с `LoginEvent`. При `Options(isReturnUserInfo: true)` SDK запрашивает объект `user`; без него идентификаторы обновятся только если сервер всё равно вернул `user`.

## Выход и смена аккаунта

В публичном API нет `logout`, `resetUser` или возврата из ручного режима через `setUser(nil)`. Не заменяйте выход из аккаунта повторной инициализацией SDK: repository сохраняет свой кэш идентификаторов. Если нужен полный сброс профиля при смене аккаунта, согласуйте сценарий интеграции.

## `LoginEvent`

```swift
let login = LoginEvent(
    cuid: sha256PhoneHash,
    cuidType: "phone_hash"
)
```
Отправляйте login/signup после успешной авторизации, с тем же CUID, что в других каналах. [Как отправлять события](./events.md).
