Syntax für native In-App-Vorlagen
Native In-Apps werden direkt vom SDK gerendert. Es ist kein WebView beteiligt. Anstelle einer index.html-Seite enthält die ZIP-Ressource eine native-config.json-Datei, die die Nachricht als strukturierte Daten beschreibt (Layout-Typ, Texte, Farben, Bilder, Schaltflächen). Das SDK liest diese Datei und zeichnet die entsprechende native Ansicht, was flüssigere Animationen und eine bessere Leistung als eine eingebettete Webseite ermöglicht.
Diese Anleitung dokumentiert das native-config.json-Schema: Felder, Typen und Beispiele für jeden Anzeigetyp. Informationen zum klassischen HTML-basierten Format finden Sie unter Syntax für Rich-Media-Vorlagen.
Voraussetzungen
Anchor link toNative In-Apps erfordern:
- iOS: SDK 7.2.0 oder neuer (7.2.1+ für Banner, Karussell und Sheet)
- Android: SDK 6.10.0 oder neuer (6.10.1+ für Banner, Karussell und Sheet)
Noch ist nicht jeder Anzeigetyp auf beiden Plattformen verfügbar. Überprüfen Sie die Plattformunterstützung, bevor Sie sich auf ein bestimmtes Format verlassen.
Plattformunterstützung
Anchor link to| Anzeigetyp | iOS | Android |
|---|---|---|
| modal | ✅ 7.2.0+ | ✅ 6.10.0+ |
| fullscreen | ✅ 7.2.0+ | ✅ 6.10.0+ |
| stories | ✅ 7.2.0+ | ✅ 6.10.0+ |
| banner | ✅ 7.2.1+ | ✅ 6.10.1+ |
| carousel | ✅ 7.2.1+ | ✅ 6.10.1+ |
| sheet | ✅ 7.2.1+ | ✅ 6.10.1+ |
| video | ✅ | Noch nicht verfügbar |
| pip | ✅ | Noch nicht verfügbar |
| scratchcard | ✅ | Noch nicht verfügbar |
| spinwheel | ✅ | Noch nicht verfügbar |
Vorlagenstruktur
Anchor link toEine native In-App-Vorlage ist ein ZIP-Archiv, genau wie eine reguläre Rich-Media-Vorlage, außer dass das Stammverzeichnis eine native-config.json-Datei anstelle von index.html enthält:
<template>.zip├── native-config.json ← erforderlich, Layout und Inhalt├── pushwoosh.json ← optional, Lokalisierung (siehe unten)Bilder und Videos, auf die von native-config.json verwiesen wird (image, poster, fallback, url bei pip/video), müssen absolute HTTPS-URLs sein. Das SDK lädt sie über das Netzwerk. Es liest keine lokalen Dateien aus dem Archiv.
Die Konfiguration selbst ist ein einzelnes JSON-Objekt:
{ "displayType": "<type>", "<type>": { /* Inhaltsblock für diesen Typ */ } }displayType wählt eines der zehn unten aufgeführten Formate aus. Das Objekt unter dem entsprechenden Schlüssel enthält den Inhalt dieses Formats. Eine Konfiguration mit einem unbekannten displayType, einem fehlenden Inhaltsblock oder einer leeren erforderlichen Liste (items für carousel/stories, segments für spinwheel) ist ungültig. Das SDK überspringt die Anzeige, anstatt ein fehlerhaftes Layout zu rendern.
Zustellungseinstellungen (Start-/Enddaten und Frequency Capping) sind nicht Teil von native-config.json. Sie werden genauso konfiguriert wie für jede andere In-App, im Schritt Anzeigeeinstellungen der Kampagne.
Frequency Capping erfordert zusätzlich eine explizite SDK-seitige Aktivierung, um bei nativen In-Apps wirksam zu werden. Siehe SDK-Integration.
Farben
Anchor link toJeder Farbwert ist eine CSS-Hex-Zeichenfolge: #RGB, #RGBA, #RRGGBB oder #RRGGBBAA. Das führende # ist in allen vier Formen erforderlich.
Gemeinsame Bausteine
Anchor link toDiese kleineren Objekte werden in mehreren Anzeigetypen wiederverwendet.
Text
Anchor link to| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
text | string | ja | Der Textinhalt |
color | string | ja | Textfarbe |
{ "text": "Drehen Sie für einen Werkstatt-Vorteil", "color": "#FFFFFFFF" }Border
Anchor link to| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
color | string | ja | Randfarbe |
radius | number | ja | Eckenradius, in Punkten |
{ "color": "#0E72E5FF", "radius": 12 }Cover
Anchor link toEin optionales Bild über einer Hintergrundfarbe. Wird von fullscreen und scratchcard verwendet.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
image | string | nein | Cover-Bild-URL |
background | string | ja | Hintergrundfarbe, die unter (oder anstelle von) dem Bild angezeigt wird |
{ "image": "https://example.com/cover.jpg", "background": "#1A1A1EFF" }Action
Anchor link toEine diskriminierte Union auf type:
| Variante | Felder | Beschreibung |
|---|---|---|
{ "type": "close" } | Keine | Schließt die In-App |
{ "type": "url", "url": string } | url erforderlich | Öffnet eine URL oder einen Deep Link |
{ "type": "url", "url": "pushwoosh://sale" }Button
Anchor link to| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
text | Text | ja | Schaltflächenbeschriftung |
background | string | ja | Füllfarbe der Schaltfläche |
border | Border | ja | Rand der Schaltfläche |
action | Action | ja | Aktion, die beim Tippen ausgelöst wird |
spinButton (spinwheel) und revealButton (scratchcard) verwenden die gleiche Form ohne action. Ihr Verhalten (das Rad drehen, die Karte aufdecken) ist integriert.
{ "text": { "text": "Testfahrt buchen", "color": "#FFFFFFFF" }, "background": "#0E72E5FF", "border": { "color": "#0E72E5FF", "radius": 12 }, "action": { "type": "url", "url": "pushwoosh://sale" }}Reward
Anchor link toDas Preisfeld, das von scratchcard und spinwheel angezeigt wird. Eine gültige Belohnung hat einen title oder einen code.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
title | Text | nein | Überschrift der Belohnung |
message | Text | nein | Beschreibung der Belohnung |
code | string | nein | Promo-Code, wird mit einer Kopieren-Schaltfläche gerendert |
button | Button | nein | Bestätigungsschaltfläche mit eigener Aktion |
{ "title": { "text": "20% Rabatt auf Aufbereitung", "color": "#111111FF" }, "message": { "text": "Gültig für jede Komplettaufbereitung in diesem Monat.", "color": "#555555FF" }, "code": "APEX20", "button": { "text": { "text": "Aufbereitung buchen", "color": "#FFFFFFFF" }, "background": "#B3227CFF", "border": { "color": "#B3227CFF", "radius": 12 }, "action": { "type": "url", "url": "pushwoosh://detailing" } }}Anzeigetypen
Anchor link tobanner
Anchor link toEine kompakte Leiste, die am oberen oder unteren Bildschirmrand angedockt ist.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
position | top | bottom | ja | Bildschirmrand |
background | string | ja | Hintergrundfarbe der Leiste |
image | string | nein | Miniaturbild auf der linken Seite |
title | Text | nein | Einzeiliger Titel, mit Auslassungspunkten gekürzt |
message | Text | nein | Haupttext, bis zu 2 Zeilen |
action | Action | ja | Wird ausgelöst, wenn die Leiste selbst angetippt wird |
autoDismiss | number | nein | Automatisches Schließen nach dieser Anzahl von Sekunden. Weglassen, um sie bis zum Schließen beizubehalten |
{ "displayType": "banner", "banner": { "showClose": true, "position": "bottom", "background": "#4B5057FF", "image": "https://example.com/thumb.jpg", "title": { "text": "Alpine A110 gerade eingetroffen", "color": "#FFFFFFFF" }, "message": { "text": "Die Ikone des Leichtgewichts – tippen, um den Build zu sehen", "color": "#FFFFFFFF" }, "action": { "type": "url", "url": "pushwoosh://product/x6f" }, "autoDismiss": 6 }}carousel
Anchor link toEin bildschirmfüllender, wischbarer Satz von Karten mit Seitenindikator-Punkten.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
items | Item[] | ja | Karten (mindestens 1) |
Karussell-Element:
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
title | Text | nein | Kartentitel |
message | Text | nein | Kartenuntertitel |
image | string | nein | Kartenbild |
action | Action | nein | Wird ausgelöst, wenn die Karte angetippt wird |
{ "displayType": "carousel", "carousel": { "showClose": true, "items": [ { "image": "https://example.com/card-1.jpg", "title": { "text": "AMG GT R", "color": "#FFFFFFFF" }, "message": { "text": "585 PS Biturbo V8 – gerade eingetroffen", "color": "#FFFFFFFF" }, "action": { "type": "url", "url": "pushwoosh://product/n6fx" } }, { "image": "https://example.com/card-2.jpg", "title": { "text": "Alpine A110", "color": "#FFFFFFFF" }, "message": { "text": "Ikone des Leichtgewichts – begrenzte Zuteilung", "color": "#FFFFFFFF" }, "action": { "type": "url", "url": "pushwoosh://product/x6f" } } ] }}fullscreen
Anchor link toEin randloses Cover-Bild mit Text und Schaltflächen darüber.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
cover | Cover | ja | Hintergrundbild und -farbe |
title | Text | nein | Titel |
message | Text | nein | Haupttext |
buttons | Button[] | ja | Schaltflächen am unteren Rand (kann leer sein) |
{ "displayType": "fullscreen", "fullscreen": { "showClose": true, "cover": { "image": "https://example.com/hero.jpg", "background": "#1A1A1EFF" }, "title": { "text": "Pures Maranello", "color": "#FFFFFFFF" }, "message": { "text": "Das springende Pferd, neu interpretiert.", "color": "#EBEBEBFF" }, "buttons": [ { "text": { "text": "Jetzt reservieren", "color": "#FFFFFFFF" }, "background": "#0E72E5FF", "border": { "color": "#0E72E5FF", "radius": 8 }, "action": { "type": "url", "url": "pushwoosh://sale" } }, { "text": { "text": "Nicht jetzt", "color": "#FFFFFFFF" }, "background": "#00000000", "border": { "color": "#FFFFFF99", "radius": 8 }, "action": { "type": "close" } } ] }}modal
Anchor link toEine zentrierte Karte.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
dimBackground | boolean | ja | Den Bildschirm hinter der Karte abdunkeln |
background | string | ja | Hintergrundfarbe der Karte |
image | string | nein | Cover-Bild |
title | Text | nein | Titel |
message | Text | nein | Haupttext |
buttons | Button[] | ja | Schaltflächen unter dem Text (kann leer sein) |
{ "displayType": "modal", "modal": { "showClose": true, "dimBackground": true, "background": "#FFFFFFFF", "image": "https://example.com/cover.jpg", "title": { "text": "Der GT R ist eingetroffen", "color": "#4B5057FF" }, "message": { "text": "585 PS – jetzt im Showroom.", "color": "#4B5057FF" }, "buttons": [ { "text": { "text": "Testfahrt buchen", "color": "#FFFFFFFF" }, "background": "#0E72E5FF", "border": { "color": "#0E72E5FF", "radius": 12 }, "action": { "type": "url", "url": "pushwoosh://sale" } }, { "text": { "text": "Nicht jetzt", "color": "#4B5057FF" }, "background": "#FFFFFFFF", "border": { "color": "#4B5057FF", "radius": 12 }, "action": { "type": "close" } } ] }}Ein schwebendes Bild-in-Bild-Videofenster, das an einer Bildschirmecke angedockt ist.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
position | bottom-right | bottom-left | top-right | top-left | ja | Bildschirmecke |
loop | boolean | ja | Wiedergabe in Schleife |
muted | boolean | ja | Stummgeschaltet starten |
url | string | ja | Video-URL |
poster | string | nein | Poster, das vor Beginn der Wiedergabe angezeigt wird |
fallback | string | nein | Bild, das angezeigt wird, wenn das Video nicht abgespielt werden kann |
width | number | ja | Fensterbreite als Prozentsatz der Bildschirmbreite, begrenzt auf 15–70 |
aspectRatio | number | ja | Höhen-Breiten-Verhältnis des Fensters |
borderRadius | number | nein | Eckenradius des Fensters, in Punkten |
action | Action | nein | Wird ausgelöst, wenn das Fenster selbst angetippt wird |
Es gibt keine konfigurierbaren Schaltflächen auf pip. Fenstersteuerelemente (auf Vollbild erweitern, stummschalten, schließen) werden vom System bereitgestellt.
{ "displayType": "pip", "pip": { "showClose": true, "position": "bottom-right", "loop": true, "muted": true, "url": "https://example.com/teaser.mp4", "poster": "https://example.com/poster.jpg", "width": 40, "aspectRatio": 0.5625, "action": { "type": "url", "url": "pushwoosh://product/x6f" } }}scratchcard
Anchor link toEine Karte mit der Belohnung, die unter einer kratzbaren Folienschicht verborgen ist.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
background | string | string[] | ja | Hintergrundfarbe der Karte oder Farbverlaufsstopps |
revealThreshold | number | ja | Anteil der Folie, der abgekratzt werden muss (0–1), bevor die Belohnung aufgedeckt wird |
cover | Cover | ja | Die Folienschicht. Ohne ein image wird ein „Hier kratzen“-Hinweis auf der Hintergrundfarbe angezeigt |
revealButton | Button (no action) | nein | „Sofort aufdecken“-Schaltfläche |
title | Text | nein | Titel |
message | Text | nein | Haupttext |
reward | Reward | ja | Der unter der Folie verborgene Preis |
{ "displayType": "scratchcard", "scratchcard": { "showClose": true, "background": ["#3A1C71FF", "#B3227CFF", "#E0503AFF"], "revealThreshold": 0.55, "cover": { "background": "#C9CDD6FF" }, "revealButton": { "text": { "text": "Ohne Kratzen aufdecken", "color": "#3A1C71FF" }, "background": "#F2DFF5FF", "border": { "color": "#F2DFF5FF", "radius": 10 } }, "title": { "text": "Ihre Treueprämie", "color": "#FFFFFFFF" }, "message": { "text": "Kratzen Sie die Folie frei, um den Werkstatt-Vorteil dieser Woche zu enthüllen.", "color": "#F2DFF5FF" }, "reward": { "title": { "text": "20% Rabatt auf Aufbereitung", "color": "#111111FF" }, "message": { "text": "Gültig für jede Komplettaufbereitung in diesem Monat.", "color": "#555555FF" }, "code": "APEX20", "button": { "text": { "text": "Aufbereitung buchen", "color": "#FFFFFFFF" }, "background": "#B3227CFF", "border": { "color": "#B3227CFF", "radius": 12 }, "action": { "type": "url", "url": "pushwoosh://detailing" } } } }}sheet
Anchor link toEine am unteren Rand angeheftete Karte mit einem Ziehgriff.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
dimBackground | boolean | ja | Den Bildschirm hinter dem Sheet abdunkeln |
background | string | ja | Hintergrundfarbe des Sheets |
image | string | nein | Cover-Bild |
title | Text | nein | Titel |
message | Text | nein | Haupttext |
buttons | Button[] | ja | Schaltflächen unter dem Text (kann leer sein) |
{ "displayType": "sheet", "sheet": { "showClose": true, "dimBackground": true, "background": "#FFFFFFFF", "image": "https://example.com/cover.jpg", "title": { "text": "Ihr Angebot ist fertig", "color": "#000000FF" }, "message": { "text": "Garantierter Ankauf für Ihren A110: 68.500 $.", "color": "#000000FF" }, "buttons": [ { "text": { "text": "Garantiertes Angebot erhalten", "color": "#FFFFFFFF" }, "background": "#0E72E5FF", "border": { "color": "#0E72E5FF", "radius": 12 }, "action": { "type": "url", "url": "pushwoosh://sale" } } ] }}spinwheel
Anchor link toEin Glücksrad mit gewichteten Segmenten und einer zentralen Naben-Schaltfläche.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
background | string | string[] | ja | Hintergrundfarbe der Karte oder Farbverlaufsstopps |
winIndex | number | ja | Index (0-basiert) des gewinnenden Segments |
spinButton | Button (no action) | ja | Zentrale Naben-Schaltfläche |
title | Text | nein | Titel |
message | Text | nein | Haupttext |
reward | Reward | ja | Belohnung für den gewinnenden Dreh (Fallback für Segmente ohne eigene) |
loseTitle | Text | nein | Überschrift, die bei einem Verlust angezeigt wird |
segments | Segment[] | ja | Radsegmente (SDK erwartet 2–12) |
Segment:
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
message | Text | ja | Segmentbeschriftung |
color | string | nein | Segmentfarbe. Weglassen für eine Fallback-Palette, die um das Rad herum angewendet wird |
weight | number | ja | Relative Segmentgröße |
reward | Reward | nein | Segmentspezifische Belohnung |
{ "displayType": "spinwheel", "spinwheel": { "showClose": true, "background": ["#1B1B46FF", "#5B2B8FFF", "#B0338AFF"], "winIndex": 1, "spinButton": { "text": { "text": "DREHEN", "color": "#1B1B46FF" }, "background": "#F2C94CFF", "border": { "color": "#D9A02BFF", "radius": 36 } }, "title": { "text": "Drehen Sie für einen Werkstatt-Vorteil", "color": "#FFFFFFFF" }, "message": { "text": "Ein Dreh – jedes Feld gewinnt diese Woche.", "color": "#E3D9F2FF" }, "reward": { "title": { "text": "Sie haben einen Werkstatt-Vorteil gewonnen!", "color": "#FFFFFFFF" }, "code": "APEXPERK", "button": { "text": { "text": "Einlösen", "color": "#FFFFFFFF" }, "background": "#5B2B8FFF", "border": { "color": "#5B2B8FFF", "radius": 12 }, "action": { "type": "close" } } }, "segments": [ { "message": { "text": "5% Rabatt", "color": "#FFFFFFFF" }, "color": "#5856D6FF", "weight": 1 }, { "message": { "text": "20% Rabatt", "color": "#FFFFFFFF" }, "color": "#30B0C7FF", "weight": 1, "reward": { "title": { "text": "20% Rabatt auf Ihren nächsten Service", "color": "#FFFFFFFF" }, "code": "SPIN20", "button": { "text": { "text": "Service-Deal einlösen", "color": "#FFFFFFFF" }, "background": "#30B0C7FF", "border": { "color": "#30B0C7FF", "radius": 12 }, "action": { "type": "url", "url": "pushwoosh://service" } } } }, { "message": { "text": "Gratis Wäsche", "color": "#FFFFFFFF" }, "color": "#FF2D55FF", "weight": 1 } ] }}stories
Anchor link toBildschirmfüllende Folien mit Fortschrittsbalken oben, ähnlich wie bei Social-Media-Stories.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
loop | boolean | ja | Nach der letzten Folie von der ersten neu starten |
items | Item[] | ja | Folien (mindestens 1) |
Stories-Element:
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
title | Text | nein | Titel |
message | Text | nein | Untertitel |
image | string | nein | Hintergrundbild der Folie |
buttons | Button[] | ja | CTA-Schaltflächen am unteren Rand (kann leer sein) |
duration | number | ja | Foliendauer, in Sekunden |
{ "displayType": "stories", "stories": { "showClose": true, "loop": false, "items": [ { "image": "https://example.com/slide-1.jpg", "title": { "text": "AMG GT R", "color": "#FFFFFFFF" }, "message": { "text": "Das Special der Grünen Hölle", "color": "#FFFFFFFF" }, "buttons": [ { "text": { "text": "Ihren konfigurieren", "color": "#FFFFFFFF" }, "background": "#0F0F0FFF", "border": { "color": "#0F0F0FFF", "radius": 26 }, "action": { "type": "url", "url": "pushwoosh://product/n6fx" } } ], "duration": 4 }, { "image": "https://example.com/slide-2.jpg", "title": { "text": "Alpine A110", "color": "#FFFFFFFF" }, "message": { "text": "Die wiedergeborene Legende des Leichtgewichts", "color": "#FFFFFFFF" }, "buttons": [], "duration": 4 } ] }}video
Anchor link toBildschirmfüllendes Video mit Text und Schaltflächen darüber.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
showClose | boolean | ja | Eine Schließen-Schaltfläche (✕) anzeigen |
loop | boolean | ja | Wiedergabe in Schleife |
muted | boolean | ja | Stummgeschaltet starten |
url | string | ja | Video-URL (HLS oder MP4) |
poster | string | nein | Poster, das vor Beginn der Wiedergabe angezeigt wird |
fallback | string | nein | Bild, das angezeigt wird, wenn das Video nicht abgespielt werden kann |
title | Text | nein | Titel |
message | Text | nein | Haupttext |
buttons | Button[] | ja | CTA-Schaltflächen am unteren Rand (kann leer sein) |
{ "displayType": "video", "video": { "showClose": true, "loop": true, "muted": true, "url": "https://example.com/reveal.mp4", "poster": "https://example.com/poster.jpg", "title": { "text": "Die Enthüllung", "color": "#FFFFFFFF" }, "message": { "text": "Sehen Sie es in Bewegung, bevor es jemand anderes tut.", "color": "#EBEBEBFF" }, "buttons": [ { "text": { "text": "Die Produktpalette ansehen", "color": "#FFFFFFFF" }, "background": "#0E72E5FF", "border": { "color": "#0E72E5FF", "radius": 14 }, "action": { "type": "url", "url": "pushwoosh://sale" } } ] }}Lokalisierung
Anchor link toNative In-Apps verwenden denselben Lokalisierungsmechanismus wie HTML Rich Media: Zeichenfolgenwerte in native-config.json können {{key|type|default}}-Platzhalter enthalten, und Übersetzungen befinden sich in einer pushwoosh.json-Datei daneben, im selben Format, das in pushwoosh.json hinzufügen beschrieben ist. Ein Platzhalter kann in jedem Zeichenfolgenfeld auf jeder Ebene erscheinen (ein Titel, eine Schaltflächenbeschriftung, eine Bild-URL, eine Aktions-URL).
Dynamischer Inhalt
Anchor link toTextfelder – title, message, Schaltflächen-text, reward.title/reward.message und Element-/Segment-message – akzeptieren auch dynamischen Inhalt und Liquid-Syntax: dieselben {Tag|modifier|default}-Kurzschreibweisen und {% %}/{{ }}-Liquid-Tags, die in Push- und E-Mail-Inhalten verwendet werden. Pushwoosh löst diese pro Empfänger auf, bevor die Nachricht gesendet wird, genauso wie bei Push und E-Mail.
Beim Erstellen einer Vorlage im Control Panel Editor für native In-Apps werden eingefügte Token als Chips in der Live-Vorschau gerendert, und Speichern wird blockiert, wenn die Liquid-Syntax eines Textfeldes nicht geparst werden kann.
SDK-Integration
Anchor link toSobald Sie das native In-App-SDK-Modul zu Ihrer App hinzufügen, werden Nachrichten automatisch angezeigt. Es ist kein zusätzlicher Code erforderlich, um Nachrichten anzuzeigen, die durch einen Push, eine Customer Journey, postEvent oder den Posteingang ausgelöst werden.
Das SDK stellt auch eine kleine API für die manuelle Steuerung zur Verfügung:
- iOS:
Pushwoosh.inApp(ModulPushwooshInApp) - Android:
PushwooshInAppUi(Modulpushwoosh-inapp-ui)
| Fähigkeit | iOS | Android |
|---|---|---|
| Eine Konfiguration direkt anzeigen (Testen/manuelle Verwendung) | Pushwoosh.inApp.present(config) | PushwooshInAppUi.present(configJson) |
| Lebenszyklus und Klicks beobachten | delegate (PWInAppMessageDelegate) | delegate (InAppMessageDelegate) |
| Prüfen, ob etwas auf dem Bildschirm ist | isPresenting | isPresenting |
| Alles, was gerade angezeigt wird, schließen | dismiss() | dismiss() |
| Anzeige anhalten / fortsetzen | isPaused | isPaused |
maxDisplays / cooldown Capping erzwingen | setFrequencyCapEnabled(_:) | setFrequencyCapEnabled(...) |
Delegate-Callbacks (alle werden im Hauptthread ausgelöst): shouldDisplay (geben Sie false zurück, um eine Nachricht zu unterdrücken, bevor sie angezeigt wird, zum Beispiel auf einem Checkout-Bildschirm), willPresent, didPresent, didClose und clickedAction (wird ausgelöst, wenn der Benutzer eine url-Aktion antippt, bevor die URL geöffnet wird).
iOS meldet zusätzlich rewardRevealed und rewardClaimed für die gamifizierten scratchcard- und spinwheel-Vorlagen.
// iOSPushwoosh.inApp.delegate = selfPushwoosh.inApp.setFrequencyCapEnabled(true)// AndroidPushwooshInAppUi.delegate = thisPushwooshInAppUi.setFrequencyCapEnabled(true)