
Das AppboyKit (auch bekannt als Objective-C SDK) wird nicht mehr unterstützt und wurde durch das Swift SDK ersetzt. Es wird keine neuen Features, Fehlerbehebungen, Sicherheitsupdates oder technischen Support mehr erhalten—Messaging und Analytics werden jedoch weiterhin wie gewohnt funktionieren. Weitere Informationen finden Sie unter Einführung in das neue Braze Swift SDK.
SharePlay-Implementierungsleitfaden für In-App-Nachrichten
SharePlay ist ein neues Feature, das Nutzer:innen von iOS 15 FaceTime ein gemeinsames Medienerlebnis auf ihren Geräten ermöglicht, indem es Audio und Video in Echtzeit synchronisiert. SharePlay ist eine großartige Möglichkeit für Nutzer:innen, Inhalte mit Freunden und Familie zu erleben. Es bietet Braze-Kund:innen eine zusätzliche Möglichkeit für Video-Inhalte und Gelegenheiten, neue Nutzer:innen in Ihre Anwendung einzuführen.

Übersicht
Das neue GroupActivities-Framework, das Apple als Teil des iOS-15-Updates veröffentlicht hat, ermöglicht es Ihnen, FaceTime zu nutzen, indem Sie SharePlay mithilfe von Braze In-App Messages in Ihre Anwendungen integrieren.

Wenn Nutzer:innen ein SharePlay-Video in einem FaceTime-Anruf starten, erscheint oben auf dem Bildschirm aller Teilnehmenden ein „Öffnen“-Button. Nach dem Öffnen werden Audio und Video auf allen kompatiblen Geräten synchronisiert, sodass Nutzer:innen Videos gemeinsam in Realtime ansehen können. Nutzer:innen, die die App nicht installiert haben, werden zum App Store weitergeleitet.
Synchronisierte Medienwiedergabe
Bei synchronisierter Medienwiedergabe wird das SharePlay-Video auf allen Geräten pausiert, wenn eine Person es pausiert.

Integration
Die In-App-Nachricht, die in dieser Integration verwendet wird, ist ein unterklassifizierter modaler In-App-Nachrichten-View-Controller. Eine Anleitung zur Einrichtung finden Sie im Implementierungsleitfaden für erweiterte Anwendungsfälle von iOS-In-App-Nachrichten. Stellen Sie vor der Integration sicher, dass Sie die GroupActivities-Berechtigung zu Ihrem Xcode-Projekt hinzufügen.

Wir empfehlen, die Apple SharePlay-Dokumentation parallel zu diesem Leitfaden geöffnet zu haben, um die Integration abzuschließen.
Schritt 1: XIB überschreiben und laden
override var nibName: String {
return "ModalVideoViewController"
}
/// Overriding loadView() from ABKInAppMessageModalViewController to provide our own view for the in-app message
override func loadView() {
Bundle.main.loadNibNamed(nibName, owner: self, options: nil)
}
Schritt 2: AVPlayer für In-App-Nachrichten konfigurieren
In-App-Nachrichten können Videos nativ abspielen – mit nur geringem Entwicklungsaufwand. Dadurch haben Sie Zugriff auf alle Features des AVPlayerVideoController, wie zum Beispiel SharePlay. Die In-App-Nachricht in diesem Beispiel ist ein unterklassifizierter ABKInAppMessageModalViewController mit einer angepassten Ansicht, in die ein nativer Videoplayer eingebettet ist.
func configureVideoPlayer() {
guard let urlString = inAppMessage.extras?["video_url"] as? String,
let url = URL(string: urlString) else { return }
let videoTitle = inAppMessage.extras?["video_title"] as? String
mediaItem = MediaItem(title: videoTitle ?? "Video Content", url: url)
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
player.replaceCurrentItem(with: playerItem)
playerViewController.player = player
addChild(playerViewController)
videoPlayerContainer.addSubview(playerViewController.view)
playerViewController.didMove(toParent: self)
}
Dashboard-Konfiguration
Schlüssel-Wert-Paare: Die Videodatei muss in den Schlüssel-Wert-Paaren der In-App-Nachricht festgelegt werden und kann nicht direkt an das Medienelement angehängt werden. Sie können auch eine URL-Gültigkeitsprüfung in beforeInAppMessageDisplayed als Sicherheitsmechanismus hinzufügen, bevor der Inhalt angezeigt wird.
Triggern: Die In-App-Nachricht sollte für alle Nutzer:innen mit aktivierter erneuter Berechtigung verfügbar sein. Dies kann durch Festlegen von zwei Triggern erreicht werden: ein Standard-Trigger zum Starten der Nachricht und ein weiterer zum Starten der Nachricht, wenn sie über SharePlay initiiert wird. Nutzer:innen, die nicht iOS 15 verwenden, können Nachrichten nur lokal anzeigen.

