Reklam araları
iOS Sender SDK, belirli bir medya akışı içindeki reklam araları ve tamamlayıcı reklamlar için destek sağlar.
Reklam aralarının nasıl çalıştığı hakkında daha fazla bilgi için Web Alıcı Reklam Aralarına Genel Bakış bölümüne bakın.
Aralar hem gönderen hem de alıcı için belirtilebilir. Ancak platformlar arasında tutarlı bir davranış sürdürebilmek için araların Web Alıcısı ve Android TV Alıcısı'nda belirtilmesi önerilir.
iOS'ta GCKAdBreakClipInfo
ve GCKAdBreakInfo
komutlarını kullanarak 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, geçerli medya öğesinin oynatma hızını görüntüleyip değiştirebilir.
-[setPlaybackRate:]
veya GCKRemoteMediaClient
öğesinin
-[setPlaybackRate:customData:]
kadarını kullanarak hızı ayarlayabilir,
GCKUIMediaController
öğesinin playbackRateController
üzerinden GCKUIPlaybackRateController
öğesine erişebilir ve GCKUIPlaybackRateController
öğesinin playbackRate
değerini kullanarak mevcut oynatma hızını görüntüleyebilirsiniz.
Örnek kod
Aşağıdaki iki dosyada "normal", "yarı hız" ve "çift hız" düğmelerine sahip segmentlere ayrılmış bir kontrol kullanarak oynatma hızını kontrol eden GCKUIPlaybackRateController
uygulanır:
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 ekleyin
Cast çerçevesi, bir Web Alıcısına özel mesajlar göndermek üzere kanal oluşturmak için iki yol sunar:
GCKCastChannel
, ilişkili eyalete sahip önemsiz kanalları uygulamak için alt sınıflandırılır.- Alt sınıflandırmaya alternatif olarak
GCKGenericChannel
sağlanır. Aldığı mesajları, başka bir yerde işlenebilmesi için yetki verilen kullanıcıya 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
Bir kanal herhangi bir zamanda kaydedilebilir. Oturum şu anda bağlı durumda değilse kanal ad alanının Web Alıcısı uygulamasının meta verileri listesinde bulunması koşuluyla, oturumun kendisi 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 (ör. urn:x-cast:com.example.custom
) başlamalıdır. Her biri benzersiz bir ad alanına sahip birden çok özel kanalınız olabilir. Web Alıcı uygulaması, aynı ad alanını kullanarak mesaj gönderip alabilir de.
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
kapsamındaki -[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ünü inceleyin.
Resim seçimini ve önbelleğe almayı geçersiz kıl
Çerçevenin çeşitli bileşenlerinde (yani Cast iletişim kutusu, mini denetleyici, genişletilmiş denetleyici ve yapılandırılmışsa GCKUIMediaController
) o anda yayınlanan medya için poster görüntülenir. Resim posterinin URL'leri genellikle medya için GCKMediaMetadata
içine dahil edilir ancak gönderen uygulaması, URL'ler için alternatif bir kaynağa sahip olabilir.
GCKUIImagePicker
protokolü, belirli bir kullanım ve istenen boyut için uygun görüntüyü seçmeye yönelik bir yöntem tanımlar. Parametre olarak bir GCKUIImageHints
ve bir GCKMediaMetadata
nesnesi alan ve sonuç olarak bir GCKImage
nesnesi döndüren tek bir yönteme (-[getImageWithHints:fromMetadata:]
) sahiptir. Çerçeve, varsayılan olarak GCKUIImagePicker
uygulamasını sağlar. Bu uygulama her zaman GCKMediaMetadata
nesnesindeki görüntüler listesindeki ilk resmi seçer ancak uygulama, GCKCastContext
single'ının imagePicker
özelliğini ayarlayarak alternatif bir uygulama sunabilir.
GCKUIImageCache
protokolü, HTTPS kullanılarak çerçeve tarafından indirilen görüntülerin önbelleğe alınması için de bir yöntem tanımlar. Çerçeve, indirilen resim dosyalarını uygulamanın önbellek dizininde depolayan varsayılan GCKUIImageCache
uygulamasını sağlar. Ancak uygulama, GCKCastContext
single'ının imageCache
özelliğini ayarlayarak alternatif bir uygulama sunabilir.
Sonraki adımlar
iOS Sender uygulamanıza ekleyebileceğiniz özellikler burada tamamlanıyor. Artık başka bir platform (Android veya Web) için bir gönderen uygulaması ya da bir Web Alıcısı oluşturabilirsiniz.