Zum Inhalt springen

In-App-Nachrichten anpassen

Erfahren Sie, wie Sie In-App-Nachrichten für das Braze SDK anpassen können. Für fortgeschrittene Styling-Techniken empfehlen wir Ihnen unser Tutorial zur Anpassung des Nachrichtenstylings mithilfe von Schlüssel-Wert-Paaren.

Voraussetzungen

Bevor Sie dieses Feature nutzen können, müssen Sie das Braze Web SDK integrieren.

Angepasste Stile

Die UI-Elemente von Braze sind standardmäßig so gestaltet, dass sie ein neutrales In-App-Nachricht-Erlebnis bieten und die Konsistenz mit anderen mobilen Plattformen von Braze gewährleisten. Die Standardstile von Braze sind in CSS im Braze SDK definiert.

Einstellen eines Standard-Stils

Indem Sie ausgewählte Stile in Ihrer Anwendung außer Kraft setzen, können Sie unsere standardmäßigen In-App-Nachrichtentypen mit Ihren eigenen Hintergrundbildern, Schriftfamilien, Stilen, Größen, Animationen und vielem mehr anpassen.

Im Folgenden finden Sie ein Beispiel für eine Überschreibung, die bewirkt, dass die Kopfzeilen einer In-App-Nachricht kursiv dargestellt werden:

  body .ab-in-app-message .ab-message-header {
    font-style: italic;
  }

In den JSDocs finden Sie weitere Informationen.

Anpassen des Z-Index

In-App-Nachrichten werden standardmäßig über z-index: 9001 angezeigt. Dies lässt sich mit der Initialisierungsoption inAppMessageZIndex konfigurieren, falls Ihre Website Elemente mit höheren Werten stilisiert.

braze.initialize("YOUR-API-KEY", {
    baseUrl: "YOUR-API-ENDPOINT",
    inAppMessageZIndex: 12000
});

Anpassen von Nachrichtenabweisungen

Standardmäßig wird eine In-App-Nachricht durch Drücken der Escape-Taste oder durch einen Klick auf den ausgegrauten Hintergrund der Seite verworfen, wenn sie angezeigt wird. Konfigurieren Sie die Initialisierungsoption requireExplicitInAppMessageDismissal auf true, um dieses Verhalten zu verhindern und einen expliziten Klick auf einen Button zu verlangen, um Nachrichten zu schließen.

import * as braze from "@braze/web-sdk";
braze.initialize("YOUR-API-KEY", {
    baseUrl: "YOUR-API-ENDPOINT",
    requireExplicitInAppMessageDismissal: true
});

Anpassen des Anzeigezeitpunkts

Um das standardmäßige Anzeigeverhalten zu überschreiben, entfernen Sie Aufrufe von braze.automaticallyShowInAppMessages() und verarbeiten Sie Nachrichten in braze.subscribeToInAppMessage(). Registrieren Sie Ihren Callback vor braze.openSession(), damit Sie Nachrichten beim Sitzungsstart abfangen und entscheiden können, ob Sie jede Nachricht anzeigen oder zurückstellen möchten.

Standardmäßig zeigt Braze In-App-Nachrichten an, wenn sie getriggert werden und zur Anzeige berechtigt sind. Wenn Sie ein anderes Verhalten für Ihr App-Erlebnis benötigen, verwenden Sie einen angepassten Callback, um Nachrichten basierend auf Ihrer eigenen Logik zurückzustellen oder anzuzeigen.

Das folgende Beispiel zeigt, wie Sie getriggerte In-App-Nachrichten abonnieren, ausgewählte Nachrichten zurückstellen und zurückgestellte Nachrichten später anzeigen können:

import * as braze from "@braze/web-sdk";

braze.initialize("YOUR-API-KEY", {
    baseUrl: "YOUR-API-ENDPOINT"
});

braze.subscribeToInAppMessage(function (message) {
    // Control-group messages should always be "shown" to log analytics.
    if (message.isControl || message instanceof braze.ControlMessage) {
        braze.showInAppMessage(message);
        return;
    }

    const shouldDefer = true; // Replace with your own display logic

    if (shouldDefer) {
        braze.deferInAppMessage(message);
        return;
    }

    braze.showInAppMessage(message);
});

braze.openSession();

// Later, when your app is ready to display a deferred message:
const deferredMessage = braze.getDeferredInAppMessage();
if (deferredMessage) {
    braze.showInAppMessage(deferredMessage);
}

Weitere Informationen zur Anpassung der Zustellung finden Sie unter:

Um festzulegen, dass Ihre In-App-Nachricht-Links in einem neuen Tab geöffnet werden, setzen Sie die Option openInAppMessagesInNewTab auf true, um zu erzwingen, dass alle Links von In-App-Nachrichten-Klicks in einem neuen Tab oder Fenster geöffnet werden.

braze.initialize('api-key', { openInAppMessagesInNewTab: true} );

Voraussetzungen

Bevor Sie dieses Feature nutzen können, müssen Sie das Android Braze SDK integrieren. Außerdem müssen Sie In-App-Nachrichten einrichten.

Angepasste Manager-Listener einrichten

Während der BrazeInAppMessageManager-Listener die Anzeige und den Lebenszyklus von In-App-Nachrichten automatisch verwalten kann, müssen Sie einen angepassten Manager-Listener implementieren, wenn Sie Ihre Nachrichten vollständig anpassen möchten.

Das Braze SDK enthält eine Standard-Klasse DefaultHtmlInAppMessageActionListener, die verwendet wird, wenn kein angepasster Listener definiert ist, und automatisch die entsprechenden Aktionen ausführt. Wenn Sie mehr Kontrolle darüber benötigen, wie Nutzer:innen mit verschiedenen Buttons in einer angepassten HTML-In-App-Nachricht interagieren, implementieren Sie eine angepasste IHtmlInAppMessageActionListener-Klasse.

Dieser Listener gilt für beide – Nachrichten, die mit angepasstem HTML erstellt wurden, und Nachrichten, die mit dem Drag-and-Drop-Editor (DnD) erstellt wurden. Er gilt nicht für herkömmliche IAMs. Herkömmliche IAMs sind die integrierten, SDK-gerenderten Nachrichtentypen von Braze (zum Beispiel Slideup, Modal und Vollbild), die im ursprünglichen In-App-Nachrichten-Editor mit vordefinierten Layouts erstellt werden. Im Gegensatz zu angepassten HTML- und DnD-IAMs durchlaufen sie nicht den HTML-Action-Listener-Flow.

Wenn Sie einen angepassten IHtmlInAppMessageActionListener festlegen, überschreibt seine Logik das Standard-Klickverhalten für alle DnD-Nachrichten. Bitte stellen Sie sicher, dass Ihr Marketingteam darüber informiert ist, da dies ihre Campaigns auf unerwartete Weise beeinflussen kann.

Schritt 1: Den angepassten Manager-Listener implementieren

Schritt 1.1: IInAppMessageManagerListener implementieren

Erstellen Sie eine Klasse, die IInAppMessageManagerListener implementiert.

Die Callbacks in Ihrem IInAppMessageManagerListener werden auch an verschiedenen Punkten im Lebenszyklus der In-App-Nachricht aufgerufen. Wenn Sie beispielsweise einen angepassten Manager-Listener festlegen, wenn eine In-App-Nachricht von Braze empfangen wird, wird die Methode beforeInAppMessageDisplayed() aufgerufen. Wenn Ihre Implementierung dieser Methode InAppMessageOperation.DISCARD zurückgibt, signalisiert dies Braze, dass die In-App-Nachricht von der Host-App verarbeitet wird und nicht von Braze angezeigt werden soll. Wenn InAppMessageOperation.DISPLAY_NOW zurückgegeben wird, versucht Braze, die In-App-Nachricht anzuzeigen. Diese Methode sollte verwendet werden, wenn Sie die In-App-Nachricht auf eine angepasste Weise anzeigen möchten.

IInAppMessageManagerListener enthält auch Delegate-Methoden für Nachrichten-Klicks und Buttons, die in Fällen wie dem Abfangen einer Nachricht verwendet werden können, wenn ein Button oder eine Nachricht für die weitere Verarbeitung angeklickt wird.

Schritt 1.2: In die IAM-View-Lebenszyklusmethoden einbinden (optional)