Achten Sie auf andere In-App-Nachrichten, die beim Sitzungsstart getriggert werden und miteinander in Konflikt geraten könnten.
Schritt 3: Gemeinsame Wiedergabe-Aktivität erstellen
Erstellen Sie ein Objekt, das dem GroupActivity-Protokoll entspricht. Das Objekt enthält die Metadaten der GroupSession, die während des gesamten SharePlay-Lebenszyklus geteilt werden.
struct MediaItem: Hashable, Codable {
let title: String
let url: URL
}
@available(iOS 15, *)
struct MediaItemActivity: GroupActivity {
static let activityIdentifier = "com.book-demo.GroupWatching"
let mediaItem: MediaItem
var metadata: GroupActivityMetadata {
var metadata = GroupActivityMetadata()
metadata.type = .watchTogether
metadata.title = mediaItem.title
metadata.fallbackURL = mediaItem.url
return metadata
}
}
Wiedergabe vorbereiten
Wenn Sie die Wiedergabe des Medienelements vorbereiten, hat jede Gruppenaktivität drei Zustände von prepareForActivation():
.activationDisabled– individuelle Wiedergabe.activationPreferred– gemeinsame Wiedergabe.cancelled– ignorieren und elegant behandeln
Wenn der Zustand als activationPreferred zurückkommt, ist das Ihr Signal, den restlichen Lebenszyklus der Gruppenaktivität zu aktivieren.

Schritt 4: In-App-Nachricht über die SharePlay-API starten
Die GroupActivities-API prüft, ob ein Video vorhanden ist. Falls ja, sollten Sie das angepasste Event triggern, um Ihre SharePlay-fähige In-App-Nachricht zu starten. Der CoordinationManager ist für die Zustandsänderungen von SharePlay verantwortlich, zum Beispiel wenn Nutzer:innen den Anruf verlassen oder ihm beitreten.
private var subscriptions = Set<AnyCancellable>()
private var selectedMediaItem: MediaItem? {
didSet {
// Ensure the UI selection always represents the currently playing media.
guard let _ = selectedMediaItem else { return }
if !BrazeManager.shared.inAppMessageCurrentlyVisible {
BrazeManager.shared.logCustomEvent("SharePlay Event")
}
}
}
private func launchVideoPlayerIfNecessary() {
CoordinationManager.shared.$enqueuedMediaItem
.receive(on: DispatchQueue.main)
.compactMap { $0 }
.assign(to: \.selectedMediaItem, on: self)
.store(in: &subscriptions)
}
Schritt 5: Gruppensitzung beim Schließen der In-App-Nachricht verlassen
Wenn die In-App-Nachricht geschlossen wird, ist ein geeigneter Zeitpunkt, um die SharePlay-Sitzung zu verlassen und das Sitzungsobjekt zu verwerfen.
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
groupSession?.leave()
CoordinationManager.shared.leave()
}
class CoordinationManager() {
...
// Published values that the player, and other UI items, observe.
@Published var enqueuedMediaItem: MediaItem?
@Published var groupSession: GroupSession<MediaItemActivity>?
// Clear activity when the user leaves
func leave() {
groupSession = nil
enqueuedMediaItem = nil
}
...
}
Sichtbarkeit des SharePlay-Buttons konfigurieren
Es ist Best Practice, jeglichen SharePlay-Indikator dynamisch ein- oder auszublenden. Verwenden Sie die Variable isEligibleForGroupSession, um zu beobachten, ob sich die Nutzer:innen aktuell in einem FaceTime-Anruf befinden oder nicht. Falls sie sich in einem FaceTime-Anruf befinden, sollte ein Button sichtbar sein, um das Video auf den kompatiblen Geräten im Chat zu teilen. Wenn Nutzer:innen SharePlay zum ersten Mal initiieren, erscheint eine Aufforderung auf dem Ursprungsgerät, um die Optionen auszuwählen. Anschließend erscheint eine weitere Aufforderung auf den Geräten der anderen Nutzer:innen, um mit dem Inhalt zu interagieren.
private var isEligibleForSharePlay: Bool = false {
didSet {
sharePlayButton.isHidden = !isEligibleForSharePlay
}
}
override func viewDidLoad() {
super.viewDidLoad()
// SharePlay button eligibility
groupStateObserver.$isEligibleForGroupSession
.receive(on: DispatchQueue.main)
.assign(to: \.isEligibleForSharePlay, on: self)
.store(in: &subscriptions)
}