Reklam araları
iOS Gönderen SDK'sı, veri akışı sağlar.
Bkz. Daha fazla bilgi için Web Alıcı Reklam Aralarına Genel Bakış reklam aralarının işleyiş şekli hakkında bilgi edinin.
Hem gönderen hem de alıcı için aralar belirtilse de araların hem gönderen hem de alıcı için belirtilmesi önerilir. Web Alıcısı'nda ve Tutarlılık için Android TV Alıcısı tespit etmiş olursunuz.
iOS'ta, şunu kullanarak bir yükleme komutunda Reklam aralarını belirtin:
GCKAdBreakClipInfo
ve 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]];
Değişken oynatma hızı
Uygulamanız, geçerli medya öğesinin oynatma hızını görüntüleyip değiştirebilir.
Ücreti -[setPlaybackRate:]
veya
-[setPlaybackRate:customData:]
GCKRemoteMediaClient
,
şunun playbackRateController
kullanarak GCKUIPlaybackRateController
erişin:
GCKUIMediaController
ve geçerli oynatma hızını şunun playbackRate
kullanarak görüntüleyin:
GCKUIPlaybackRateController
.
Örnek kod
Aşağıdaki iki dosyada, kontrol eden GCKUIPlaybackRateController
"normal", "yarı hız" ve "yarı hız" seçenekleri olan segmentlere ayrılmış bir kontrol kullanarak oynatma hızını
"çift hız" düğmeler:
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, özel mesajlar göndermek için kanal oluşturmanın iki yolu sunar. gönderme:
GCKCastChannel
, içeriği veya erişimi olan sıra dışı kanalları uygulamak için ilişkili olduğunu gösterir.GCKGenericChannel
alt sınıflandırmaya alternatif olarak sunulur; CANNOT TRANSLATE Yetki verilmiş bir kullanıcıya gönderilen iletileri bu şekilde düzenleyebilir.
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ı istediğiniz zaman kaydettirebilirsiniz. oturum şu anda bağlantı kurulduğunda kanal, otomatik olarak kanalın ad alanının mevcut olması koşuluyla oturumun kendisinin bağlı Web Alıcısı uygulamasının meta verilerindeki desteklenen ad alanları listesi
Her özel kanal, benzersiz bir ad alanıyla tanımlanır ve
öneki urn:x-cast:
, örneğin, urn:x-cast:com.example.custom
. Evet
her biri benzersiz bir ad alanına sahip birden fazla özel kanal bulunabilir. İlgili içeriği oluşturmak için kullanılan
Web Alıcı uygulaması ayrıca gönderip alabilir
mesaj
aynı ad alanı kullanılarak oluşturulur.
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 kullanıma sunulduğunda yürütülmesi gereken mantığı sağlamak için
bağlı veya bağlantısı kesildiğinde, -[didConnect]
ve -[didDisconnect]
geçersiz kılınır
GCKCastChannel
veya
-[castChannelDidConnect:]
ve
-[castChannelDidDisconnect:]
GCKGenericChannelDelegate
GCKGenericChannel
kullanıyorsanız.
Otomatik oynatmayı destekleme
Bkz. Otomatik oynatma ve Sıraya alma API'leri
Resim seçimini ve önbelleğe almayı geçersiz kıl
Çerçevenin çeşitli bileşenleri (ör. Cast iletişim kutusu, mini
genişletilmiş denetleyiciye ve
GCKUIMediaController
yapılandırıldıysa) şu anda yayınlanan medya için poster görüntüler. URL'ler
genellikle 2023'te yayınlanan bir
GCKMediaMetadata
ancak gönderen uygulamada URL'ler için alternatif bir kaynak olabilir.
İlgili içeriği oluşturmak için kullanılan
GCKUIImagePicker
protokol belirli bir kullanım için uygun bir görüntü seçmek için bir yöntem tanımlar
ve istediğiniz boyutu seçin. Tek bir yöntem vardır: -[getImageWithHints:fromMetadata:]
Bu da
GCKUIImageHints
nesne ve bir
GCKMediaMetadata
nesnesini parametre olarak belirtir ve bir
olarak GCKImage
yardımcı olur. Çerçeve, varsayılan olarak
GCKUIImagePicker
. Bu seçim, her zaman
GCKMediaMetadata
nesnesini tanımlar, ancak uygulama alternatif bir nesne sağlayabilir
imagePicker
özelliğini ayarlayarak
GCKCastContext
singleton.
İlgili içeriği oluşturmak için kullanılan
GCKUIImageCache
protokolü tarafından indirilen görüntülerin önbelleğe alınmasını da
çerçevesini kullandığınızdan emin olun. Çerçeve, varsayılan olarak
İndirilen resim dosyalarını uygulamanın önbelleğinde depolayan GCKUIImageCache
dizinini oluşturur, ancak uygulama,
imageCache
özelliği
GCKCastContext
singleton.
Sonraki adımlar
iOS Sender uygulamanıza ekleyebileceğiniz özellikler burada sonlandırılmıştır. Artık başka bir platform için gönderen uygulaması oluşturabilirsiniz (Android veya Web), veya bir Web Alıcısı oluşturun.