# ID de Dispositivo Persistente (Keychain)

El módulo `PushwooshKeychain` proporciona una identificación de dispositivo (HWID) persistente que sobrevive a la reinstalación de la aplicación. Esto es útil para escenarios de prueba y desarrollo donde necesitas mantener la misma identidad de dispositivo incluso después de reinstalar la aplicación.

<Aside type="note">
Disponible a partir de la **versión 7.0.16 del SDK**.
</Aside>

## Cómo funciona

Por defecto, iOS genera un nuevo `identifierForVendor` (IDFV) cada vez que se reinstala una aplicación, lo que resulta en un nuevo HWID registrado en Pushwoosh. El módulo `PushwooshKeychain` almacena el HWID en el Keychain de iOS, que persiste entre reinstalaciones de la aplicación.

### Detección de entorno

El módulo detecta automáticamente el entorno de la aplicación y se comporta de manera diferente:

| Entorno | HWID Persistente |
|---|---|
| Simulador | Habilitado |
| Depuración/Desarrollo | Habilitado |
| TestFlight | Habilitado |
| App Store | **Deshabilitado** |

<Aside type="caution" title="Importante">
El módulo se **deshabilita automáticamente** en las compilaciones de la App Store para cumplir con la privacidad. Esto asegura que los usuarios de producción siempre obtengan un HWID nuevo cuando reinstalen su aplicación.

Si prefieres no incluir este módulo en tu aplicación de producción, puedes eliminar de forma segura `PushwooshKeychain` de tu configuración de compilación de lanzamiento o usar vinculación condicional solo para compilaciones de Depuración/TestFlight.
</Aside>

## Instalación

### Swift Package Manager

Añade `PushwooshKeychain` a tu target al integrar el SDK de Pushwoosh:

1. En Xcode, ve a **File → Add Package Dependencies**
2. Introduce la URL del paquete: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`
3. Selecciona `PushwooshKeychain` además de los frameworks requeridos

<Tabs>
<TabItem label="Frameworks requeridos">
* `PushwooshFramework`
* `PushwooshCore`
* `PushwooshBridge`
</TabItem>
<TabItem label="Frameworks opcionales">
* `PushwooshKeychain` — ID de dispositivo persistente
* `PushwooshLiveActivities` — Soporte para Live Activities
* `PushwooshVoIP` — Notificaciones push VoIP
* `PushwooshForegroundPush` — Notificaciones personalizadas en primer plano
</TabItem>
</Tabs>

### CocoaPods

Añade el subspec de Keychain a tu `Podfile`:

```ruby
target 'MyApp' do
  use_frameworks!

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

Luego ejecuta:

```bash
pod install
```

## Uso

**No se requieren cambios en el código.** Una vez que añades el módulo `PushwooshKeychain` a tu proyecto, funciona automáticamente:

1. En el primer lanzamiento de la aplicación, el módulo genera un HWID y lo almacena en el Keychain
2. En lanzamientos posteriores (incluso después de una reinstalación), el módulo recupera el HWID almacenado
3. El SDK utiliza este HWID persistente para el registro del dispositivo en Pushwoosh

## Casos de uso

El módulo `PushwooshKeychain` es particularmente útil para:

- **Pruebas de QA** — Mantener la misma identidad de dispositivo a través de múltiples instalaciones de la aplicación durante las pruebas
- **Desarrollo** — Mantener una segmentación de dispositivos consistente mientras iteras en tu aplicación
- **Pruebas beta en TestFlight** — Rastrear a los mismos beta testers a través de actualizaciones y reinstalaciones de la aplicación

<Aside type="tip">
Dado que el módulo está deshabilitado en las compilaciones de la App Store, no necesitas incluirlo condicionalmente — es seguro enviarlo con tu aplicación de producción.
</Aside>

## Solución de problemas

### Verificar que el módulo está activo

Revisa los registros de la consola de Xcode cuando se inicie tu aplicación. Deberías ver un mensaje de registro como:

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

o

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

### Limpiar el HWID almacenado

Si necesitas restablecer el HWID persistente durante el desarrollo, puedes llamar a:

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

// Limpia el HWID almacenado del Keychain
Pushwoosh.Keychain.clearPersistentHWID()
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
@import PushwooshFramework;

// Limpia el HWID almacenado del Keychain
[Pushwoosh.Keychain clearPersistentHWID];
```
</TabItem>
</Tabs>

<Aside type="note">
Después de limpiarlo, el próximo lanzamiento de la aplicación generará y almacenará un nuevo HWID.
</Aside>