Die Schnittstelle IInAppMessageManagerListener enthält In-App-Nachrichten-View-Methoden, die an bestimmten Punkten im Lebenszyklus der In-App-Nachrichten-View aufgerufen werden. Diese Methoden werden in der folgenden Reihenfolge aufgerufen:

  1. beforeInAppMessageViewOpened: Wird aufgerufen, kurz bevor die In-App-Nachricht zur View der Activity hinzugefügt wird. Die In-App-Nachricht ist zu diesem Zeitpunkt noch nicht für die Nutzer:innen sichtbar.
  2. afterInAppMessageViewOpened: Wird aufgerufen, kurz nachdem die In-App-Nachricht zur View der Activity hinzugefügt wurde. Die In-App-Nachricht ist zu diesem Zeitpunkt für die Nutzer:innen sichtbar.
  3. beforeInAppMessageViewClosed: Wird aufgerufen, kurz bevor die In-App-Nachricht aus der View der Activity entfernt wird. Die In-App-Nachricht ist zu diesem Zeitpunkt noch für die Nutzer:innen sichtbar.
  4. afterInAppMessageViewClosed: Wird aufgerufen, kurz nachdem die In-App-Nachricht aus der View der Activity entfernt wurde. Die In-App-Nachricht ist zu diesem Zeitpunkt nicht mehr für die Nutzer:innen sichtbar.

Beachten Sie, dass die Zeitspanne zwischen afterInAppMessageViewOpened und beforeInAppMessageViewClosed diejenige ist, in der die In-App-Nachrichten-View auf dem Bildschirm sichtbar für die Nutzer:innen angezeigt wird.

Erstellen Sie eine Klasse, die IHtmlInAppMessageActionListener implementiert.

Die Callbacks in Ihrem IHtmlInAppMessageActionListener werden aufgerufen, wenn Nutzer:innen eine der folgenden Aktionen innerhalb der HTML-In-App-Nachricht auslösen:

  • Auf den Schließen-Button klicken
  • Ein angepasstes Event auslösen
  • Auf eine URL innerhalb der HTML-In-App-Nachricht klicken
public class CustomHtmlInAppMessageActionListener implements IHtmlInAppMessageActionListener {
  private final Context mContext;

  public CustomHtmlInAppMessageActionListener(Context context) {
    mContext = context;
  }

  @Override
  public void onCloseClicked(IInAppMessage inAppMessage, String url, Bundle queryBundle) {
    Toast.makeText(mContext, "HTML In App Message closed", Toast.LENGTH_LONG).show();
    BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false);
  }

  @Override
  public boolean onCustomEventFired(IInAppMessage inAppMessage, String url, Bundle queryBundle) {
    Toast.makeText(mContext, "Custom event fired. Ignoring.", Toast.LENGTH_LONG).show();
    return true;
  }

  @Override
  public boolean onOtherUrlAction(IInAppMessage inAppMessage, String url, Bundle queryBundle) {
    Toast.makeText(mContext, "Custom url pressed: " + url + " . Ignoring", Toast.LENGTH_LONG).show();
    BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false);
    return true;
  }
}
class CustomHtmlInAppMessageActionListener(private val mContext: Context) : IHtmlInAppMessageActionListener {

    override fun onCloseClicked(inAppMessage: IInAppMessage, url: String, queryBundle: Bundle) {
        Toast.makeText(mContext, "HTML In App Message closed", Toast.LENGTH_LONG).show()
        BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false)
    }

    override fun onCustomEventFired(inAppMessage: IInAppMessage, url: String, queryBundle: Bundle): Boolean {
        Toast.makeText(mContext, "Custom event fired. Ignoring.", Toast.LENGTH_LONG).show()
        return true
    }

    override fun onOtherUrlAction(inAppMessage: IInAppMessage, url: String, queryBundle: Bundle): Boolean {
        Toast.makeText(mContext, "Custom url pressed: $url . Ignoring", Toast.LENGTH_LONG).show()
        BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false)
        return true
    }
}

Schritt 2: Braze anweisen, den angepassten Manager-Listener zu verwenden

Nachdem Sie Ihren IInAppMessageManagerListener erstellt haben, rufen Sie BrazeInAppMessageManager.getInstance().setCustomInAppMessageManagerListener() auf, um BrazeInAppMessageManager anzuweisen, Ihren angepassten IInAppMessageManagerListener anstelle des Standard-Listeners zu verwenden. Tun Sie dies in Ihrer Application.onCreate() vor allen anderen Aufrufen an Braze, damit der angepasste Listener festgelegt wird, bevor In-App-Nachrichten angezeigt werden.

In-App-Nachrichten vor der Anzeige ändern

Wenn eine neue In-App-Nachricht empfangen wird und bereits eine In-App-Nachricht angezeigt wird, wird die neue Nachricht oben auf den Stack gelegt und kann zu einem späteren Zeitpunkt angezeigt werden.

Wenn jedoch keine In-App-Nachricht angezeigt wird, wird die folgende Delegate-Methode in IInAppMessageManagerListener aufgerufen:

@Override
public InAppMessageOperation beforeInAppMessageDisplayed(IInAppMessage inAppMessage) {
  return InAppMessageOperation.DISPLAY_NOW;
}
override fun beforeInAppMessageDisplayed(inAppMessage: IInAppMessage): InAppMessageOperation {
  return InAppMessageOperation.DISPLAY_NOW
}

Der Rückgabewert von InAppMessageOperation() kann steuern, wann die Nachricht angezeigt werden soll. Die empfohlene Verwendung dieser Methode ist, Nachrichten in bestimmten Bereichen der App zu verzögern, indem DISPLAY_LATER zurückgegeben wird, wenn In-App-Nachrichten das App-Erlebnis der Nutzer:innen stören würden.

InAppMessageOperation-Rückgabewert Verhalten
DISPLAY_NOW Die Nachricht wird angezeigt
DISPLAY_LATER Die Nachricht wird auf den Stack zurückgelegt und bei der nächsten verfügbaren Gelegenheit angezeigt
DISCARD Die Nachricht wird verworfen
null Die Nachricht wird ignoriert. Diese Methode sollte NICHT null zurückgeben

Weitere Details finden Sie unter InAppMessageOperation.

Auf Android geschieht dies durch Aufrufen von logClick und logImpression für In-App-Nachrichten und logButtonClick für immersive In-App-Nachrichten.

Nachdem Ihr IHtmlInAppMessageActionListener erstellt wurde, rufen Sie BrazeInAppMessageManager.getInstance().setCustomHtmlInAppMessageActionListener() auf, um BrazeInAppMessageManager anzuweisen, Ihren angepassten IHtmlInAppMessageActionListener anstelle des Standard-Action-Listeners zu verwenden.

Wir empfehlen, Ihren IHtmlInAppMessageActionListener in Ihrer Application.onCreate() vor allen anderen Aufrufen an Braze festzulegen. Dadurch wird der angepasste Action-Listener festgelegt, bevor eine In-App-Nachricht angezeigt wird:

BrazeInAppMessageManager.getInstance().setCustomHtmlInAppMessageActionListener(new CustomHtmlInAppMessageActionListener(context));
BrazeInAppMessageManager.getInstance().setCustomHtmlInAppMessageActionListener(CustomHtmlInAppMessageActionListener(context))

Angepasste Factorys festlegen

Sie können eine Reihe von Standardwerten mithilfe angepasster Factory-Objekte überschreiben. Diese können bei Bedarf beim Braze SDK registriert werden, um die gewünschten Ergebnisse zu erzielen. Wenn Sie sich jedoch entscheiden, eine Factory zu überschreiben, müssen Sie wahrscheinlich explizit auf die Standardimplementierung zurückgreifen oder die vom Braze-Standard bereitgestellte Funktionalität neu implementieren. Das folgende Code-Snippet veranschaulicht, wie Sie angepasste Implementierungen der Schnittstellen IInAppMessageViewFactory und IInAppMessageViewWrapperFactory bereitstellen können.

In-App-Nachrichtentypen

class BrazeDemoApplication : Application(){
 override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(BrazeActivityLifecycleCallbackListener(true, true))
    BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewWrapperFactory(CustomInAppMessageViewWrapperFactory())
    BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewFactory(CustomInAppMessageViewFactory())
  }
}

In-App-Nachrichtentypen

