# Preguntas frecuentes sobre el SDK de iOS

### Preguntas frecuentes sobre la integración de iOS

#### P: ¿Cómo puedo instalar el SDK de Pushwoosh en mi proyecto de iOS?
Puede integrar el SDK de Pushwoosh utilizando Swift Package Manager o CocoaPods.

#### P: ¿Cómo instalo el SDK de Pushwoosh utilizando Swift Package Manager?
En Xcode, navegue a la sección **Package Dependencies** y agregue el paquete utilizando la siguiente URL: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`.

#### P: ¿Cómo instalo el SDK de Pushwoosh utilizando CocoaPods?
Abra el `Podfile` de su proyecto y agregue la línea `pod 'PushwooshXCFramework'`. Luego, ejecute el comando `pod install` en la terminal.

#### P: ¿Qué capacidades necesito agregar a mi proyecto para habilitar las Notificaciones Push?
En la sección Signing & Capabilities de la configuración de su proyecto, necesita agregar las capacidades `Push Notifications` y `Background Modes`. Al agregar `Background Modes`, asegúrese de marcar la casilla para `Remote notifications`.

#### P: ¿Qué capacidad adicional se requiere para las Notificaciones Sensibles al Tiempo (Time Sensitive Notifications)?
Si tiene la intención de usar Notificaciones Sensibles al Tiempo (iOS 15+), también necesita agregar la capacidad `Time Sensitive Notifications`.

#### P: ¿Dónde necesito agregar el código de inicialización de Pushwoosh?
El código de inicialización debe agregarse a su clase `AppDelegate`.

#### P: ¿Qué código de inicialización debo agregar en el AppDelegate de SwiftUI?
Consulte el [ejemplo de código Swift proporcionado para integrar Pushwoosh en un proyecto de SwiftUI](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).


#### P: ¿Qué código de inicialización debo agregar en un AppDelegate estándar de Swift?
Consulte el [ejemplo de código Swift proporcionado para integrar Pushwoosh en un proyecto estándar de Swift](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).

#### P: ¿Qué código de inicialización debo agregar en un AppDelegate de Objective-C?
Consulte el [ejemplo de código Objective-C proporcionado para integrar Pushwoosh en un proyecto de Objective-C](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).

#### P: ¿Qué claves necesito agregar a mi archivo Info.plist?
Necesita agregar la clave `Pushwoosh_APPID` establecida con su Código de Aplicación y la clave `PW_API_TOKEN` establecida con su Token de API en el archivo `Info.plist` de su aplicación.

#### P: ¿Cuál es el propósito del seguimiento de la entrega de mensajes?
Pushwoosh admite el seguimiento de eventos de entrega para notificaciones push utilizando la Notification Service Extension.

#### P: ¿Cómo agrego una Notification Service Extension a mi proyecto?
En Xcode, vaya a **File** > **New** > **Target...**, elija **Notification Service Extension** y presione **Next**. Ingrese un nombre de destino y presione **Finish**. Cuando se le pida activarlo, presione **Cancel**.

#### P: ¿Cómo agrego el SDK de Pushwoosh a la Notification Service Extension?
Agregue el [fragmento de código Swift u Objective-C proporcionado](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#add-pushwoosh-sdk-to-notification-service-extension) al archivo principal `.swift` o `.m` de su Notification Service Extension. Este código utiliza `PWNotificationExtensionManager` para manejar la solicitud de notificación.

#### P: ¿Cuál es el propósito de los App Groups?
La capacidad de App Groups es necesaria para permitir que la Notification Service Extension se comunique con la aplicación principal.

#### P: ¿Cómo habilito los App Groups para mi objetivo principal y la Notification Service Extension?
Para ambos objetivos, vaya a **Signing & Capabilities**, agregue la capacidad **App Groups** y cree un nuevo grupo presionando el botón +. Asegúrese de que el nombre del grupo comience con `group.` y use el mismo nombre de grupo para ambos objetivos.

#### P: ¿Qué claves necesito agregar al Info.plist de mi objetivo principal para los App Groups?
En el `Info.plist` de su objetivo principal, agregue la clave `PW_APP_GROUPS_NAME` y establezca su valor con el nombre de su grupo de App Groups.

#### P: ¿Qué claves necesito agregar al Info.plist de mi Notification Service Extension?
En el `Info.plist` de su Notification Service Extension, agregue la clave `PW_APP_GROUPS_NAME` (establecida con el nombre de su App Groups) y la clave `Pushwoosh_APPID` (establecida con su Código de Aplicación).

#### P: ¿Cómo verifico la integración de Pushwoosh?
Después de compilar y ejecutar su proyecto, vaya al Panel de Control de Pushwoosh y envíe una notificación push a su aplicación. Debería ver aparecer la notificación en su dispositivo.

#### P: ¿Cuáles son los dos callbacks principales para manejar las notificaciones push en el SDK de Pushwoosh?
Los dos callbacks principales son `onMessageReceived` y `onMessageOpened`.

#### P: ¿Cuándo se invoca el callback `onMessageReceived`?
El método `onMessageReceived` se llama cuando la aplicación recibe una notificación push.

#### P: ¿Cuándo se invoca el callback `onMessageOpened`?
El método `onMessageOpened` se llama cuando el usuario interactúa y abre una notificación push.

#### P: ¿Cómo puedo acceder al payload de una notificación push recibida o abierta?
Se puede acceder al payload de un objeto `PWMessage` (pasado a los callbacks `onMessageReceived` y `onMessageOpened`) a través de su propiedad `payload`.

#### P: ¿Cómo puedo establecer un ID de usuario en Pushwoosh?
Use el método `setUserId(_:)` del objeto `Pushwoosh.sharedInstance()`, pasando el ID del usuario como argumento.

#### P: ¿Cómo puedo establecer la dirección de correo electrónico de un usuario en Pushwoosh?
Use el método `setEmail(_:)` del objeto `Pushwoosh.sharedInstance()`, proporcionando el correo electrónico del usuario.

#### ¿Cómo puedo establecer información adicional del usuario como etiquetas (tags) en Pushwoosh?
Use el método `setTags(_:)` del objeto `Pushwoosh.sharedInstance()`, pasando un diccionario donde las claves son los nombres de las etiquetas y los valores son los valores de etiqueta correspondientes.

#### ¿Cómo puedo rastrear un evento de usuario con atributos adicionales?**
Use el método `postEvent(_:withAttributes:)` de `PWInAppManager.shared()`, proporcionando el nombre del evento (p. ej., `"login"`) y un diccionario de atributos (p. ej., `"name"`, `"last_login"`).

#### P: ¿Cómo puedo rastrear un evento de compra de usuario con detalles del producto?
Use el método `postEvent(_:withAttributes:)` de `PWInAppManager.shared()` con el nombre de evento `"purchase"` y un diccionario que contenga detalles del producto como `"product_id"`, `"product_name"`, `"price"` y `"quantity"`.

#### P: ¿Cómo configuro un delegado para manejar la presentación de rich media?
En su view controller u otra clase apropiada, adáptese al protocolo `PWRichMediaPresentingDelegate` y establezca la propiedad `delegate` de `PWRichMediaManager.shared()` a su instancia conforme.

#### P: ¿Cómo puedo configurar el estilo de presentación de rich media?
Use el objeto `PWModalWindowConfiguration.shared()` para configurar propiedades como la posición de la ventana modal y las animaciones de presentación/ocultación utilizando el método `configureModalWindow(with:present:dismiss:)`.

#### P: ¿A qué información puedo acceder en los métodos del delegado de rich media?**
Los métodos del delegado proporcionan acceso al objeto `PWRichMedia`, que contiene información sobre el contenido de rich media, incluido su `pushPayload`. El método `presentingDidFailForRichMedia:withError:` también proporciona un objeto `Error` que describe el fallo.


### Solución de problemas

<Aside type="caution">
Para fines de balanceo de carga, es posible que necesitemos cambiar los endpoints de la API en su aplicación. Esto sucede automáticamente y es manejado por nuestro SDK. **Por favor, asegúrese de que nada en su aplicación esté bloqueando el acceso a cualquier URL que contenga \*.pushwoosh.com.**
</Aside>

<Aside type="note">
#### Si está detrás de un Firewall o su router WiFi actúa como un Firewall

Si su dispositivo está conectado a Internet a través de WiFi y los mensajes no llegan al dispositivo, por favor **asegúrese de que los puertos de APNs no estén bloqueados por su firewall.**\
Los proveedores de push, los dispositivos iOS y las computadoras Mac a menudo están detrás de firewalls. Para enviar notificaciones, deberá permitir paquetes TCP entrantes y salientes a través del puerto 2195. Los dispositivos y computadoras que se conectan al servicio de push a través de **Wi-Fi necesitarán permitir paquetes TCP entrantes y salientes a través del puerto 5223.**\
El rango de direcciones IP para el servicio de push puede cambiar; se espera que los proveedores se conecten por nombre de host en lugar de por dirección IP. El servicio de push utiliza un esquema de balanceo de carga que produce una dirección IP diferente para el mismo nombre de host. Sin embargo, todo el bloque de direcciones 17.0.0.0/8 está asignado a Apple, por lo que puede especificar ese rango en las reglas de su firewall.
</Aside>

#### P: Error "Su perfil de aprovisionamiento no tiene entrada APS"

Si ve el mensaje de error "Su perfil de aprovisionamiento no tiene entrada APS.", asegúrese de que su perfil de aprovisionamiento sea compatible con push y tenga la cadena `aps-environment` con el valor `production` o `development`. La forma más fácil de verificarlo es abrir el perfil de aprovisionamiento móvil en cualquier editor de texto y buscar la cadena `aps-environment`. Debería estar allí.

Si está, y sigue recibiendo el error, significa que XCode todavía está seleccionando un perfil "no compatible con push". Por favor, asegúrese de firmar con el correcto; a veces, si tiene dos perfiles para el mismo App ID, XCode se confunde y firma con el antiguo.

Los pasos recomendados son:

1. [Eliminar](https://stackoverflow.com/questions/18923095/delete-provisioning-profile-from-xcode-5) todos los perfiles de XCode;
2. Agregar el único y nuevo perfil;
3. Recompilar la aplicación.

#### P: ¿Cómo se ven el push token de iOS y el hwid?

Los push tokens de dispositivos iOS son cadenas con 64 símbolos hexadecimales. Ejemplo de push token:\
`03df25c845d460bcdad7802d2vf6fc1dfde97283bf75cc993eb6dca835ea2e2f`\
Asegúrese de que los push tokens de iOS que utiliza al dirigirse a dispositivos específicos en sus solicitudes de API estén en **minúsculas**.

Pushwoosh utiliza IDFV como el HWID del dispositivo. Tenga en cuenta que puede cambiar en caso de que el usuario reinstale todas las aplicaciones de un proveedor específico.

`CBAF8ED1-17FB-49A3-73BD-DC79B63AEF93`

#### P: ¿Cómo activo y desactivo el banner cuando mi aplicación se está ejecutando?

Por defecto, nuestro último SDK de iOS muestra el banner de notificación cuando la aplicación se está ejecutando en primer plano.\
Puede controlar este comportamiento cambiando las siguientes banderas en el Info.plist:

Bandera `Pushwoosh_ALERT_TYPE` – tipo cadena, los valores son:

* `BANNER` – valor predeterminado, muestra una alerta de banner en la aplicación
* `ALERT` – notificación de alerta
* `NONE` – no mostrar notificaciones cuando la aplicación está en primer plano

#### P: ¿Cómo obtengo el push token de mi dispositivo iOS para usarlo en Dispositivos de Prueba?

Para obtener el push token de su dispositivo iOS,

1. Abra Xcode => Devices & Simulators;
2. Conecte el dispositivo de prueba a su computadora;
3. Seleccione su dispositivo conectado en la lista de dispositivos a la izquierda;
4. Haga clic en el botón Open Console.

<img src="/ios-push-notifications-ios-faq-1.webp" alt=""/>

Inicie la aplicación para la cual necesita el push token del dispositivo y localice su push token de 64 caracteres hexadecimales en la línea "Registered for push notifications":

<img src="/ios-push-notifications-ios-faq-2.webp" alt=""/>

#### P: ¿Por qué los badges no se borran después de desinstalar mi aplicación y reinstalarla en un corto período de tiempo?

Es un comportamiento esperado: los badges son manejados por el propio iOS y sus valores se almacenan en las preferencias de la aplicación, que no se eliminan instantáneamente cuando desinstala su aplicación. El valor de un badge permanece allí durante algún tiempo en caso de reinstalación inmediata, lo que resulta en que se muestren los mismos badges después de reinstalar una aplicación.