iOS 앱에 고급 기능 추가

광고 시점

iOS Sender SDK는 표시됩니다.

자세한 내용은 자세한 내용은 웹 수신기 광고 시점 개요를 참고하세요. 광고 시점 작동 방식에 관한 정보를 확인하세요

발신자와 수신자 모두에게 휴식 시간을 지정할 수 있지만 Web Receiver에 지정되어 있어야 하며 일관성을 유지하기 위한 Android TV 수신기 파악할 수 있습니다

iOS에서는 GCKAdBreakClipInfoGCKAdBreakInfo:

<ph type="x-smartling-placeholder">
</ph>
스위프트
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())
Objective-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]];

가변 재생 속도

앱은 현재 미디어 항목의 재생 속도를 표시하고 변경할 수 있습니다. -[setPlaybackRate:] 또는 -[setPlaybackRate:customData:]GCKRemoteMediaClient님, 다음 인스턴스의 playbackRateController를 사용하여 GCKUIPlaybackRateController에 액세스합니다. GCKUIMediaController 를 사용하여 현재 재생 속도를 playbackRate GCKUIPlaybackRateController.

샘플 코드

다음 두 파일은 다음을 제어하는 GCKUIPlaybackRateController를 구현합니다. "보통", "1/2 속도" 및 "두 배속" 버튼:

<ph type="x-smartling-placeholder">
</ph>
스위프트
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
  }
}
Objective-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

맞춤 채널 추가

Cast 프레임워크는 맞춤 메시지를 보내는 채널을 만드는 두 가지 방법을 제공합니다. 전송해야 합니다.

  1. GCKCastChannel 서브클래스로 분류하여 중요하지 않은 채널을 구현하는 데 연결된 상태를 반환합니다.
  2. GCKGenericChannel 서브클래스화의 대안으로 제공됩니다. 받은 다른 곳에서 처리할 수 있도록 대리인에게 보냅니다.

다음은 GCKCastChannel 구현의 예입니다.

<ph type="x-smartling-placeholder">
</ph>
스위프트
class HGCTextChannel: GCKCastChannel {
  override func didReceiveTextMessage(_ message: String) {
    print("received message: \(message)")
  }
}
Objective-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

채널은 언제든지 등록할 수 있습니다. 세션이 현재 연결되면 채널이 자동으로 채널의 네임스페이스가 웹 수신기 앱 메타데이터의 지원되는 네임스페이스 목록

각 맞춤 채널은 고유한 네임스페이스로 정의되며 프리픽스 urn:x-cast:(예: urn:x-cast:com.example.custom) 그것은 맞춤 채널을 여러 개 만들 수 있으며, 각 맞춤 채널은 고유한 네임스페이스를 사용합니다 이 또한 Web Receiver 앱에서 메시지 동일한 네임스페이스를 사용하여 추가할 수 있습니다

<ph type="x-smartling-placeholder">
</ph>
스위프트
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)")
}
Objective-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);
}

특정 채널이 다른 채널로 전환될 때 실행해야 하는 로직을 연결 또는 연결 해제된 경우 -[didConnect]-[didDisconnect]를 재정의합니다. 메서드를 사용하는 경우 GCKCastChannel 또는 -[castChannelDidConnect:] 및 다음 항목의 -[castChannelDidDisconnect:] 메서드 GCKGenericChannelDelegate GCKGenericChannel를 사용하는 경우

자동재생 지원

자동재생 및 Queueing API

이미지 선택 및 캐싱 재정의

프레임워크의 다양한 구성요소 (즉, 전송 대화상자, 미니 확장된 컨트롤러, 그리고 GCKUIMediaController 현재 전송 중인 미디어의 아트워크가 표시됩니다. URL 일반적으로 GCKMediaMetadata 를 지원하지만 발신기 앱에는 URL에 대한 대체 소스가 있을 수 있습니다.

GCKUIImagePicker 프로토콜은 지정된 용도에 적합한 이미지를 선택하기 위한 수단을 정의합니다. 원하는 크기를 선택합니다. 이 인터페이스에는 단일 메서드 -[getImageWithHints:fromMetadata:]가 있습니다. 이 작업은 GCKUIImageHints 객체와 GCKMediaMetadata 객체를 매개변수로 사용하고 GCKImage 객체를 표시됩니다. 프레임워크는 API의 기본 구현을 제공합니다. GCKUIImagePicker는 이미지 목록에서 항상 첫 번째 이미지를 선택합니다. GCKMediaMetadata 객체와 유사하지만 앱에서 대체 객체를 imagePicker 속성을 설정하여 GCKCastContext 싱글톤입니다.

GCKUIImageCache 프로토콜은 또한 웹 프록시에서 다운로드한 이미지를 캐시하는 수단을 정의합니다. 프레임워크입니다 프레임워크는 API의 기본 구현을 제공합니다. GCKUIImageCache - 다운로드한 이미지 파일을 앱의 캐시에 저장합니다. 디렉터리가 있지만 앱이 imageCache 속성 GCKCastContext 싱글톤입니다.

다음 단계

이로써 iOS Sender 앱에 추가할 수 있는 기능에 대한 설명을 마칩니다. 이제 다른 플랫폼용 발신기 앱을 빌드할 수 있습니다 (Android 또는 ), 또는 Web Receiver를 빌드할 수 있습니다.