public class BrazeDemoApplication extends Application {
  @Override
  public void onCreate{
    super.onCreate();
    registerActivityLifecycleCallbacks(new BrazeActivityLifecycleCallbackListener(true, true));
    BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewWrapperFactory(new CustomInAppMessageViewWrapperFactory());
    BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewFactory(new CustomInAppMessageViewFactory());
  }
}

Die Braze-In-App-Nachrichtentypen sind vielseitig genug, um die meisten angepassten Anwendungsfälle abzudecken. Wenn Sie jedoch das visuelle Erscheinungsbild Ihrer In-App-Nachrichten vollständig selbst definieren möchten, anstatt einen Standardtyp zu verwenden, ermöglicht Braze dies durch die Festlegung einer angepassten View-Factory.

Der BrazeInAppMessageManager platziert das In-App-Nachrichtenmodell standardmäßig automatisch in die vorhandene Ansichtshierarchie der Activity, indem er DefaultInAppMessageViewWrapper verwendet. Wenn Sie anpassen möchten, wie In-App-Nachrichten in die Ansichtshierarchie eingefügt werden, sollten Sie eine angepasste IInAppMessageViewWrapperFactory verwenden.

In-App-Nachrichten haben ein voreingestelltes Animationsverhalten. Slideup-Nachrichten gleiten in den Bildschirm; full- und modal-Nachrichten werden ein- und ausgeblendet. Wenn Sie angepasste Animationsverhaltensweisen für Ihre In-App-Nachrichten definieren möchten, ermöglicht Braze dies durch die Einrichtung einer angepassten Animations-Factory.

Schritt 1: Factory implementieren

Erstellen Sie eine Klasse, die IInAppMessageViewFactory implementiert:

public class CustomInAppMessageViewFactory implements IInAppMessageViewFactory {
  @Override
  public View createInAppMessageView(Activity activity, IInAppMessage inAppMessage) {
    // Uses a custom view for slideups, modals, and full in-app messages.
    // HTML in-app messages and any other types will use the Braze default in-app message view factories
    switch (inAppMessage.getMessageType()) {
      case SLIDEUP:
      case MODAL:
      case FULL:
        // Use a custom view of your choosing
        return createMyCustomInAppMessageView();
      default:
        // Use the default in-app message factories
        final IInAppMessageViewFactory defaultInAppMessageViewFactory = BrazeInAppMessageManager.getInstance().getDefaultInAppMessageViewFactory(inAppMessage);
        return defaultInAppMessageViewFactory.createInAppMessageView(activity, inAppMessage);
    }
  }
}
class CustomInAppMessageViewFactory : IInAppMessageViewFactory {
  override fun createInAppMessageView(activity: Activity, inAppMessage: IInAppMessage): View {
    // Uses a custom view for slideups, modals, and full in-app messages.
    // HTML in-app messages and any other types will use the Braze default in-app message view factories
    when (inAppMessage.messageType) {
      MessageType.SLIDEUP, MessageType.MODAL, MessageType.FULL ->
        // Use a custom view of your choosing
        return createMyCustomInAppMessageView()
      else -> {
        // Use the default in-app message factories
        val defaultInAppMessageViewFactory = BrazeInAppMessageManager.getInstance().getDefaultInAppMessageViewFactory(inAppMessage)
        return defaultInAppMessageViewFactory!!.createInAppMessageView(activity, inAppMessage)
      }
    }
  }
}

Erstellen Sie eine Klasse, die IInAppMessageViewWrapperFactory implementiert und ein IInAppMessageViewWrapper zurückgibt.

Diese Factory wird unmittelbar nach der Erstellung der In-App-Nachrichten-View aufgerufen. Der einfachste Weg, ein angepasstes IInAppMessageViewWrapper zu implementieren, besteht darin, einfach das standardmäßige DefaultInAppMessageViewWrapper zu erweitern:

public class CustomInAppMessageViewWrapper extends DefaultInAppMessageViewWrapper {
  public CustomInAppMessageViewWrapper(View inAppMessageView,
                                       IInAppMessage inAppMessage,
                                       IInAppMessageViewLifecycleListener inAppMessageViewLifecycleListener,
                                       BrazeConfigurationProvider brazeConfigurationProvider,
                                       Animation openingAnimation,
                                       Animation closingAnimation, View clickableInAppMessageView) {
    super(inAppMessageView,
        inAppMessage,
        inAppMessageViewLifecycleListener,
        brazeConfigurationProvider,
        openingAnimation,
        closingAnimation,
        clickableInAppMessageView);
  }

  @Override
  public void open(@NonNull Activity activity) {
    super.open(activity);
    Toast.makeText(activity.getApplicationContext(), "Opened in-app message", Toast.LENGTH_SHORT).show();
  }

  @Override
  public void close() {
    super.close();
    Toast.makeText(mInAppMessageView.getContext().getApplicationContext(), "Closed in-app message", Toast.LENGTH_SHORT).show();
  }
}
class CustomInAppMessageViewWrapper(inAppMessageView: View,
                                    inAppMessage: IInAppMessage,
                                    inAppMessageViewLifecycleListener: IInAppMessageViewLifecycleListener,
                                    brazeConfigurationProvider: BrazeConfigurationProvider,
                                    openingAnimation: Animation,
                                    closingAnimation: Animation, clickableInAppMessageView: View) :
    DefaultInAppMessageViewWrapper(inAppMessageView,
        inAppMessage,
        inAppMessageViewLifecycleListener,
        brazeConfigurationProvider,
        openingAnimation,
        closingAnimation,
        clickableInAppMessageView) {

  override fun open(activity: Activity) {
    super.open(activity)
    Toast.makeText(activity.applicationContext, "Opened in-app message", Toast.LENGTH_SHORT).show()
  }

  override fun close() {
    super.close()
    Toast.makeText(mInAppMessageView.context.applicationContext, "Closed in-app message", Toast.LENGTH_SHORT).show()
  }
}

Erstellen Sie eine Klasse, die IInAppMessageAnimationFactory implementiert:

public class CustomInAppMessageAnimationFactory implements IInAppMessageAnimationFactory {

  @Override
  public Animation getOpeningAnimation(IInAppMessage inAppMessage) {
    Animation animation = new AlphaAnimation(0, 1);
    animation.setInterpolator(new AccelerateInterpolator());
    animation.setDuration(2000L);
    return animation;
  }

  @Override
  public Animation getClosingAnimation(IInAppMessage inAppMessage) {
    Animation animation = new AlphaAnimation(1, 0);
    animation.setInterpolator(new DecelerateInterpolator());
    animation.setDuration(2000L);
    return animation;
  }
}
class CustomInAppMessageAnimationFactory : IInAppMessageAnimationFactory {
  override fun getOpeningAnimation(inAppMessage: IInAppMessage): Animation {
    val animation: Animation = AlphaAnimation(0, 1)
    animation.interpolator = AccelerateInterpolator()
    animation.duration = 2000L
    return animation
  }

  override fun getClosingAnimation(inAppMessage: IInAppMessage): Animation {
    val animation: Animation = AlphaAnimation(1, 0)
    animation.interpolator = DecelerateInterpolator()
    animation.duration = 2000L
    return animation
  }
}

Schritt 2: Braze zur Nutzung der Factory anweisen

Nachdem Ihre IInAppMessageViewFactory erstellt wurde, rufen Sie BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewFactory() auf, um BrazeInAppMessageManager anzuweisen, Ihre angepasste IInAppMessageViewFactory anstelle der Standard-View-Factory zu verwenden.

Funktionsweise

Die slideup-In-App-Nachrichten-View implementiert IInAppMessageView. Die Nachrichten-Views vom Typ full und modal implementieren IInAppMessageImmersiveView. Die Implementierung einer dieser Klassen ermöglicht es Braze, bei Bedarf Klick-Listener zu Ihrer angepassten View hinzuzufügen. Alle Braze-View-Klassen erweitern Androids View-Klasse.

Die Implementierung von IInAppMessageView ermöglicht es Ihnen, einen bestimmten Bereich Ihrer angepassten View als klickbar zu definieren. Die Implementierung von IInAppMessageImmersiveView ermöglicht es Ihnen, Nachrichten-Button-Views und eine Schließen-Button-View zu definieren.

Nachdem Ihr IInAppMessageViewWrapper erstellt wurde, rufen Sie BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewWrapperFactory() auf, um BrazeInAppMessageManager anzuweisen, Ihre angepasste IInAppMessageViewWrapperFactory anstelle der Standard-View-Wrapper-Factory zu verwenden.

