Reklam Araları
iOS gönderen SDK'sı, belirli bir medya akışında reklam araları ve tamamlayıcı reklamlar için destek sağlar.
Reklam aralarının işleyiş şekli hakkında daha fazla bilgi için Web Alıcısı Reklam Aralarına Genel Bakış başlıklı makaleyi inceleyin.
Reklam araları hem gönderende hem de alıcıda belirtilebilir ancak platformlar arasında tutarlı bir davranış sağlamak için Web Alıcısı ve Android TV Alıcısı'nda belirtilmesi önerilir.
iOS'te, GCKAdBreakClipInfo ve GCKAdBreakInfo kullanarak bir yükleme komutunda reklam aralarını belirtin:
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]];
Değişken oynatma hızı
Uygulamanız, mevcut medya öğesinin oynatma hızını görüntüleyebilir ve değiştirebilir.
GCKRemoteMediaClient öğesinin -[setPlaybackRate:] veya -[setPlaybackRate:customData:] özelliğini kullanarak hızı ayarlayabilir, GCKUIMediaController öğesinin playbackRateController özelliğini kullanarak GCKUIPlaybackRateController öğesine erişebilir ve GCKUIPlaybackRateController öğesinin playbackRate özelliğini kullanarak mevcut oynatma hızını görüntüleyebilirsiniz.
Örnek kod
Aşağıdaki iki dosya, "normal", "yarı hız" ve "iki kat hız" düğmelerine sahip segmentlere ayrılmış bir kontrol kullanarak oynatma hızını kontrol eden GCKUIPlaybackRateController öğesini uygular:
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
Özel kanal ekleme
Cast çerçevesi, Web Alıcısı'na özel mesajlar göndermek için kanal oluşturmanın iki yolunu sunar:
GCKCastChannel, ilişkili durumu olan önemsiz kanalları uygulamak için alt sınıfa ayrılacak şekilde tasarlanmıştır.GCKGenericChannel, alt sınıf oluşturmaya alternatif olarak sunulur. Aldığı mesajları, başka bir yerde işlenebilmeleri için bir temsilciye iletir.
Aşağıda bir GCKCastChannel uygulaması örneği verilmiştir:
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
Kanal her zaman kaydedilebilir. Oturum şu anda bağlı durumda değilse kanalın ad alanı, Web Alıcısı uygulaması meta verilerinin desteklenen ad alanları listesinde mevcut olduğu sürece oturum bağlandığında kanal otomatik olarak bağlanır.
Her özel kanal, benzersiz bir ad alanıyla tanımlanır ve urn:x-cast: ön ekiyle başlamalıdır (ör. urn:x-cast:com.example.custom). Her biri benzersiz bir ad alanına sahip birden fazla özel kanalınız olabilir. Web Alıcısı uygulaması, aynı ad alanını kullanarak mesaj gönderip alabilir.
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); }
Belirli bir kanal bağlandığında veya bağlantısı kesildiğinde yürütülmesi gereken mantığı sağlamak için GCKCastChannel kullanıyorsanız -[didConnect] ve -[didDisconnect] yöntemlerini geçersiz kılın veya GCKGenericChannel kullanıyorsanız GCKGenericChannelDelegate'nin -[castChannelDidConnect:] ve -[castChannelDidDisconnect:] yöntemleri için uygulamalar sağlayın.
Otomatik oynatmayı destekleme
Otomatik oynatma ve sıraya ekleme API'leri bölümüne bakın.
Resim seçimini ve önbelleğe almayı geçersiz kılma
Çerçevenin çeşitli bileşenleri (ör. Cast iletişim kutusu, mini kumanda, genişletilmiş kumanda ve yapılandırılmışsa GCKUIMediaController), yayınlanan medyanın posterini gösterir. Resim posterinin URL'leri genellikle medyanın GCKMediaMetadata öğesine eklenir ancak gönderen uygulamanın URL'ler için alternatif bir kaynağı olabilir.
GCKUIImagePicker protokolü, belirli bir kullanım ve istenen boyut için uygun bir resim seçme yöntemini tanımlar. -[getImageWithHints:fromMetadata:] adlı tek bir yöntemi vardır. Bu yöntem, parametre olarak bir GCKUIImageHints nesnesi ve bir GCKMediaMetadata nesnesi alır ve sonuç olarak bir GCKImage nesnesi döndürür. Çerçeve, GCKMediaMetadata nesnesindeki resim listesinden her zaman ilk resmi seçen varsayılan bir GCKUIImagePicker uygulaması sağlar ancak uygulama, GCKCastContext singleton'ının imagePicker özelliğini ayarlayarak alternatif bir uygulama sağlayabilir.
GCKUIImageCache protokolü, HTTPS kullanılarak çerçeve tarafından indirilen resimlerin önbelleğe alınması için bir yöntem de tanımlar. Çerçeve, indirilen resim dosyalarını uygulamanın önbellek dizininde depolayan varsayılan bir GCKUIImageCache uygulaması sağlar ancak uygulama, GCKCastContext singleton'un imageCache özelliğini ayarlayarak alternatif bir uygulama sağlayabilir.
Sonraki adımlar
iOS gönderen uygulamanıza ekleyebileceğiniz özellikler bu kadar. Artık başka bir platform (Android veya Web) için gönderen uygulaması ya da Web Alıcısı oluşturabilirsiniz.