iOS Uygulamanıza Gelişmiş Özellikler Ekleme

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:

Hızlı
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. Ü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:

Hızlı
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, özel mesajlar göndermek için kanal oluşturmanın iki yolu sunar. gönderme:

  1. GCKCastChannel , içeriği veya erişimi olan sıra dışı kanalları uygulamak için ilişkili olduğunu gösterir.
  2. 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:

Hızlı
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ı 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ı uygulaması meta verilerinin 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 olan birden çok özel kanala sahip olmak mümkündür. İlgili içeriği oluşturmak için kullanılan Web Alıcı uygulaması ayrıca gönderip alabilir mesaj aynı ad alanını kullanır.

Hızlı
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 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.