Wir empfehlen, Ihre IInAppMessageViewWrapperFactory in Ihrer Application.onCreate() festzulegen, bevor Sie andere Aufrufe an Braze vornehmen. Dadurch wird die angepasste View-Wrapper-Factory festgelegt, bevor eine In-App-Nachricht angezeigt wird:

BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewWrapperFactory(new CustomInAppMessageViewWrapper());
BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewWrapperFactory(CustomInAppMessageViewWrapper())

Nachdem Ihre IInAppMessageAnimationFactory erstellt wurde, rufen Sie BrazeInAppMessageManager.getInstance().setCustomInAppMessageAnimationFactory() auf, um BrazeInAppMessageManager anzuweisen, Ihre angepasste IInAppMessageAnimationFactory anstelle der Standard-Animations-Factory zu verwenden.

Wir empfehlen, Ihre IInAppMessageAnimationFactory in Ihrer Application.onCreate() festzulegen, bevor Sie andere Aufrufe an Braze vornehmen. Dadurch wird die angepasste Animations-Factory festgelegt, bevor eine In-App-Nachricht angezeigt wird.

Angepasste Stile

Braze-UI-Elemente haben ein standardmäßiges Erscheinungsbild, das den Android-Standard-UI-Richtlinien entspricht und ein nahtloses Erlebnis bietet. Dieser Referenzartikel behandelt das angepasste Styling von In-App-Nachrichten für Ihre Android- oder FireOS-Anwendung.

Einen Standard-Stil festlegen

Sie können die Standard-Stile in der styles.xml-Datei des Braze SDK einsehen:

  <style name="Braze"/>
  <style name="Braze.InAppMessage"/>
  <style name="Braze.InAppMessage.Header">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:padding">0.0dp</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:textColor">@color/com_braze_inappmessage_header_text</item>
    <item name="android:textSize">20.0sp</item>
    <item name="android:lineSpacingMultiplier">1.3</item>
    <item name="android:gravity">center</item>
    <item name="android:textStyle">bold</item>
    <item name="android:layout_centerHorizontal">true</item>
  </style>

Wenn Sie es bevorzugen, können Sie diese Stile überschreiben, um ein Erscheinungsbild zu erstellen, das besser zu Ihrer App passt.

Um einen Stil zu überschreiben, kopieren Sie ihn vollständig in die styles.xml-Datei Ihres Projekts und nehmen Sie Änderungen vor. Der gesamte Stil muss in Ihre lokale styles.xml-Datei kopiert werden, damit alle Attribute korrekt gesetzt werden. Beachten Sie, dass diese angepassten Stile für Änderungen an einzelnen UI-Elementen gedacht sind, nicht für grundlegende Änderungen an Layouts. Änderungen auf Layout-Ebene müssen mit angepassten Views behandelt werden.

Schriftart anpassen

Sie können eine angepasste Schriftart festlegen, indem Sie die Schriftart im Verzeichnis res/font ablegen. Um sie zu verwenden, überschreiben Sie den Stil für Nachrichtentext, Überschriften und Button-Text und verwenden Sie das Attribut fontFamily, um Braze anzuweisen, Ihre angepasste Schriftfamilie zu verwenden.

Um beispielsweise die Schriftart Ihres In-App-Nachrichten-Button-Texts zu aktualisieren, überschreiben Sie den Stil Braze.InAppMessage.Button und verweisen Sie auf Ihre angepasste Schriftfamilie. Der Attributwert sollte auf eine Schriftfamilie in Ihrem Verzeichnis res/font verweisen.

Hier ist ein gekürztes Beispiel mit einer angepassten Schriftfamilie, my_custom_font_family, die in der letzten Zeile referenziert wird:

  <style name="Braze.InAppMessage.Button">
    <item name="android:layout_height">wrap_content</item>
    ...
    <item name="android:paddingBottom">15.0dp</item>
    <item name="android:fontFamily">@font/my_custom_font_family</item>
    <item name="fontFamily">@font/my_custom_font_family</item>
  </style>

Neben dem Stil Braze.InAppMessage.Button für Button-Text ist der Stil für Nachrichtentext Braze.InAppMessage.Message und der Stil für Nachrichtenüberschriften Braze.InAppMessage.Header. Wenn Sie Ihre angepasste Schriftfamilie für alle möglichen In-App-Nachrichten-Texte verwenden möchten, können Sie Ihre Schriftfamilie im Stil Braze.InAppMessage festlegen, der der übergeordnete Stil für alle In-App-Nachrichten ist.

Schließen von Nachrichten

Slideup-Nachrichten durch Wischen schließen

Standardmäßig können Slideup-In-App-Nachrichten durch eine Wischgeste geschlossen werden. Die Richtung der Wischgeste hängt von der Position des Slideups ab:

  • Wischen nach links oder rechts: Schließt das Slideup unabhängig von seiner Position.
  • Slideup von unten: Wischen von oben nach unten schließt die Nachricht. Wischen von unten nach oben schließt sie nicht.
  • Slideup von oben: Wischen von unten nach oben schließt die Nachricht. Wischen von oben nach unten schließt sie nicht.

Dieses Wischverhalten ist im Standard-DefaultInAppMessageViewWrapper integriert und gilt nur für Slideup-In-App-Nachrichten. Modale und Vollbild-In-App-Nachrichten unterstützen das Schließen durch Wischen nicht. Um dieses Verhalten anzupassen, können Sie eine angepasste View-Wrapper-Factory implementieren.

Schließen über die Zurück-Taste deaktivieren

Standardmäßig schließt die Hardware-Zurück-Taste Braze-In-App-Nachrichten. Dieses Verhalten kann pro Nachricht über BrazeInAppMessageManager.setBackButtonDismissesInAppMessageView() deaktiviert werden.

Im folgenden Beispiel ist disable_back_button ein angepasstes Schlüssel-Wert-Paar, das in der In-App-Nachricht festgelegt wird und angibt, ob die Nachricht das Schließen über die Zurück-Taste erlauben soll:

BrazeInAppMessageManager.getInstance().setCustomInAppMessageManagerListener(new DefaultInAppMessageManagerListener() {
  @Override
  public void beforeInAppMessageViewOpened(View inAppMessageView, IInAppMessage inAppMessage) {
    super.beforeInAppMessageViewOpened(inAppMessageView, inAppMessage);
    final Map<String, String> extras = inAppMessage.getExtras();
    if (extras != null && extras.containsKey("disable_back_button")) {
      BrazeInAppMessageManager.getInstance().setBackButtonDismissesInAppMessageView(false);
    }
  }

  @Override
  public void afterInAppMessageViewClosed(IInAppMessage inAppMessage) {
    super.afterInAppMessageViewClosed(inAppMessage);
    BrazeInAppMessageManager.getInstance().setBackButtonDismissesInAppMessageView(true);
  }
});
BrazeInAppMessageManager.getInstance().setCustomInAppMessageManagerListener(object : DefaultInAppMessageManagerListener() {
  override fun beforeInAppMessageViewOpened(inAppMessageView: View, inAppMessage: IInAppMessage) {
    super.beforeInAppMessageViewOpened(inAppMessageView, inAppMessage)
    val extras = inAppMessage.extras
    if (extras != null && extras.containsKey("disable_back_button")) {
      BrazeInAppMessageManager.getInstance().setBackButtonDismissesInAppMessageView(false)
    }
  }

  override fun afterInAppMessageViewClosed(inAppMessage: IInAppMessage) {
    super.afterInAppMessageViewClosed(inAppMessage)
    BrazeInAppMessageManager.getInstance().setBackButtonDismissesInAppMessageView(true)
  }
})

Schließen durch Tippen außerhalb aktivieren

Standardmäßig ist das Schließen des Modals durch Tippen außerhalb auf false gesetzt. Wenn Sie diesen Wert auf true setzen, wird die modale In-App-Nachricht geschlossen, wenn Nutzer:innen außerhalb der In-App-Nachricht tippen. Dieses Verhalten kann durch folgenden Aufruf aktiviert werden:

BrazeInAppMessageManager.getInstance().setClickOutsideModalViewDismissInAppMessageView(true)

Ausrichtung anpassen

