Werbeunterbrechungen
Das iOS Sender SDK unterstützt Werbeunterbrechungen und Companion-Anzeigen in einer einen bestimmten Mediastream zu erstellen.
Weitere Informationen finden Sie in der Übersicht über Werbeunterbrechungen bei Webempfängern Informationen zur Funktionsweise von Werbeunterbrechungen.
Pausen können zwar sowohl beim Sender als auch beim Empfänger angegeben werden, es wird jedoch empfohlen, Web Receiver und Android TV-Receiver für einheitliches Design auf verschiedenen Plattformen.
Auf iOS-Geräten geben Sie Werbeunterbrechungen in einem Ladebefehl mit
GCKAdBreakClipInfo
und GCKAdBreakInfo
:
let breakClip1Builder = GCKAdBreakClipInfoBuilder(adBreakClipID: "bc0") breakClip1Builder.title = "Clip title" if let posterUrl = URL(string: "https://www.some.url") { breakClip1Builder.posterURL = posterUrl } breakClip1Builder.duration = 60 breakClip1Builder.whenSkippable = 5 // Set this field so that the ad is skippable let breakClip1 = breakClip1Builder.build() let breakClip2 = ... let breakClip3 = ... let break1 = GCKAdBreakInfoBuilder(adBreakID: "b0", adBreakClipIds: ["bc0", "bc1", "bc2"]).build() let mediaInfoBuilder = GCKMediaInformationBuilder(entity: "entity") ... mediaInfoBuilder.adBreaks = [break1] mediaInfoBuilder.adBreakClips = [breakClip1, breakClip2, breakClip3] ... mediaInformation = mediaInfoBuilder.build() let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder() mediaLoadRequestDataBuilder.mediaInformation = mediaInformation sessionManager.currentSession?.remoteMediaClient?.loadMedia(with: mediaLoadRequestDataBuilder.build())
GCKAdBreakClipInfoBuilder *breakClipInfoBuilder = [[GCKAdBreakClipInfoBuilder alloc] initWithAdBreakClipID:@"bc0"]; breakClipInfoBuilder.title = @"Clip title"; breakClipInfoBuilder.posterURL = [[NSURL alloc] initWithString:@"https://www.some.url"]; breakClipInfoBuilder.duration = 60; breakClipInfoBuilder.whenSkippable = 5; GCKAdBreakClipInfo *breakClip1 = breakClipInfoBuilder.build; GCKAdBreakClipInfo *breakClip2 = ... GCKAdBreakClipInfo *breakClip3 = ... GCKAdBreakInfo *break1 = [[GCKAdBreakInfoBuilder alloc] initWithAdBreakID:@"b0" adBreakClipIds:@[@"bc0", @"bc1", @"bc2"]].build; GCKMediaInformationBuilder *mediaInfoBuilder = [[GCKMediaInformationBuilder alloc] initWithEntity:@"entity"]; ... mediaInfoBuilder.adBreaks = @[break1]; mediaInfoBuilder.adBreakClips = @[breakClip1, breakClip2, breakClip3]; ... self.mediaInformation = [mediaInfoBuilder build]; GCKMediaLoadRequestDataBuilder *mediaLoadRequestDataBuilder = [[GCKMediaLoadRequestDataBuilder alloc] init]; mediaLoadRequestDataBuilder.mediaInformation = self.mediaInformation; // Send a load request to the remote media client. GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMediaWithLoadRequestData:[mediaLoadRequestDataBuilder build]];
Variable Wiedergaberate
Deine App kann die Wiedergabegeschwindigkeit für das aktuelle Medienelement anzeigen und ändern.
Sie können den Preis mit -[setPlaybackRate:]
festlegen oder
-[setPlaybackRate:customData:]
von
GCKRemoteMediaClient
,
Zugriff auf GCKUIPlaybackRateController
mithilfe von playbackRateController
der
GCKUIMediaController
und die aktuelle Wiedergaberate mit playbackRate
der
GCKUIPlaybackRateController
Beispielcode
In den folgenden beiden Dateien wird GCKUIPlaybackRateController
implementiert, das steuert,
Wiedergabegeschwindigkeit mithilfe eines segmentierten Steuerelements
mit den Werten „normal“, „halbe Geschwindigkeit“
"doppelte Geschwindigkeit" Schaltflächen:
import GoogleCast /** * An implementation of GCKUIPlaybackRateController that controls playback rate * using a segmented control that has "normal", "half speed", and "double speed" * buttons. */ class SegmentedButtonPlaybackRateController: GCKUIPlaybackRateController { static let kSegmentNormal = 0; static let kSegmentHalfSpeed = 1; static let kSegmentDoubleSpeed = 2; var segmentedControl: UISegmentedControl! override var playbackRate: Float { didSet { var buttonIndex = 0 // Map the playback rate to one of our three supported speeds. if playbackRate == 1.0 { buttonIndex = SegmentedButtonPlaybackRateController.kSegmentNormal } else if playbackRate < 1.0 { buttonIndex = SegmentedButtonPlaybackRateController.kSegmentHalfSpeed } else { buttonIndex = SegmentedButtonPlaybackRateController.kSegmentDoubleSpeed } segmentedControl?.selectedSegmentIndex = buttonIndex } } override var inputEnabled: Bool { didSet { segmentedControl?.isEnabled = inputEnabled } } /** * Designated initializer. * * @param segmentedControl The segmented control for changing/displaying the * playback rate. */ convenience init(_ segmentedControl: UISegmentedControl) { self.init() self.segmentedControl = segmentedControl; segmentedControl.addTarget(self, action: #selector(segmentedControlTapped(sender:)), for: UIControl.Event.valueChanged) } @objc func segmentedControlTapped(sender: UISegmentedControl) { var playbackRate: Float = 1.0 switch segmentedControl?.selectedSegmentIndex { case SegmentedButtonPlaybackRateController.kSegmentHalfSpeed: playbackRate = 0.5; case SegmentedButtonPlaybackRateController.kSegmentDoubleSpeed: playbackRate = 2.0; case SegmentedButtonPlaybackRateController.kSegmentNormal: fallthrough default: playbackRate = 1.0; } self.playbackRate = playbackRate } }
SegmentedButtonPlaybackRateController.h
#import <GoogleCast/GoogleCast.h> #import <UIKit/UIKit.h> /** * An implementation of GCKUIPlaybackRateController that controls playback rate * using a segmented control that has "normal", "half speed", and "double speed" * buttons. */ @interface SegmentedButtonPlaybackRateController : GCKUIPlaybackRateController /** * Designated initializer. * * @param segmentedControl The segmented control for changing/displaying the * playback rate. */ - (instancetype)initWithSegmentedControl:(UISegmentedControl *)segmentedControl; @end
SegmentedButtonPlaybackRateController.m
#import "SegmentedButtonPlaybackRateController.h" @interface SegmentedButtonPlaybackRateController () { UISegmentedControl *_segmentedControl; } @end static const NSInteger kSegmentNormal = 0; static const NSInteger kSegmentHalfSpeed = 1; static const NSInteger kSegmentDoubleSpeed = 2; @implementation SegmentedButtonPlaybackRateController - (instancetype)initWithSegmentedControl:(UISegmentedControl *)segmentedControl { if (self = [super init]) { _segmentedControl = segmentedControl; [_segmentedControl addTarget:self action:@selector(segmentedControlTapped:) forControlEvents:UIControlEventValueChanged]; } return self; } - (void)setPlaybackRate:(float)playbackRate { [super setPlaybackRate:playbackRate]; NSInteger buttonIndex = 0; // Map the playback rate to one of our three supported speeds. if (playbackRate == 1.0) { buttonIndex = kSegmentNormal; } else if (playbackRate < 1.0) { buttonIndex = kSegmentHalfSpeed; } else { buttonIndex = kSegmentDoubleSpeed; } _segmentedControl.selectedSegmentIndex = buttonIndex; } - (void)setInputEnabled:(BOOL)inputEnabled { _segmentedControl.enabled = inputEnabled; [super setInputEnabled:inputEnabled]; } - (void)segmentedControlTapped:(id)sender { float playbackRate; switch (_segmentedControl.selectedSegmentIndex) { case kSegmentHalfSpeed: playbackRate = 0.5; break; case kSegmentDoubleSpeed: playbackRate = 2.0; break; case kSegmentNormal: default: playbackRate = 1.0; break; } self.playbackRate = playbackRate; } @end
Benutzerdefinierten Channel hinzufügen
Das Cast-Framework bietet zwei Möglichkeiten, einen Kanal zum Senden benutzerdefinierter Nachrichten zu erstellen. zu einem Web Receiver:
GCKCastChannel
ist als Unterklassifikation gedacht, um nicht triviale Kanäle zu implementieren, verknüpft ist.GCKGenericChannel
wird als Alternative zu Unterklassen bereitgestellt. und die empfangenen Nachrichten an einen Bevollmächtigten senden, damit sie an anderer Stelle verarbeitet werden können.
Hier ein Beispiel für eine GCKCastChannel
-Implementierung:
class HGCTextChannel: GCKCastChannel { override func didReceiveTextMessage(_ message: String) { print("received message: \(message)") } }
HGCTextChannel.h
#import <GoogleCast/GCKCastChannel.h> @interface HGCTextChannel : GCKCastChannel @end
HGCTextChannel.m
#import "HGCTextChannel.h" @implementation HGCTextChannel - (void)didReceiveTextMessage:(NSString*)message { NSLog(@"received message: %@", message); } @end
Ein Kanal kann jederzeit registriert werden. Sitzung nicht in einer verbunden ist, wird der Kanal automatisch verbunden, wenn der Sitzung selbst verbunden ist, vorausgesetzt, dass der Namespace des Kanals in In der Metadatenliste der unterstützten Namespaces der Web Receiver-Anwendung
Jeder benutzerdefinierte Channel wird durch einen eindeutigen Namespace definiert und muss mit
Präfix urn:x-cast:
, z. B. urn:x-cast:com.example.custom
. Es ist
Mehrere benutzerdefinierte Channels mit jeweils einem eigenen Namespace sind möglich. Die
Die Web Receiver-App kann auch
Nachrichten
mit demselben Namespace.
var error: GCKError? let textChannel = HGCTextChannel.init(namespace: "urn:x-cast:com.google.cast.sample.helloworld") sessionManager.currentCastSession?.add(textChannel) textChannel.sendTextMessage("Hello World", error: &error) if error != nil { print("Error sending text message \(error.debugDescription)") }
NSError *error; HGCTextChannel *textChannel = [[HGCTextChannel alloc] initWithNamespace:@"urn:x-cast:com.google.cast.sample.helloworld"]; [sessionManager.currentCastSession addChannel:textChannel]; [textChannel sendTextMessage:@"Hello World" error:&error]; if (error != nil) { NSLog(@"Error sending text message: %@", error); }
Um Logik bereitzustellen, die ausgeführt werden muss, wenn ein bestimmter Channel
verbunden oder getrennt, überschreiben Sie -[didConnect]
und -[didDisconnect]
wenn Sie
GCKCastChannel
oder
Implementierungen für -[castChannelDidConnect:]
und
-[castChannelDidDisconnect:]
-Methoden der
GCKGenericChannelDelegate
wenn Sie GCKGenericChannel
verwenden.
Autoplay unterstützen
Weitere Informationen finden Sie unter Autoplay und Queueing APIs (Warteschlangen-APIs).
Bildauswahl und Caching überschreiben
Verschiedene Komponenten des Frameworks, darunter das Cast-Dialogfeld, die Miniversion
den erweiterten Controller und den
GCKUIMediaController
sofern konfiguriert), wird das Artwork für die aktuell gestreamten Medien angezeigt. Die URLs
sind in der Regel im
GCKMediaMetadata
für die Medien, aber die Absender-App hat möglicherweise eine alternative Quelle für die URLs.
Die
GCKUIImagePicker
-Protokoll definiert ein Mittel zur Auswahl eines geeigneten Bildes für eine bestimmte Verwendung
und die gewünschte Größe. Es gibt die Methode -[getImageWithHints:fromMetadata:]
,
Das ist eine
GCKUIImageHints
-Objekt und ein
GCKMediaMetadata
als Parameter und gibt ein
GCKImage
-Objekt als
Ergebnis. Das Framework bietet eine Standardimplementierung
GCKUIImagePicker
: Dadurch wird immer das erste Bild in der Liste der Bilder in ausgewählt.
Das GCKMediaMetadata
-Objekt, aber die App kann ein alternatives Objekt bereitstellen.
indem Sie die Eigenschaft imagePicker
der
GCKCastContext
Singleton.
Die
GCKUIImageCache
definiert auch eine Möglichkeit zum Caching von Bildern, die vom
Framework mit HTTPS. Das Framework bietet eine Standardimplementierung
GCKUIImageCache
zum Speichern heruntergeladener Bilddateien im Cache der App
-Verzeichnis. Die Anwendung kann jedoch eine alternative Implementierung bieten, indem die Methode
imageCache
-Eigenschaft des
GCKCastContext
Singleton.
Nächste Schritte
Damit sind die Funktionen beendet, die Sie Ihrer iOS-Sender-App hinzufügen können. Du kannst jetzt eine Absender-App für eine andere Plattform erstellen (Android oder Web) oder erstellen Sie einen Web Receiver.