# Постоянный ID устройства (Keychain)

Модуль `PushwooshKeychain` обеспечивает постоянную идентификацию устройства (HWID), которая сохраняется после переустановки приложения. Это полезно для сценариев тестирования и разработки, когда необходимо сохранять один и тот же идентификатор устройства даже после переустановки приложения.

<Aside type="note">
Доступно начиная с **SDK версии 7.0.16**.
</Aside>

## Как это работает

По умолчанию iOS генерирует новый `identifierForVendor` (IDFV) при каждой переустановке приложения, что приводит к регистрации нового HWID в Pushwoosh. Модуль `PushwooshKeychain` сохраняет HWID в iOS Keychain, который сохраняется между переустановками приложения.

### Определение среды

Модуль автоматически определяет среду приложения и ведет себя по-разному:

| Среда | Постоянный HWID |
|---|---|
| Симулятор | Включен |
| Debug/Development | Включен |
| TestFlight | Включен |
| App Store | **Отключен** |

<Aside type="caution" title="Важно">
Модуль **автоматически отключается** в сборках для App Store для соответствия требованиям конфиденциальности. Это гарантирует, что пользователи в производственной среде всегда получают новый HWID при переустановке вашего приложения.

Если вы предпочитаете вообще не включать этот модуль в ваше производственное приложение, вы можете безопасно удалить `PushwooshKeychain` из конфигурации релизной сборки или использовать условную компоновку только для сборок Debug/TestFlight.
</Aside>

## Установка

### Swift Package Manager

Добавьте `PushwooshKeychain` в ваш таргет при интеграции Pushwoosh SDK:

1. В Xcode перейдите в **File → Add Package Dependencies**
2. Введите URL пакета: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`
3. Выберите `PushwooshKeychain` в дополнение к обязательным фреймворкам

<Tabs>
<TabItem label="Обязательные фреймворки">
* `PushwooshFramework`
* `PushwooshCore`
* `PushwooshBridge`
</TabItem>
<TabItem label="Опциональные фреймворки">
* `PushwooshKeychain` — Постоянный ID устройства
* `PushwooshLiveActivities` — Поддержка Live Activities
* `PushwooshVoIP` — VoIP push-уведомления
* `PushwooshForegroundPush` — Пользовательские уведомления в активном режиме
</TabItem>
</Tabs>

### CocoaPods

Добавьте подспецификацию Keychain в ваш `Podfile`:

```ruby
target 'MyApp' do
  use_frameworks!

  pod 'PushwooshXCFramework'
  pod 'PushwooshXCFramework/PushwooshKeychain'
end
```

Затем выполните:

```bash
pod install
```

## Использование

**Никаких изменений в коде не требуется.** Как только вы добавите модуль `PushwooshKeychain` в свой проект, он будет работать автоматически:

1. При первом запуске приложения модуль генерирует HWID и сохраняет его в Keychain
2. При последующих запусках (включая после переустановки) модуль извлекает сохраненный HWID
3. SDK использует этот постоянный HWID для регистрации устройства в Pushwoosh

## Сценарии использования

Модуль `PushwooshKeychain` особенно полезен для:

- **QA-тестирования** — Сохранение одного и того же идентификатора устройства при многократных установках приложения во время тестирования
- **Разработки** — Сохранение постоянного таргетинга на устройство во время итераций над вашим приложением
- **Бета-тестирования в TestFlight** — Отслеживание одних и тех же бета-тестеров при обновлениях и переустановках приложения

<Aside type="tip">
Поскольку модуль отключен в сборках для App Store, вам не нужно включать его условно — его безопасно поставлять с вашим производственным приложением.
</Aside>

## Устранение неполадок

### Проверка активности модуля

Проверьте логи консоли Xcode при запуске вашего приложения. Вы должны увидеть лог-сообщение, подобное этому:

```
[Pushwoosh] Detected environment: Debug. Persistent HWID: ENABLED
```

или

```
[Pushwoosh] Detected environment: App Store. Persistent HWID: DISABLED
```

### Очистка сохраненного HWID

Если вам нужно сбросить постоянный HWID во время разработки, вы можете вызвать:

<Tabs>
<TabItem label="Swift">
```swift
import PushwooshFramework

// Очистить сохраненный HWID из Keychain
Pushwoosh.Keychain.clearPersistentHWID()
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
@import PushwooshFramework;

// Очистить сохраненный HWID из Keychain
[Pushwoosh.Keychain clearPersistentHWID];
```
</TabItem>
</Tabs>

<Aside type="note">
После очистки при следующем запуске приложения будет сгенерирован и сохранен новый HWID.
</Aside>