Um eine feste Ausrichtung für eine In-App-Nachricht festzulegen, richten Sie zunächst einen angepassten In-App-Nachrichten-Manager-Listener ein. Aktualisieren Sie dann die Ausrichtung auf dem IInAppMessage-Objekt in der Delegate-Methode beforeInAppMessageDisplayed():

public InAppMessageOperation beforeInAppMessageDisplayed(IInAppMessage inAppMessage) {
  // Set the orientation to portrait
  inAppMessage.setOrientation(Orientation.PORTRAIT);
  return InAppMessageOperation.DISPLAY_NOW;
}
override fun beforeInAppMessageDisplayed(inAppMessage: IInAppMessage): InAppMessageOperation {
  // Set the orientation to portrait
  inAppMessage.orientation = Orientation.PORTRAIT
  return InAppMessageOperation.DISPLAY_NOW
}

Auf Tablet-Geräten werden In-App-Nachrichten unabhängig von der tatsächlichen Bildschirmausrichtung im bevorzugten Ausrichtungsstil der Nutzer:innen angezeigt.

Deaktivieren des dunklen Designs

Standardmäßig prüft beforeInAppMessageDisplayed() von IInAppMessageManagerListener die Systemeinstellungen und aktiviert bedingt das Styling für das dunkle Design der Nachricht mit dem folgenden Code:

@Override
public InAppMessageOperation beforeInAppMessageDisplayed(IInAppMessage inAppMessage) {
  if (inAppMessage instanceof IInAppMessageThemeable && ViewUtils.isDeviceInNightMode(BrazeInAppMessageManager.getInstance().getApplicationContext())) {
    ((IInAppMessageThemeable) inAppMessage).enableDarkTheme();
  }
  return InAppMessageOperation.DISPLAY_NOW;
}
override fun beforeInAppMessageDisplayed(inAppMessage: IInAppMessage): InAppMessageOperation {
  if (inAppMessage is IInAppMessageThemeable && ViewUtils.isDeviceInNightMode(BrazeInAppMessageManager.getInstance().applicationContext!!)) {
    (inAppMessage as IInAppMessageThemeable).enableDarkTheme()
  }
  return InAppMessageOperation.DISPLAY_NOW
}

Um dies zu ändern, können Sie enableDarkTheme in jedem Schritt des Voranzeigeprozesses aufrufen, um Ihre eigene bedingte Logik zu implementieren.

Anpassen der Google Play-Bewertungsaufforderung

Aufgrund der von Google festgelegten Einschränkungen und Beschränkungen werden angepasste Google Play-Bewertungsaufforderungen derzeit nicht von Braze unterstützt. Während einige Nutzer:innen diese Aufforderungen erfolgreich integrieren konnten, haben andere aufgrund von Google Play-Kontingenten niedrige Erfolgsraten verzeichnet. Die Integration erfolgt auf eigenes Risiko. Weitere Informationen finden Sie in der Dokumentation zu Google Play-In-App-Bewertungsaufforderungen.

Voraussetzungen

Bevor Sie dieses Feature nutzen können, müssen Sie das Braze Swift SDK integrieren.

Einrichten des UI-Delegate (erforderlich)

Um die Darstellung von In-App-Nachrichten anzupassen und auf verschiedene Lebenszyklus-Ereignisse zu reagieren, müssen Sie BrazeInAppMessageUIDelegate einrichten. Dies ist ein Delegate-Protokoll, das für den Empfang und die Verarbeitung von ausgelösten In-App-Nachrichten-Payloads, den Empfang von Anzeige-Lebenszyklus-Ereignissen und die Steuerung des Anzeige-Timings verwendet wird. Um BrazeInAppMessageUIDelegate zu verwenden, müssen Sie:

  • Die Standard-Implementierung BrazeInAppMessageUI als Ihren inAppMessagePresenter verwenden.
  • Die BrazeUI-Bibliothek in Ihr Projekt einbinden.

Schritt 1: Das BrazeInAppMessageUIDelegate-Protokoll implementieren

Implementieren Sie zunächst das BrazeInAppMessageUIDelegate-Protokoll und alle gewünschten zugehörigen Methoden. Im folgenden Beispiel wird dieses Protokoll in der AppDelegate-Klasse der Anwendung implementiert.

extension AppDelegate: BrazeInAppMessageUIDelegate {
  // Implement your protocol methods here.
}
@interface AppDelegate () <BrazeInAppMessageUIDelegate>

@end

@implementation AppDelegate
  // Implement your protocol methods here.
@end

Schritt 2: Das delegate-Objekt zuweisen

Weisen Sie das delegate-Objekt auf der BrazeInAppMessageUI-Instanz zu, bevor Sie diese In-App-Nachrichten-UI als Ihren inAppMessagePresenter festlegen.

let inAppMessageUI = BrazeInAppMessageUI()
inAppMessageUI.delegate = self
AppDelegate.braze?.inAppMessagePresenter = inAppMessageUI
BrazeInAppMessageUI *inAppMessageUI = [[BrazeInAppMessageUI alloc] init];
inAppMessageUI.delegate = self;
AppDelegate.braze.inAppMessagePresenter = inAppMessageUI;

Klick-Verhalten

Jedes Braze.InAppMessage-Objekt enthält eine entsprechende ClickAction, die das Verhalten beim Klicken definiert.

Klick-Aktionstypen

Die Eigenschaft clickAction Ihres Braze.InAppMessage-Objekts ist standardmäßig auf .none gesetzt, kann aber auf einen der folgenden Werte eingestellt werden:

ClickAction Klick-Verhalten
.url(URL, useWebView: Bool) Öffnet die angegebene URL in einem externen Browser. Wenn useWebView auf true gesetzt ist, wird sie in einer Web-Ansicht geöffnet.
.none Die Nachricht wird beim Klicken geschlossen.

Klick-Verhalten anpassen

Um dieses Verhalten anzupassen, können Sie die Eigenschaft clickAction ändern, indem Sie sich auf das folgende Beispiel beziehen:

func inAppMessage(
  _ ui: BrazeInAppMessageUI,
  prepareWith context: inout BrazeInAppMessageUI.PresentationContext
) {
  if let newUrl = URL(string: "{your-url}") {
    context.message.clickAction = .url(newUrl, useWebView: true)
  }
}

Die Methode inAppMessage(_:prepareWith:) ist in Objective-C nicht verfügbar.

Angepasstes Verhalten verarbeiten

Die folgende Delegate-Methode BrazeInAppMessageUIDelegate wird aufgerufen, wenn Nutzer:innen auf eine In-App-Nachricht klicken. Dieser Callback wird bei von Nutzer:innen initiierten Klicks auf In-App-Nachrichten-Buttons und HTML-In-App-Nachrichten-Buttons (Links) ausgelöst, und eine Button-ID wird als optionaler Parameter für diese Interaktionen bereitgestellt. Dieser Callback wird nicht bei programmatischen Klicks aufgerufen, die über brazeBridge.logClick() ausgelöst werden.

func inAppMessage(
  _ ui: BrazeInAppMessageUI,
  shouldProcess clickAction: Braze.InAppMessage.ClickAction,
  buttonId: String?,
  message: Braze.InAppMessage,
  view: InAppMessageView
) -> Bool
- (BOOL)inAppMessage:(BrazeInAppMessageUI *)ui
       shouldProcess:(enum BRZInAppMessageRawClickAction)clickAction
                 url:(NSURL *)uri
            buttonId:(NSString *)buttonId
             message:(BRZInAppMessageRaw *)message
                view:(UIView *)view;

Diese Methode gibt einen booleschen Wert zurück, der angibt, ob Braze mit der Ausführung der Klick-Aktion fortfahren soll.

func inAppMessage(
  _ ui: BrazeInAppMessageUI, shouldProcess clickAction: Braze.InAppMessage.ClickAction,
  buttonId: String?, message: Braze.InAppMessage, view: InAppMessageView
) -> Bool {
    guard let buttonId,
      let idInt = Int(buttonId)
    else { return true }
    var button: BrazeKit.Braze.InAppMessage.Button? = nil

    switch message {
    case .modal(let modal):
      button = modal.buttons[idInt]

    case .modalImage(let modalImage):
      button = modalImage.buttons[idInt]

    case .full(let full):
      button = full.buttons[idInt]

    case .fullImage(let fullImage):
      button = fullImage.buttons[idInt]

    default:
      break
    }

    print(button?.id)
    print(button?.text)
    print(button?.clickAction)

    return true
  }
