Zum Inhalt springen

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 to

Fügen Sie das Kotlin-Plugin und die beiden Pushwoosh-Module zur build.gradle-Datei Ihrer App hinzu:

build.gradle
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:

proguard-rules.pro
-keep public class com.pushwoosh.inbox.PushwooshInboxPlugin {
*;
}

Die Inbox anzeigen

Anchor link to

Prä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 to

Inbox 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 = true

Wenn 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.

displayTypeErscheinungsbildErforderliches Payload-FeldFällt zurück auf
bannerBild ohne Rand, kein TextBild (Nachrichtensymbol oder data.attachment)classic, wenn kein Bild vorhanden
captionedBild oben, Titel + Textkörper untenBild, Nachrichten-title und contentclassic, wenn Bild, Titel oder Textkörper fehlen
classicSymbol + Titel + Textkörper— (Titel, Textkörper und Symbol erwartet)—
carouselWischbare Galerie mit mehreren BildernNachrichten-title und content, data.carousel (1–5 Folien)classic, wenn keine Folien oder kein Titel/Textkörper vorhanden
videoPoster mit Play-Badge, Vollbild-Player bei Tippendata.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.

Anchor link to

Folien 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.

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

Der Deskriptor befindet sich in data.video: url ist erforderlich, poster ist ein optionales Vorschaubild. Ein Tippen auf das Poster öffnet einen Vollbild-Player.

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

Damit 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 to

Eine Nachricht kann Inline-Call-to-Action-Buttons in data.buttons enthalten:

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

  • action auf dismiss oder markRead gesetzt (Groß-/Kleinschreibung wird nicht beachtet) führt diese Aktion aus.
  • Andernfalls wird eine nicht leere, analysierbare url in eine openURL-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 to

Legen 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 = false

Oder 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 to
PushwooshInbox.unreadMessagesCount { result ->
if (result.isSuccess) {
val count = result.data
} else {
Log.e("App", "Failed to get unread count", result.exception)
}
}