
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
1
2
3
4
5
6
7
8
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)
}