- (BOOL)inAppMessage:(BrazeInAppMessageUI *)ui
       shouldProcess:(enum BRZInAppMessageRawClickAction)clickAction
                 url:(NSURL *)uri
            buttonId:(NSString *)buttonId
             message:(BRZInAppMessageRaw *)message
                view:(UIView *)view {
  NSInteger buttonInt = [buttonId integerValue];

  if (message.type == BRZInAppMessageRawTypeFull || message.type == BRZInAppMessageRawTypeModal) {
    BRZInAppMessageRawButton *button = message.buttons[buttonInt];
    NSLog(@"%ld", (long)button.identifier);
    NSLog(@"%@", button.text);
    NSLog(@"%ld", (long)button.clickAction);
  }
  return YES;
}

Durch Wischen Slideup-Nachrichten schließen

Standardmäßig können Slideup-In-App-Nachrichten durch eine Wischgeste geschlossen werden. Die Richtung der Wischbewegung hängt von der Slideup-Position ab:

  • Wischen nach links oder rechts: Schließt das Slideup unabhängig von seiner Position.
  • Slideup von unten: Wischen von oben nach unten schließt die Nachricht. Wischen von unten nach oben schließt sie nicht.
  • Slideup von oben: Wischen von unten nach oben schließt die Nachricht. Wischen von oben nach unten schließt sie nicht.

Dieses Wischverhalten ist in die standardmäßige BrazeInAppMessageUI SlideupView integriert und gilt nur für Slideup-In-App-Nachrichten. Modale und Vollbild-In-App-Nachrichten unterstützen kein Schließen durch Wischen. Um die Slideup-Ansicht weiter anzupassen, einschließlich des Wischverhaltens, können Sie die SlideupView.Attributes ändern oder über Subclassing eine angepasste Ansicht bereitstellen.

Schließen von Modals anpassen

Um das Schließen durch Tippen außerhalb des Modals zu aktivieren, können Sie die Eigenschaft dismissOnBackgroundTap im Attributes-Struct des jeweiligen In-App-Nachrichtentyps ändern, den Sie anpassen möchten.

Wenn Sie dieses Feature beispielsweise für modale Bild-In-App-Nachrichten aktivieren möchten, können Sie Folgendes konfigurieren:

BrazeInAppMessageUI.ModalImageView.Attributes.defaults.dismissOnBackgroundTap = true

Die Anpassung über Attributes ist in Objective-C nicht verfügbar.

Der Standardwert ist false. Dieser bestimmt, ob die modale In-App-Nachricht geschlossen wird, wenn Nutzer:innen außerhalb der In-App-Nachricht tippen.

DismissModalOnOutsideTap Beschreibung
true Modale In-App-Nachrichten werden beim Tippen außerhalb geschlossen.
false Standard – modale In-App-Nachrichten werden beim Tippen außerhalb nicht geschlossen.

Weitere Informationen zur Anpassung von In-App-Nachrichten finden Sie in diesem Artikel.

Ausrichtung von Nachrichten anpassen

Sie können die Ausrichtung Ihrer In-App-Nachrichten anpassen. Sie können eine neue Standardausrichtung für alle Nachrichten festlegen oder eine individuelle Ausrichtung für eine einzelne Nachricht festlegen.

Um eine Standardausrichtung für alle In-App-Nachrichten auszuwählen, verwenden Sie die Methode inAppMessage(_:prepareWith:), um die Eigenschaft preferredOrientation im PresentationContext festzulegen.

Um beispielsweise „Portrait“ als Standardausrichtung festzulegen:

func inAppMessage(
  _ ui: BrazeInAppMessageUI,
  prepareWith context: inout BrazeInAppMessageUI.PresentationContext
) {
  context.preferredOrientation = .portrait
}
- (void)inAppMessage:(BrazeInAppMessageUI *)ui
         prepareWith:(BrazeInAppMessageUIPresentationContextRaw *)context {
  context.preferredOrientation = BRZInAppMessageRawOrientationPortrait;
}

Um die Ausrichtung für eine einzelne Nachricht festzulegen, ändern Sie die Eigenschaft orientation von Braze.InAppMessage:

// Set inAppMessage orientation to support any configuration
inAppMessage.orientation = .any

// Set inAppMessage orientation to only display in portrait
inAppMessage.orientation = .portrait

// Set inAppMessage orientation to only display in landscape
inAppMessage.orientation = .landscape
// Set inAppMessage orientation to support any configuration
inAppMessage.orientation = BRZInAppMessageRawOrientationAny;

// Set inAppMessage orientation to only display in portrait
inAppMessage.orientation = BRZInAppMessageRawOrientationPortrait;

// Set inAppMessage orientation to only display in landscape
inAppMessage.orientation = BRZInAppMessageRawOrientationLandscape;

Nachdem die In-App-Nachricht angezeigt wurde, führt jede Änderung der Geräteausrichtung, während die Nachricht noch angezeigt wird, dazu, dass sich die Nachricht mit dem Gerät dreht (vorausgesetzt, dies wird durch die orientation-Konfiguration der Nachricht unterstützt).

Die Geräteausrichtung muss auch von der orientation-Eigenschaft der In-App-Nachricht unterstützt werden, damit die Nachricht angezeigt wird. Zusätzlich wird die Einstellung preferredOrientation nur berücksichtigt, wenn sie in den unterstützten Schnittstellenausrichtungen Ihrer Anwendung im Abschnitt Deployment Info in den Einstellungen Ihres Targets in Xcode enthalten ist.

Unterstützte Ausrichtungen in Xcode.

Anzeigezeitpunkt anpassen

Sie können steuern, ob eine verfügbare In-App-Nachricht zu bestimmten Zeitpunkten in der Nutzererfahrung angezeigt wird. Wenn es Situationen gibt, in denen die In-App-Nachricht nicht erscheinen soll, z. B. während eines Vollbildspiels oder auf einem Ladebildschirm, können Sie ausstehende In-App-Nachrichten verzögern oder verwerfen. Um den Zeitpunkt der In-App-Nachricht zu steuern, verwenden Sie die Delegate-Methode inAppMessage(_:displayChoiceForMessage:), um die Eigenschaft BrazeInAppMessageUI.DisplayChoice festzulegen.

func inAppMessage(
  _ ui: BrazeInAppMessageUI,
  displayChoiceForMessage message: Braze.InAppMessage
) -> BrazeInAppMessageUI.DisplayChoice
- (enum BRZInAppMessageUIDisplayChoice)inAppMessage:(BrazeInAppMessageUI *)ui displayChoiceForMessage:(BRZInAppMessageRaw *)message

Konfigurieren Sie BrazeInAppMessageUI.DisplayChoice so, dass einer der folgenden Werte zurückgegeben wird:

Anzeigeoption Verhalten
.now Die Nachricht wird sofort angezeigt. Dies ist der Standardwert.
.reenqueue Die Nachricht wird nicht angezeigt und wieder oben auf den Stack gelegt.
.later Die Nachricht wird nicht angezeigt und wieder oben auf den Stack gelegt. (Veraltet, bitte .reenqueue verwenden)
.discard Die Nachricht wird verworfen und nicht angezeigt.

Statusleiste ausblenden

Bei In-App-Nachrichten vom Typ Full, FullImage und HTML blendet das SDK die Statusleiste standardmäßig aus. Bei anderen Typen von In-App-Nachrichten bleibt die Statusleiste unverändert. Um dieses Verhalten zu konfigurieren, verwenden Sie die Delegate-Methode inAppMessage(_:prepareWith:), um die Eigenschaft statusBarHideBehavior im PresentationContext festzulegen. Dieses Feld akzeptiert einen der folgenden Werte:

Verhalten zum Ausblenden der Statusleiste Beschreibung
.auto Die Nachrichtenansicht entscheidet über den Ausblendungsstatus der Statusleiste.
.hidden Statusleiste immer ausblenden.
.visible Statusleiste immer anzeigen.

Dark Mode deaktivieren

