iOS Uygulamanıza Gelişmiş Özellikler Ekleme

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:

Swift
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, 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:

Swift
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

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:

  1. GCKCastChannel, ilişkili eyalete sahip önemsiz kanalları uygulamak için alt sınıflandırılır.
  2. 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:

Swift
class HGCTextChannel: GCKCastChannel {
  override func didReceiveTextMessage(_ message: String) {
    print("received message: \(message)")
  }
}
Hedef-C

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.

Swift
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ı 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.