Configuración de Pushwoosh InboxKit para iOS
Disponible desde el SDK de iOS 7.0.40.
Pushwoosh InboxKit ofrece una pantalla de bandeja de entrada moderna de UIKit sobre el backend de bandeja de entrada existente. Tres diseños de celda predeterminados cubren las formas comunes de tarjetas de contenido al estilo de Braze, los botones CTA en línea manejan las interacciones más comunes y toda la superficie está abierta para la subclasificación si necesita un aspecto personalizado.

Feed predeterminado de InboxKit con tarjetas de banner, con leyenda y clásicas.
Cuándo usar InboxKit
Anchor link toUse InboxKit para cualquier nueva integración de iOS. Es el reemplazo recomendado para el módulo Objective-C más antiguo PushwooshInboxUI.
InboxKit le ofrece:
- Tres tipos de celdas integradas — banner, con leyenda, clásica — seleccionadas por mensaje a través de
actionParams["displayType"]desde su payload de push, o forzadas desde el código a través deattributes.forceCellKind. - Botones CTA en línea con una enumeración tipada
PushwooshInboxButtonAction(openURL,dismiss,markRead,custom). El SDK maneja los tres primeros automáticamente; su delegado enrutacustoma su propia lógica. - Soporte para fijar: los mensajes con
actionParams["pinned"] == trueflotan en la parte superior del feed y muestran un glifo de pin. - Deslizar para eliminar, tirar para actualizar, marcar como leído automáticamente al desaparecer — todo conmutable a través de
PushwooshInboxKitAttributes. - Almacenamiento persistente: las eliminaciones y el estado de lectura sobreviven a un reinicio del proceso incluso si la llamada de red aún no ha sido confirmada.
- Una clase base abierta
PushwooshInboxCellpara diseños totalmente personalizados.
El contrato del servidor no ha cambiado — el mismo backend de bandeja de entrada de Pushwoosh, los payloads y las herramientas del panel de control funcionan como antes.
Elija su método de integración
Anchor link to- Configurar InboxKit con Swift Package Manager — recomendado para nuevos proyectos.
- Configurar InboxKit con CocoaPods — para proyectos que ya usan CocoaPods.
Leer datos personalizados de un mensaje
Anchor link toPara que un push aparezca en la bandeja de entrada, la solicitud createMessage de la API de Mensajes debe incluir inbox_image, inbox_date o inbox_days — sin uno de esos campos, el push se entrega como una notificación regular y nunca llega al feed de la bandeja de entrada. Los datos personalizados de formato libre van bajo la clave data, que el SDK entrega al cliente como el parámetro u:
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "ios_title": "Summer sale", "content": "30% off everything — limited time only", "inbox_image": "https://cdn.example.com/inbox/summer.png", "inbox_days": 7, "data": { "promo_id": "SUMMER2026", "screen": "promo_details" }, "ios_root_params": { "displayType": "captioned" }, "platforms": [1] }] }}El SDK expone ese objeto en el mensaje de la bandeja de entrada a través de actionParams. Léalo desde el delegado cuando el usuario toque la fila o un CTA en línea:
extension MyInboxHost: PushwooshInboxKitDelegate {
func inboxKit(_ vc: PushwooshInboxKitViewController, didSelect message: PWInboxMessageProtocol) -> Bool { guard let params = message.actionParams as? [String: Any] else { return true }
// El objeto `data` personalizado llega bajo la clave "u" — // ya sea como un diccionario anidado o como una cadena codificada en JSON, // dependiendo de cómo se construyó el payload en el origen. let custom: [String: Any]? = { if let dict = params["u"] as? [String: Any] { return dict } if let raw = params["u"] as? String, let bytes = raw.data(using: .utf8), let parsed = try? JSONSerialization.jsonObject(with: bytes) as? [String: Any] { return parsed } return nil }()
if let promoId = custom?["promo_id"] as? String { navigateToPromo(promoId) return false // manejamos el toque; el SDK no debe ejecutar la acción predeterminada } return true }}La misma búsqueda actionParams["u"] funciona dentro de inboxKit(_:didTapButton:onMessage:) para los botones CTA en línea. Para los casos de CTA tipados (openURL, dismiss, markRead), el SDK ya realiza la acción predeterminada — devuelva true para mantener ese comportamiento, o false para suprimirlo y ejecutar el suyo propio.
Añadir botones CTA en línea
Anchor link toUn mensaje puede llevar hasta tres botones de llamada a la acción en línea. Los botones se encuentran junto con otros datos personalizados dentro de data como un array buttons. El SDK los renderiza automáticamente dentro de las celdas con leyenda y clásicas:
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "ios_title": "New promo card", "content": "Tap a button to claim or save", "inbox_image": "https://cdn.example.com/inbox/promo.png", "inbox_days": 7, "data": { "promo_id": "SUMMER2026", "buttons": [ { "title": "Claim", "url": "https://example.com/promo/SUMMER2026" }, { "title": "Read", "action": "markRead" }, { "title": "Save", "action": "custom", "tag": "save_promo" } ] }, "ios_root_params": { "displayType": "captioned" }, "platforms": [1] }] }}Cada objeto de botón tiene estos campos:
| Campo | Tipo | Cuándo |
|---|---|---|
title | string | Requerido. Etiqueta visible del botón. |
url | string | Una URL analizable no vacía produce una acción openURL. El SDK la abre a través de UIApplication.shared.open a menos que su delegado la suprima. |
action | string | Token de acción explícito: dismiss (elimina el mensaje del feed), markRead (marca el mensaje como leído) o custom (manejado por el host). No distingue entre mayúsculas y minúsculas. |
| Cualquier otra cosa | any | Cuando action es custom, cada clave en el objeto del botón, excepto title y action, se reenvía a su delegado como el payload personalizado — acuerde una clave con el comercializador (p. ej., tag) y despache sobre ella. |
Prioridad de resolución: primero el token de action explícito, luego url si no está vacío, de lo contrario, el botón cae en custom llevando el payload completo (menos title y action).
Intercepte los toques desde su delegado. La propiedad button.action es la enumeración tipada PushwooshInboxButtonAction:
extension MyInboxHost: PushwooshInboxKitDelegate {
func inboxKit(_ vc: PushwooshInboxKitViewController, didTapButton button: PushwooshInboxButton, onMessage message: PWInboxMessageProtocol) -> Bool { switch button.action { case .openURL(let url): // El comportamiento predeterminado está bien — deje que el SDK abra la URL. return true
case .dismiss, .markRead: // El SDK maneja ambos. Devuelva false si desea anularlo. return true
case .custom(let payload): // Botón personalizado definido por el comercializador. Despache sobre una clave que haya acordado. if let tag = payload["tag"] as? String { switch tag { case "save_promo": saveCurrentPromoLocally(message: message) default: break } } return true // ignorado para custom — el SDK nunca ejecuta una acción predeterminada aquí } }}