Um zu verhindern, dass In-App-Nachrichten den Dark-Mode-Stil übernehmen, wenn auf dem Gerät der Nutzer:innen der Dark Mode aktiviert ist, implementieren Sie die inAppMessage(_:prepareWith:) Delegate-Methode. Der an die Methode übergebene PresentationContext enthält eine Referenz auf das darzustellende InAppMessage-Objekt. Jede InAppMessage verfügt über eine themes-Eigenschaft, die ein dark- und ein light-Mode-Theme enthält. Wenn Sie die Eigenschaft themes.dark auf nil setzen, zeigt Braze die In-App-Nachricht automatisch mit dem hellen Theme an.

In-App-Nachrichtentypen mit Buttons haben ein zusätzliches themes-Objekt in ihrer buttons-Eigenschaft. Um zu verhindern, dass Buttons den Dark-Mode-Stil übernehmen, können Sie map(_:) verwenden, um ein neues Array von Buttons mit einem light-Theme und ohne dark-Theme zu erstellen.

func inAppMessage(
  _ ui: BrazeInAppMessageUI,
  prepareWith context: inout BrazeInAppMessageUI.PresentationContext
) {
  switch context.message {
    case .slideup:
      guard var slideup = context.message.slideup else { return }
      slideup.themes.dark = nil
      context.message.slideup = slideup

    case .modal:
      guard var modal = context.message.modal else { return }
      modal.themes.dark = nil
      modal.buttons = modal.buttons.map {
        var newButton = $0
        newButton.themes = .init(themes: ["light": $0.themes.light])
        return newButton
      }
      context.message.modal = modal

    case .modalImage:
      guard var modalImage = context.message.modalImage else { return }
      modalImage.themes.dark = nil
      modalImage.buttons = modalImage.buttons.map {
        var newButton = $0
        newButton.themes = .init(themes: ["light": $0.themes.light])
        return newButton
      }
      context.message.modalImage = modalImage

    case .full:
      guard var full = context.message.full else { return }
      full.themes.dark = nil
      full.buttons = full.buttons.map {
        var newButton = $0
        newButton.themes = .init(themes: ["light": $0.themes.light])
        return newButton
      }
      context.message.full = full

    case .fullImage:
      guard var fullImage = context.message.fullImage else { return }
      fullImage.themes.dark = nil
      fullImage.buttons = fullImage.buttons.map {
        var newButton = $0
        newButton.themes = .init(themes: ["light": $0.themes.light])
        return newButton
      }
      context.message.fullImage = fullImage

    default:
      break
  }
}
- (void)inAppMessage:(BrazeInAppMessageUI *)ui
         prepareWith:(BrazeInAppMessageUIPresentationContextRaw *)context {
  switch (context.message.type) {
    case BRZInAppMessageRawTypeSlideup: {
      NSMutableDictionary *updatedThemes = [context.message.themes mutableCopy];
      [updatedThemes removeObjectForKey:@"dark"];
      context.message.themes = updatedThemes;
      break;
    }
    case BRZInAppMessageRawTypeModal:
    case BRZInAppMessageRawTypeFull:
    {
      NSMutableDictionary *updatedThemes = [context.message.themes mutableCopy];
      [updatedThemes removeObjectForKey:@"dark"];
      context.message.themes = updatedThemes;

      NSMutableArray *updatedButtons = [NSMutableArray arrayWithCapacity:context.message.buttons.count];
      for (BRZInAppMessageRawButton *button in context.message.buttons) {
        BRZInAppMessageRawButtonTheme *lightTheme = BRZInAppMessageRawButtonTheme.defaultLight;
        BRZInAppMessageRawButton *newButton = [button mutableCopy];
        newButton.textColor = lightTheme.textColor;
        newButton.backgroundColor = lightTheme.backgroundColor;
        newButton.borderColor = lightTheme.borderColor;
        [updatedButtons addObject:newButton];
      }
      context.message.buttons = updatedButtons;
      break;
    }
    default:
      break;
  }
}

Anpassen der App-Store-Bewertungsaufforderung

Sie können In-App-Nachrichten in einer Campaign verwenden, um Nutzer:innen um eine App-Store-Bewertung zu bitten.

Schritt 1: In-App-Nachrichten-Delegate festlegen

Legen Sie zunächst den BrazeInAppMessageUIDelegate in Ihrer App fest.

Schritt 2: Standard-App-Store-Bewertungsnachricht deaktivieren

Implementieren Sie als Nächstes die inAppMessage(_:displayChoiceForMessage:) Delegate-Methode, um die Standard-App-Store-Bewertungsnachricht zu deaktivieren.

func inAppMessage(_ ui: BrazeInAppMessageUI, displayChoiceForMessage message: Braze.InAppMessage) -> BrazeInAppMessageUI.DisplayChoice {
  if message.extras["AppStore Review"] != nil,
    let messageUrl = message.clickAction.url {
      UIApplication.shared.open(messageUrl, options: [:], completionHandler: nil)
      return .discard
  } else {
    return .now
  }
}
- (enum BRZInAppMessageUIDisplayChoice)inAppMessage:(BrazeInAppMessageUI *)ui
                            displayChoiceForMessage:(BRZInAppMessageRaw *)message {
  if (message.extras != nil && message.extras[@"AppStore Review"] != nil) {
    [[UIApplication sharedApplication] openURL:message.url options:@{} completionHandler:nil];
    return BRZInAppMessageUIDisplayChoiceDiscard;
  } else {
    return BRZInAppMessageUIDisplayChoiceNow;
  }
}

Fügen Sie in Ihrem scene:openURLContexts:-Handler den folgenden Code hinzu, um den Deeplink {YOUR-APP-SCHEME}:app-store-review zu verarbeiten. Beachten Sie, dass Sie StoreKit importieren müssen, um SKStoreReviewController verwenden zu können:

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
  guard let url = URLContexts.first?.url else { return }
  let urlString = url.absoluteString.removingPercentEncoding
  if (urlString == "{YOUR-APP-SCHEME}:app-store-review") {
    SKStoreReviewController.requestReview()
    return;
  }
  // Other deep link handling code…
}
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  NSURL *url = URLContexts.allObjects.firstObject.URL;
  NSString *urlString = url.absoluteString.stringByRemovingPercentEncoding;
  if ([urlString isEqualToString:@"{YOUR-APP-SCHEME}:app-store-review"]) {
    [SKStoreReviewController requestReview];
    return;
  }
  // Other deep link handling code…
}

Schritt 4: Angepasstes Klickverhalten festlegen

Erstellen Sie als Nächstes eine In-App-Messaging-Campaign mit den folgenden Einstellungen:

  • Das Schlüssel-Wert-Paar "AppStore Review" : "true"
  • Das Klickverhalten auf „Deeplink in die App“ gesetzt, unter Verwendung des Deeplinks {YOUR-APP-SCHEME}:app-store-review.

Voraussetzungen

Bevor Sie dieses Feature nutzen können, müssen Sie das React Native Braze SDK integrieren.

Methoden zur Protokollierung

Sie können diese Methoden verwenden, indem Sie Ihre BrazeInAppMessage-Instanz übergeben, um Analytics zu protokollieren und Aktionen auszuführen:

Methode Beschreibung
logInAppMessageClicked(inAppMessage) Protokolliert einen Klick für die bereitgestellten In-App-Nachrichten-Daten.
logInAppMessageImpression(inAppMessage) Protokolliert eine Impression für die bereitgestellten In-App-Nachrichten-Daten.
logInAppMessageButtonClicked(inAppMessage, buttonId) Protokolliert einen Button-Klick für die bereitgestellten In-App-Nachrichten-Daten und die Button-ID.
hideCurrentInAppMessage() Schließt die aktuell angezeigte In-App-Nachricht.
performInAppMessageAction(inAppMessage) Führt die Aktion für eine In-App-Nachricht aus.
performInAppMessageButtonAction(inAppMessage, buttonId) Führt die Aktion für einen In-App-Nachrichten-Button aus.

Verarbeitung von Nachrichten-Daten

In den meisten Fällen können Sie die Methode Braze.addListener verwenden, um Event-Listener zu registrieren, die Daten aus In-App-Nachrichten verarbeiten.

Zusätzlich können Sie auf die In-App-Nachrichten-Daten im JavaScript-Layer zugreifen, indem Sie die Methode Braze.subscribeToInAppMessage aufrufen, damit die SDKs ein inAppMessageReceived-Event veröffentlichen, wenn eine In-App-Nachricht ausgelöst wird. Übergeben Sie einen Callback an diese Methode, um Ihren eigenen Code auszuführen, wenn die In-App-Nachricht ausgelöst und vom Listener empfangen wird.

