
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 Framework GroupActivities, das Apple im Rahmen des iOS 15 Updates veröffentlicht hat, erlaubt es Ihnen, FaceTime zu nutzen, indem Sie SharePlay mit Hilfe der In-App-Nachrichten von Braze in Ihre Anwendungen integrieren.

Wenn Nutzer:innen ein SharePlay-Video in einem FaceTime-Anruf initiieren, erscheint ein „Öffnen“-Button am oberen Rand des Bildschirms aller Teilnehmer:innen. Nach dem Öffnen werden Audio und Video auf allen kompatiblen Geräten synchronisiert, sodass Nutzer:innen gemeinsam Videos in Realtime ansehen können. Diejenigen, die die App nicht heruntergeladen haben, werden zum App Store weitergeleitet.
Synchrone Medienwiedergabe
Bei der synchronisierten Medienwiedergabe wird das SharePlay-Video, wenn es von einer Person angehalten wird, auf allen Geräten angehalten.

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

Wir empfehlen, die Apple SharePlay-Dokumentation parallel zu dieser Anleitung zu öffnen, um die Integration abzuschließen.
1. Schritt: Überschreiben und Laden von XIB
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)
}
2. Schritt: AVPlayer für In-App-Nachrichten konfigurieren
In-App-Nachrichten können mit geringem Entwicklungsaufwand nativ Videos abspielen. Auf diese Weise haben Sie Zugriff auf alle Features von AVPlayerVideoController, wie z. B. SharePlay. Die für dieses Beispiel verwendete In-App-Nachricht ist eine Unterklasse von ABKInAppMessageModalViewController, die über eine angepasste Ansicht verfügt, um einen nativen Video-Player einzubetten.
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 angegeben werden und kann nicht an das Medienelement selbst angehängt werden. Sie können auch eine URL-Gültigkeitsprüfung in beforeInAppMessageDisplayed als Sicherheitsmechanismus hinzufügen, bevor Sie den Inhalt anzeigen.
Trigger: Die In-App-Nachricht sollte für alle Nutzer:innen mit aktivierter erneuter Berechtigung zugänglich sein. Dazu können Sie zwei Trigger festlegen: einen Standard-Trigger, um die Nachricht zu starten, und einen weiteren, um die Nachricht zu starten, wenn sie von SharePlay initiiert wird. Nutzer:innen, die nicht über iOS 15 verfügen, können Nachrichten nur lokal einsehen.

Achten Sie auf andere In-App-Nachrichten, die beim Start der Sitzung getriggert werden und miteinander in Konflikt geraten können.
3. Schritt: Gruppenbeobachtungsaktivität erstellen
Erstellen Sie ein Objekt, das dem Protokoll GroupActivity entspricht. Bei dem Objekt handelt es sich um die Metadaten der GroupSession, die während des SharePlay-Lebenszyklus gemeinsam genutzt 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– einzeln ansehen.activationPreferred– gemeinsam ansehen.cancelled– ignorieren und ordnungsgemäß behandeln
Wenn der Status als activationPreferred zurückkommt, ist das Ihr Signal, den Rest des Lebenszyklus der Gruppenaktivität zu aktivieren.

4. Schritt: In-App-Nachricht über die SharePlay-API starten
Die GroupActivities-API ermittelt, ob ein Video vorhanden ist. Wenn 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, z. B. 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)
}
5. Schritt: Gruppensitzung beim Verwerfen der In-App-Nachricht verlassen
Wenn die In-App-Nachricht verworfen 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 empfiehlt sich, jeden SharePlay-Indikator dynamisch aus- oder einzublenden. Verwenden Sie die Variable isEligibleForGroupSession, um festzustellen, ob die Nutzer:innen gerade ein FaceTime-Gespräch führen oder nicht. Wenn ja, sollte ein Button sichtbar sein, mit dem das Video für alle kompatiblen Geräte im Chat geteilt werden kann. Wenn Nutzer:innen zum ersten Mal SharePlay starten, erscheint auf dem ursprünglichen Gerät eine Aufforderung zur Auswahl der Optionen. Auf den Geräten der eingeladenen Nutzer:innen erscheint dann eine Aufforderung, sich mit dem Inhalt zu beschäftigen.
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)
}