Saltar al contenido

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 de InboxKit que muestra tarjetas de banner, con leyenda y clásicas con botones en línea e indicadores de no leído

Feed predeterminado de InboxKit con tarjetas de banner, con leyenda y clásicas.

Cuándo usar InboxKit

Anchor link to

Use 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 de attributes.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 enruta custom a su propia lógica.
  • Soporte para fijar: los mensajes con actionParams["pinned"] == true flotan 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 PushwooshInboxCell para 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

Leer datos personalizados de un mensaje

Anchor link to

Para 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:

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"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 to

Un 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:

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"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:

CampoTipoCuándo
titlestringRequerido. Etiqueta visible del botón.
urlstringUna 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.
actionstringToken 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 cosaanyCuando 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í
}
}
}