Einrichtung der Pushwoosh Inbox UI für Android
Pushwoosh Inbox UI liefert einen fertigen Android-Inbox-Bildschirm (die „Glocken-Symbol“-App-Inbox) auf Basis des Pushwoosh-Inbox-Backends. Es rendert Nachrichten in einem von fünf Kartentypen, unterstützt Inline-CTA-Buttons und ist offen für Stilanpassungen durch XML-Attribute oder Code.
Voraussetzungen
Anchor link to- Das Basis-Pushwoosh-Android-SDK ist bereits integriert und sendet Pushes.
- Kotlin-Unterstützung in Ihrem App-Modul (
apply plugin: 'kotlin-android').
Bibliothek hinzufügen
Anchor link toFügen Sie das Kotlin-Plugin und die beiden Pushwoosh-Module zur build.gradle-Datei Ihrer App hinzu:
apply plugin: 'kotlin-android'
dependencies { implementation 'com.pushwoosh:pushwoosh-inbox:6.+' implementation 'com.pushwoosh:pushwoosh-inbox-ui:6.+'}Pinnen Sie pushwoosh-inbox und pushwoosh-inbox-ui an dieselbe Version wie Ihre bestehende com.pushwoosh:pushwoosh-Abhängigkeit. Ersetzen Sie + durch die aktuelle Version des Pushwoosh Android SDK.
Wenn Ihre App ProGuard zur Code-Verkleinerung verwendet, behalten Sie die Inbox-Plugin-Klasse bei:
-keep public class com.pushwoosh.inbox.PushwooshInboxPlugin { *;}Die Inbox anzeigen
Anchor link toPräsentieren Sie die Inbox als eigenständigen Bildschirm oder betten Sie sie als Fragment in Ihr eigenes Layout ein.
Als Activity:
startActivity(Intent(this, InboxActivity::class.java))Als Fragment:
supportFragmentManager.beginTransaction() .replace(R.id.inboxContainer, PushwooshInboxUi.createInboxFragment()) .commitAllowingStateLoss()Karten-Typen
Anchor link toInbox UI löst einen Kartentyp pro Nachricht auf. Der Resolver liest displayType aus dem data-Objekt der Push-Payload, das das SDK unter actionParams liefert. Ein displayType, der einen bekannten Kartentyp benennt, rendert immer diesen Typ und fällt nur dann auf classic zurück, wenn die erforderlichen Felder des Typs fehlen. Diese Auflösung hängt nicht von der unten stehenden heuristischen Einstellung ab.
Wenn displayType fehlt, wird die Nachricht als einfache Zeile gerendert, es sei denn, Sie aktivieren die Bild/Text-Heuristik:
PushwooshInboxStyle.richCardsHeuristicEnabled = trueWenn die Heuristik aktiviert ist, rendert ein Bild ohne Titel banner, ein Bild mit Titel und Textkörper rendert captioned, und alles andere fällt auf classic zurück.
displayType | Erscheinungsbild | Erforderliches Payload-Feld | Fällt zurück auf |
|---|---|---|---|
banner | Bild ohne Rand, kein Text | Bild (Nachrichtensymbol oder data.attachment) | classic, wenn kein Bild vorhanden |
captioned | Bild oben, Titel + Textkörper unten | Bild, Nachrichten-title und content | classic, wenn Bild, Titel oder Textkörper fehlen |
classic | Symbol + Titel + Textkörper | — (Titel, Textkörper und Symbol erwartet) | — |
carousel | Wischbare Galerie mit mehreren Bildern | Nachrichten-title und content, data.carousel (1–5 Folien) | classic, wenn keine Folien oder kein Titel/Textkörper vorhanden |
video | Poster mit Play-Badge, Vollbild-Player bei Tippen | data.video (url + optional poster) | classic, wenn kein Deskriptor vorhanden |
Die Apple-Wallet-Karte aus dem iOS InboxKit hat kein Android-Pendant. Eine Nachricht mit displayType: "wallet" wird auf Android immer als classic gerendert.
Carousel-Karte
Anchor link toFolien befinden sich in data.carousel. Jede Folie benötigt ein image. title (Titel-Overlay) und url (wird bei Tippen geöffnet) sind optional. Eine Folie ohne Bild wird verworfen, und es werden höchstens 5 Folien angezeigt.
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "content": "Swipe through this week's drops", "inbox_days": 7, "data": { "displayType": "carousel", "carousel": [ { "image": "https://cdn.example.com/inbox/1.jpg", "title": "New in", "url": "myapp://product/1" }, { "image": "https://cdn.example.com/inbox/2.jpg", "title": "On sale", "url": "myapp://product/2" } ] }, "platforms": [3] }] }}Video-Karte
Anchor link toDer Deskriptor befindet sich in data.video: url ist erforderlich, poster ist ein optionales Vorschaubild. Ein Tippen auf das Poster öffnet einen Vollbild-Player.
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "content": "Tap to play", "inbox_days": 7, "data": { "displayType": "video", "video": { "url": "https://cdn.example.com/inbox/clip.mp4", "poster": "https://cdn.example.com/inbox/poster.jpg" } }, "platforms": [3] }] }}Benutzerdefinierte Daten aus einer Nachricht lesen
Anchor link toDamit ein Push in der Inbox erscheint, muss die createMessage-Anfrage der Messages API inbox_image, inbox_date oder inbox_days enthalten. Ohne eines dieser Felder wird der Push als reguläre Benachrichtigung zugestellt und erreicht niemals den Inbox-Feed. Freiform-benutzerdefinierte Daten gehören unter data, das das SDK als actionParams auf InboxMessage verfügbar macht:
PushwooshInboxUi.onMessageClickListener = OnInboxMessageClickListener { message -> val params = message.actionParams?.let { JSONObject(it) } val promoId = params?.optString("promo_id") if (!promoId.isNullOrEmpty()) { navigateToPromo(promoId) }}Inline-CTA-Buttons hinzufügen
Anchor link toEine Nachricht kann Inline-Call-to-Action-Buttons in data.buttons enthalten:
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "content": "Tap a button to claim or save", "inbox_image": "https://cdn.example.com/inbox/promo.png", "inbox_days": 7, "data": { "displayType": "captioned", "promo_id": "SUMMER2026", "buttons": [ { "title": "Claim", "url": "https://example.com/promo/SUMMER2026" }, { "title": "Read", "action": "markRead" }, { "title": "Save", "action": "custom", "tag": "save_promo" } ] }, "platforms": [3] }] }}Jeder Button benötigt einen title. Die Auflösung folgt dieser Priorität:
actionaufdismissodermarkReadgesetzt (Groß-/Kleinschreibung wird nicht beachtet) führt diese Aktion aus.- Andernfalls wird eine nicht leere, analysierbare
urlin eineopenURL-Aktion aufgelöst. - Andernfalls wird das Tippen in eine benutzerdefinierte Aktion aufgelöst, und jeder zusätzliche Schlüssel auf dem Button-Objekt wird als dessen Payload an Ihren Listener weitergeleitet.
Fangen Sie Taps von PushwooshInboxUi.onButtonClickListener ab. Geben Sie true zurück, damit das SDK die Standardaktion des Buttons ausführt, false, um sie zu unterdrücken:
PushwooshInboxUi.onButtonClickListener = OnInboxButtonClickListener { message, button -> when (val action = button.action) { is InboxCardButton.Action.OpenUrl -> true InboxCardButton.Action.Dismiss, InboxCardButton.Action.MarkRead -> true is InboxCardButton.Action.Custom -> { when (action.payload.optString("tag")) { "save_promo" -> saveCurrentPromoLocally(message) } true } }}Den Stil anpassen
Anchor link toLegen Sie Farben, Schriftarten und Leer-/Fehlerzustände per Code über PushwooshInboxStyle fest:
PushwooshInboxStyle.accentColor = ContextCompat.getColor(this, R.color.brand_accent)PushwooshInboxStyle.titleColor = ContextCompat.getColor(this, R.color.brand_title)PushwooshInboxStyle.listEmptyText = "Sie haben noch keine Nachrichten"PushwooshInboxStyle.showToolbar = falseOder wenden Sie denselben Satz von Attributen als Theme an, die in attrs.xml aufgeführt sind: inboxAccentColor, inboxTitleColor, inboxBackgroundColor, inboxDefaultIcon und die restlichen Farb- und Erscheinungsbild-Attribute. Beide Ansätze sowie eine vollständige Beispiel-App finden Sie im pushwoosh-inbox-ui-android-sdk InboxSample Repo.
Badge für ungelesene Nachrichten
Anchor link toPushwooshInbox.unreadMessagesCount { result -> if (result.isSuccess) { val count = result.data } else { Log.e("App", "Failed to get unread count", result.exception) }}