iOS Uygulamanıza Gelişmiş Özellikler Ekleme

Reklam Araları

iOS Gönderen SDK'sı, belirli bir medya akışındaki Reklam Araları ve tamamlayıcı reklamlar için destek sağlar.

Reklam Aralarının işleyiş şekliyle ilgili daha fazla bilgi için Web Alıcı Reklam Aralarına Genel Bakış bölümüne göz atın.

Aralar hem gönderen hem de alıcıda belirtilebilir. Bununla birlikte, platformlar arasında tutarlı bir davranış sağlamak için bunların Web Alıcı ve Android TV Alıcısı'nda belirtilmesi önerilir.

iOS'te GCKAdBreakClipInfo ve GCKAdBreakInfo ifadelerini kullanarak bir yükleme komutunda Reklam Araları belirtin:

İsviçre
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())
Hedef C
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üleyip değiştirebilir. Ücreti, GCKRemoteMediaClient öğesinin -[setPlaybackRate:] veya -[setPlaybackRate:customData:] kadarını kullanarak ayarlayabilir, GCKUIMediaController öğesinin playbackRateController özelliğini kullanarak GCKUIPlaybackRateController özelliğine erişebilir ve GCKUIPlaybackRateController öğesinin playbackRate kadarını 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ış kontrol kullanılarak oynatma hızını kontrol eden GCKUIPlaybackRateController uygulanır:

İsviçre
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
  }
}
Hedef C

SegmentedButtonPlayRateController.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

SegmentedButtonPlayRateController.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 ekle

Yayın çerçevesi, bir Web Alıcısına özel mesajlar göndermek için bir kanal oluşturmanın iki yolunu sunar:

  1. GCKCastChannel, ilişkili durumuna sahip, önemsiz olmayan kanalları uygulamak için alt sınıflara ayrılır.
  2. GCKGenericChannel alt sınıflara alternatif olarak sunulur. Alınan mesajları başka bir yerde işlenmeleri için yetki verilmiş kullanıcılara aktarır.

Aşağıda GCKCastChannel uygulamasına bir örnek verilmiştir:

İsviçre
class HGCTextChannel: GCKCastChannel {
  override func didReceiveTextMessage(_ message: String) {
    print("received message: \(message)")
  }
}
Hedef C

HGC MetinKanalı

#import <GoogleCast/GCKCastChannel.h>

@interface HGCTextChannel : GCKCastChannel

@end

HGC MetinKanalı.m

#import "HGCTextChannel.h"

@implementation HGCTextChannel
- (void)didReceiveTextMessage:(NSString*)message {
  NSLog(@"received message: %@", message);
}

@end

Bir kanalı istediğiniz zaman kaydedebilirsiniz. Oturum şu anda bağlı durumda değilse, kanalın ad alanı Web Alıcısı uygulama meta verilerinin desteklenen ad alanları listesinde yer alması koşuluyla, kanal kendi oturumu bağlandığında otomatik olarak bağlanır.

Her özel kanal benzersiz bir ad alanı ile tanımlanır ve urn:x-cast: ön eki ile başlamalıdır (ör. urn:x-cast:com.example.custom). Her biri benzersiz bir ad alanına sahip birden çok özel kanala sahip olmak mümkündür. Web Alıcısı uygulaması, aynı ad alanını kullanarak mesajları gönderip alabilir.

İsviçre
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)")
}
Hedef C
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ının kesilmesi durumunda yürütülmesi gereken mantık sağlamak için GCKCastChannel kullanılıyorsa -[didConnect] ve -[didDisconnect] yöntemlerini geçersiz kılın; GCKGenericChannel kullanıyorsanız GCKGenericChannelDelegate yöntemi için -[castChannelDidConnect:] ve -[castChannelDidDisconnect:] yöntemlerini uygulayın.

Otomatik Oynatmayı Destekleme

API'leri Otomatik Oynatma ve Sıraya Ekleme bölümüne bakın.

Resim seçimini ve önbelleğe almayı geçersiz kılın

Çerçevenin çeşitli bileşenleri (Yayın diyalogları, mini kumanda, genişletilmiş kumanda ve yapılandırıldıysa GCKUIMediaController) o anda yayınlanan medyanın posterini gösterir. Resim çiziminin URL'leri genellikle medya için GCKMediaMetadata bölümüne dahil edilir 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 aracı tanımlar. Tek bir yöntem olan -[getImageWithHints:fromMetadata:], parametre olarak bir GCKUIImageHints nesnesi ile bir GCKMediaMetadata nesnesi alıp sonuç olarak bir GCKImage nesnesi döndürür. Çerçeve, GCKMediaMetadata nesnesindeki resim listesindeki ilk resmi her zaman seçen varsayılan bir GCKUIImagePicker uygulaması sağlar. Ancak uygulama, GCKCastContext singleonunun imagePicker özelliğini ayarlayarak alternatif bir uygulama sağlayabilir.

GCKUIImageCache protokolü, çerçeve tarafından indirilen resimleri HTTPS kullanarak önbelleğe almanın bir yolunu da tanımlar. Bu çerçeve, indirilen resim dosyalarını uygulamanın önbellek dizininde depolayan varsayılan bir GCKUIImageCache uygulaması sağlar. Ancak uygulama, GCKCastContext Singleton'unun imageCache özelliğini ayarlayarak alternatif bir uygulama sağlayabilir.

Sonraki adımlar

iOS Gönderen uygulamanıza ekleyebileceğiniz özellikleri sonlandırıyoruz. Artık başka bir platform (Android veya Web) için bir gönderen uygulaması veya Web Alıcısı oluşturabilirsiniz.