Informationen zur Anpassung der Verarbeitung von Nachrichten-Daten finden Sie in den folgenden Implementierungsbeispielen:

Um das Standardverhalten zu verbessern oder wenn Sie keinen Zugriff auf die Anpassung des nativen iOS- oder Android-Codes haben, empfehlen wir, die Standard-UI zu deaktivieren und gleichzeitig In-App-Nachrichten-Events von Braze zu empfangen. Um die Standard-UI zu deaktivieren, übergeben Sie false an die Methode Braze.subscribeToInAppMessage und verwenden Sie die In-App-Nachrichten-Daten, um Ihre eigene Nachricht in JavaScript zu erstellen. Beachten Sie, dass Sie Analytics für Ihre Nachrichten manuell protokollieren müssen, wenn Sie die Standard-UI deaktivieren.

import Braze from "@braze/react-native-sdk";

// Option 1: Listen for the event directly via `Braze.addListener`.
//
// You may use this method to accomplish the same thing if you don't
// wish to make any changes to the default Braze UI.
Braze.addListener(Braze.Events.IN_APP_MESSAGE_RECEIVED, (event) => {
  console.log(event.inAppMessage);
});

// Option 2: Call `subscribeToInAppMessage`.
//
// Pass in `false` to disable the automatic display of in-app messages.
Braze.subscribeToInAppMessage(false, (event) => {
  console.log(event.inAppMessage);
  // Use `event.inAppMessage` to construct your own custom message UI.
});

Um fortgeschrittenere Logik einzubauen, die bestimmt, ob eine In-App-Nachricht über die integrierte UI angezeigt werden soll oder nicht, implementieren Sie In-App-Nachrichten über den nativen Layer.

Implementieren Sie den IInAppMessageManagerListener wie in unserem Android-Artikel über Custom Manager Listener beschrieben. In Ihrer beforeInAppMessageDisplayed-Implementierung können Sie auf die inAppMessage-Daten zugreifen, diese an den JavaScript-Layer senden und basierend auf dem Rückgabewert entscheiden, ob die native Nachricht angezeigt werden soll oder nicht.

Weitere Informationen zu diesen Werten finden Sie in unserer Android-Dokumentation.

// In-app messaging
@Override
public InAppMessageOperation beforeInAppMessageDisplayed(IInAppMessage inAppMessage) {
    WritableMap parameters = new WritableNativeMap();
    parameters.putString("inAppMessage", inAppMessage.forJsonPut().toString());
    getReactNativeHost()
        .getReactInstanceManager()
        .getCurrentReactContext()
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("inAppMessageReceived", parameters);
    // Note: return InAppMessageOperation.DISCARD if you would like
    // to prevent the Braze SDK from displaying the message natively.
    return InAppMessageOperation.DISPLAY_NOW;
}

Überschreiben des Standard-UI-Delegaten

Standardmäßig wird BrazeInAppMessageUI erstellt und zugewiesen, wenn Sie die braze-Instanz initialisieren. BrazeInAppMessageUI ist eine Implementierung des BrazeInAppMessagePresenter-Protokolls und verfügt über eine delegate-Eigenschaft, die zur Anpassung der Verarbeitung empfangener In-App-Nachrichten verwendet werden kann.

  1. Implementieren Sie den BrazeInAppMessageUIDelegate-Delegaten wie in unserem iOS In-App-Nachrichten-UI-Tutorial beschrieben.

  2. In der Delegaten-Methode inAppMessage(_:displayChoiceForMessage:) können Sie auf die inAppMessage-Daten zugreifen, diese an den JavaScript-Layer senden und basierend auf dem Rückgabewert entscheiden, ob die native Nachricht angezeigt werden soll oder nicht.

Weitere Details zu diesen Werten finden Sie in unserer iOS-Dokumentation.

- (enum BRZInAppMessageUIDisplayChoice)inAppMessage:(BrazeInAppMessageUI *)ui
                            displayChoiceForMessage:(BRZInAppMessageRaw *)message {
  // Convert the message to a JavaScript representation.
  NSData *inAppMessageData = [message json];
  NSString *inAppMessageString = [[NSString alloc] initWithData:inAppMessageData encoding:NSUTF8StringEncoding];
  NSDictionary *arguments = @{
    @"inAppMessage" : inAppMessageString
  };

  // Send to JavaScript.
  [self sendEventWithName:@"inAppMessageReceived" body:arguments];

  // Note: Return `BRZInAppMessageUIDisplayChoiceDiscard` if you would like
  // to prevent the Braze SDK from displaying the message natively.
  return BRZInAppMessageUIDisplayChoiceNow;
}

Um diesen Delegaten zu verwenden, weisen Sie ihn nach der Initialisierung der braze-Instanz brazeInAppMessagePresenter.delegate zu.

@import BrazeUI;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  BRZConfiguration *configuration = [[BRZConfiguration alloc] initWithApiKey:apiKey endpoint:endpoint];
  Braze *braze = [BrazeReactBridge initBraze:configuration];
  ((BrazeInAppMessageUI *)braze.inAppMessagePresenter).delegate = [[CustomDelegate alloc] init];
  AppDelegate.braze = braze;
}

Überschreiben der nativen Standard-UI

Wenn Sie die Darstellung Ihrer In-App-Nachrichten auf dem nativen iOS-Layer vollständig anpassen möchten, implementieren Sie das BrazeInAppMessagePresenter-Protokoll und weisen Sie Ihren angepassten Presenter wie in diesem Beispiel zu:

BRZConfiguration *configuration = [[BRZConfiguration alloc] initWithApiKey:apiKey endpoint:endpoint];
Braze *braze = [BrazeReactBridge initBraze:configuration];
braze.inAppMessagePresenter = [[MyCustomPresenter alloc] init];
AppDelegate.braze = braze;

Anpassen des Anzeigeverhaltens

Sie können das Anzeigeverhalten von In-App-Nachrichten zur Laufzeit wie folgt ändern:

// Sets in-app messages to display immediately when triggered.
Appboy.AppboyBinding.SetInAppMessageDisplayAction(BrazeUnityInAppMessageDisplayActionType.IAM_DISPLAY_NOW);

// Sets in-app messages to display at a later time and be saved in a stack.
Appboy.AppboyBinding.SetInAppMessageDisplayAction(BrazeUnityInAppMessageDisplayActionType.IAM_DISPLAY_LATER);

// Sets in-app messages to be discarded after being triggered.
Appboy.AppboyBinding.SetInAppMessageDisplayAction(BrazeUnityInAppMessageDisplayActionType.IAM_DISCARD);

Einen angepassten Listener einrichten

Wenn Sie mehr Kontrolle darüber benötigen, wie Nutzer:innen mit In-App-Nachrichten interagieren, verwenden Sie einen BrazeInAppMessageListener und weisen Sie ihn Appboy.AppboyBinding.inAppMessageListener zu. Für Delegates, die Sie nicht verwenden möchten, können Sie diese einfach auf null setzen.

BrazeInAppMessageListener listener = new BrazeInAppMessageListener() {
  BeforeInAppMessageDisplayed = BeforeInAppMessageDisplayed,
  OnInAppMessageButtonClicked = OnInAppMessageButtonClicked,
  OnInAppMessageClicked       = OnInAppMessageClicked,
  OnInAppMessageHTMLClicked   = OnInAppMessageHTMLClicked,
  OnInAppMessageDismissed     = OnInAppMessageDismissed,
};
Appboy.AppboyBinding.inAppMessageListener = listener;

public void BeforeInAppMessageDisplayed(IInAppMessage inAppMessage) {
  // Executed before an in-app message is displayed.
}

public void OnInAppMessageButtonClicked(IInAppMessage inAppMessage, InAppMessageButton inAppMessageButton) {
  // Executed whenever an in-app message button is clicked.
}

public void OnInAppMessageClicked(IInAppMessage inAppMessage) {
  // Executed whenever an in-app message is clicked.
}

public void OnInAppMessageHTMLClicked(IInAppMessage inAppMessage, Uri uri) {
  // Executed whenever an HTML in-app message is clicked.
}

public void OnInAppMessageDismissed(IInAppMessage inAppMessage) {
  // Executed whenever an in-app message is dismissed without a click.
}
New Stuff!