Yayını iOS Uygulamanıza Entegre Edin

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Bu geliştirici kılavuzunda, iOS Gönderen SDK'sını kullanarak iOS gönderen uygulamanıza Google Cast desteğinin nasıl ekleneceği açıklanmaktadır.

Mobil cihaz veya dizüstü bilgisayar, oynatmayı kontrol eden gönderendir ve Google Cast cihazı TV'de içeriği görüntüleyen alıcıdır.

Gönderici çerçevesi, yayındaki çalışma zamanında gönderen için kullanılan Cast sınıfı kitaplık ikili programını ve ilişkili kaynakları ifade eder. Gönderen uygulaması veya Yayın uygulaması, gönderende de çalışan bir uygulamayı belirtir. Web Alıcısı uygulaması, Web Alıcısı'nda çalışan HTML uygulamasını belirtir.

Gönderen çerçevesi, gönderene etkinlikleri uygulama hakkında bilgi vermek ve Yayın uygulaması yaşam döngüsünün çeşitli durumları arasında geçiş yapmak için eşzamansız bir geri çağırma tasarımı kullanır.

Uygulama akışı

Aşağıdaki adımlarda, gönderen bir iOS uygulaması için tipik üst düzey yürütme akışı açıklanmaktadır:

  • Yayın çerçevesi, cihazları taramaya başlamak için GCKCastOptions içinde sağlanan özelliklere göre GCKDiscoveryManager başlatır.
  • Kullanıcı, Yayınla düğmesini tıkladığında çerçeve, Google Cast iletişim kutusunu keşfedilen Yayın cihazlarının listesiyle sunar.
  • Kullanıcı bir Yayın cihazı seçtiğinde çerçeve, Yayın cihazında Web Alıcısı uygulamasını başlatmayı dener.
  • Çerçeve, Web Alıcısı uygulamasının başlatıldığını onaylamak için gönderen uygulamada geri çağırmaları çağırır.
  • Bu çerçeve, gönderen ile Web Alıcısı uygulamaları arasında bir iletişim kanalı oluşturur.
  • Çerçeve, web alıcısındaki medya oynatmayı yüklemek ve kontrol etmek için iletişim kanalını kullanır.
  • Bu çerçeve, medya oynatma durumunu gönderen ile Web Alıcısı arasında senkronize eder: Kullanıcı gönderen kullanıcı arayüzü işlemlerini yaptığında, çerçeve bu medya kontrol isteklerini Web Alıcısı'na iletir ve Web Alıcısı medya durumu güncellemelerini gönderdiğinde çerçeve, gönderen kullanıcı arayüzünün durumunu günceller.
  • Kullanıcı, Yayın cihazıyla bağlantısını kesmek için Yayınla düğmesini tıkladığında çerçeve, gönderen uygulamanın Web Alıcısı ile bağlantısını keser.

Gönderenlerle ilgili sorunları gidermek için günlük kaydını etkinleştirmeniz gerekir.

Google Cast iOS çerçevesindeki tüm sınıfların, yöntemlerin ve etkinliklerin kapsamlı bir listesi için Google Cast iOS API Referansı'na bakın. Aşağıdaki bölümlerde, Cast'i iOS uygulamanıza entegre etme adımları açıklanmaktadır.

Ana ileti dizisindeki arama yöntemleri

Yayınlama bağlamını ilk kullanıma hazırla

Yayın çerçevesi, çerçevenin tüm etkinliklerini koordine eden GCKCastContext global bir tekli nesneye sahiptir. Gönderen uygulamanın yeniden başlatılması sırasında otomatik oturum devam ettirmenin düzgün şekilde tetiklenebilmesi için bu nesne, uygulamanın yaşam döngüsünde, özellikle de uygulamanın yetki verilmiş kullanıcı tarafından -[application:didFinishLaunchingWithOptions:] yönteminde başlatılmalıdır.

GCKCastContext başlatılırken GCKCastOptions nesnesi sağlanmalıdır. Bu sınıf, çerçevenin davranışını etkileyen seçenekler içerir. En önemli olanı, keşif sonuçlarını filtrelemek ve bir Yayın oturumu başladığında Web Alıcısı uygulamasını başlatmak için kullanılan Web Alıcı uygulama kimliğidir.

-[application:didFinishLaunchingWithOptions:] yöntemi, çerçeveden günlük mesajları alacak bir günlük kaydı yetkilisi oluşturmak için de iyi bir yerdir. Bunlar, hata ayıklama ve sorun giderme için faydalı olabilir.

Swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GCKLoggerDelegate {
  let kReceiverAppID = kGCKDefaultMediaReceiverApplicationID
  let kDebugLoggingEnabled = true

  var window: UIWindow?

  func applicationDidFinishLaunching(_ application: UIApplication) {
    let criteria = GCKDiscoveryCriteria(applicationID: kReceiverAppID)
    let options = GCKCastOptions(discoveryCriteria: criteria)
    GCKCastContext.setSharedInstanceWith(options)

    // Enable logger.
    GCKLogger.sharedInstance().delegate = self

    ...
  }

  // MARK: - GCKLoggerDelegate

  func logMessage(_ message: String,
                  at level: GCKLoggerLevel,
                  fromFunction function: String,
                  location: String) {
    if (kDebugLoggingEnabled) {
      print(function + " - " + message)
    }
  }
}
Amaç C

AppTemsilci.h

@interface AppDelegate () <GCKLoggerDelegate>
@end

UygulamaYetkisi Ver.m

@implementation AppDelegate

static NSString *const kReceiverAppID = @"AABBCCDD";
static const BOOL kDebugLoggingEnabled = YES;

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  GCKDiscoveryCriteria *criteria = [[GCKDiscoveryCriteria alloc]
                                    initWithApplicationID:kReceiverAppID];
  GCKCastOptions *options = [[GCKCastOptions alloc] initWithDiscoveryCriteria:criteria];
  [GCKCastContext setSharedInstanceWithOptions:options];

  // Enable logger.
  [GCKLogger sharedInstance].delegate = self;

  ...

  return YES;
}

...

#pragma mark - GCKLoggerDelegate

- (void)logMessage:(NSString *)message
           atLevel:(GCKLoggerLevel)level
      fromFunction:(NSString *)function
          location:(NSString *)location {
  if (kDebugLoggingEnabled) {
    NSLog(@"%@ - %@, %@", function, message, location);
  }
}

@end

Cast UX widget'ları

Cast iOS SDK'sı, Cast Tasarım Kontrol Listesi'ne uyan aşağıdaki widget'ları sağlar:

  • Tanıtım Yer Paylaşımı: GCKCastContext sınıfının bir yöntemi vardır: presentCastInstructionsViewControllerOnceWithCastButton. Bu yöntem, bir Web Alıcısı ilk kez kullanılabilir olduğunda Yayınla düğmesini vurgulamak için kullanılabilir. Gönderen uygulama, metni, başlık metninin konumunu ve Kapat düğmesini özelleştirebilir.

  • Yayınla Düğmesi: Yayın iOS göndereni SDK'sı 4.6.0 sürümünden itibaren, yayınlama düğmesi her zaman gönderen cihaz kablosuz ağa bağlıyken görünür. Kullanıcı, uygulamayı ilk kez başlattıktan sonra Yayınla düğmesine ilk kez dokunduğunda, kullanıcının ağdaki cihazlara uygulama yerel ağına erişim izni verebilmesi için bir izin iletişim kutusu görünür. Daha sonra, kullanıcı yayınla düğmesine dokunduğunda, keşfedilen cihazların listelendiği bir yayınlama iletişim kutusu görüntülenir. Kullanıcı, cihaz bağlıyken yayın düğmesine dokunduğunda mevcut medya meta verilerini (ör. başlık, kayıt stüdyosu ve bir küçük resim) görüntüler veya kullanıcının yayın cihazı ile bağlantısını kesmesine izin verir. Kullanılabilir cihaz olmadığında kullanıcı yayınla düğmesine dokunduğunda kullanıcıya cihazların neden bulunamadığı ve nasıl sorun giderileceği hakkında bilgi veren bir ekran gösterilir.

  • Mini Denetleyici: Kullanıcı içerik yayınlarken mevcut içerik sayfasından veya genişletilmiş kumandadan gönderen uygulamasında başka bir ekrana gittiğinde, kullanıcının en son yayınlanan medya meta verilerini görmesine ve oynatmayı kontrol etmesine olanak tanımak için ekranın alt kısmında mini kumanda görüntülenir.

  • Genişletilmiş Denetleyici: Kullanıcı içerik yayınlarken medya bildirimini veya mini kumandayı tıklarsa o anda oynatılan medya meta verilerini gösteren ve medya oynatmayı kontrol etmek için birkaç düğme sağlayan genişletilmiş kumanda başlatılır.

Yayınla düğmesi ekle

Çerçeve, bir UIButton alt sınıfı olarak Yayınla düğmesi bileşeni sağlar. Başlığı UIBarButtonItem içinde sarmalayarak uygulamanın başlık çubuğuna eklenebilir. Tipik bir UIViewController alt sınıfı, aşağıdaki gibi bir Yayınla düğmesi yükleyebilir:

Swift
let castButton = GCKUICastButton(frame: CGRect(x: 0, y: 0, width: 24, height: 24))
castButton.tintColor = UIColor.gray
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: castButton)
Amaç C
GCKUICastButton *castButton = [[GCKUICastButton alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
castButton.tintColor = [UIColor grayColor];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:castButton];

Varsayılan olarak düğmeye dokunduğunuzda, çerçevenin sağladığı Yayınla iletişim kutusu açılır.

GCKUICastButton doğrudan film şeridine de eklenebilir.

Cihaz keşfini yapılandırın

Cihaz keşfi bu çerçevede otomatik olarak gerçekleşir. Özel bir kullanıcı arayüzü kullanmadığınız sürece keşif sürecini açıkça başlatmanıza veya durdurmanıza gerek yoktur.

Çerçevedeki keşif, GCKCastContext özelliğinin bir özelliği olan GCKDiscoveryManager sınıfı tarafından yönetilir. Çerçeve, cihaz seçimi ve kontrolü için varsayılan bir yayınlama iletişim kutusu bileşeni sağlar. Cihaz listesi, sözlükte yer alan ve cihaz dostu ada göre sıralanır.

Oturum yönetiminin işleyiş şekli

Cast SDK'sı, bir cihaza bağlanma, bir Web Alıcısı uygulamasını başlatma (veya uygulamaya katılma), bu uygulamaya bağlanma ve bir medya kontrol kanalı başlatma adımlarını birleştiren Yayın oturumu kavramını ortaya koydu. Yayınlama oturumları ve Web Alıcısı yaşam döngüsü hakkında daha fazla bilgi için Web Alıcısı'na Uygulama yaşam döngüsü kılavuzuna bakın.

Oturumlar, GCKCastContext mülkünün bir özelliği olan GCKSessionManager sınıfı tarafından yönetilir. Bağımsız oturumlar GCKSession sınıfının alt sınıflarıyla temsil edilir: Örneğin, GCKCastSession Yayın cihazları olan oturumları temsil eder. Şu anda etkin olan Yayınlama oturumuna (varsa) GCKSessionManager ürününün currentCastSession özelliği olarak erişebilirsiniz.

GCKSessionManagerListener arayüzü, oturum oluşturma, askıya alma, devam ettirme ve sonlandırma gibi oturum etkinliklerini izlemek için kullanılabilir. Çerçeve, gönderen uygulaması arka plana geçtiğinde oturumları otomatik olarak askıya alır ve uygulama ön plana geri döndüğünde bunları devam ettirmeye çalışır (veya bir oturum etkin durumdayken anormal/aniden yapılan bir fesihten sonra yeniden başlatılırsa).

Yayınlama iletişim kutusu kullanılıyorsa oturumlar kullanıcı hareketlerine karşılık olarak oluşturulur ve otomatik olarak kaldırılır. Aksi takdirde uygulama, oturumları GCKSessionManager yöntemi üzerinden açık şekilde başlatıp sonlandırabilir.

Uygulamanın oturum yaşam döngüsü olaylarına karşılık olarak özel işlem yapması gerekiyorsa GCKSessionManager ile bir veya daha fazla GCKSessionManagerListener örneğini kaydedebilir. GCKSessionManagerListener, oturum başlatma, oturum sonu ve benzeri etkinlikler için geri çağırmaları tanımlayan bir protokoldür.

Akış aktarma

Oturum durumunu korumak, kullanıcıların sesli komutlar, Google Home uygulaması veya akıllı ekranları kullanarak mevcut ses ve video akışlarını cihazlar arasında taşıyabileceği akış aktarımının temelini oluşturur. Medya, bir cihazda (kaynak) oynamaya devam eder ve başka bir cihazda (hedef) devam eder. En son donanım yazılımına sahip tüm Cast cihazları, akış aktarımında kaynak veya hedef işlevi görebilir.

Akış aktarımı sırasında yeni hedef cihazı almak için [sessionManager:didResumeCastSession:] geri çağırması sırasında GCKCastSession#device özelliğini kullanın.

Daha fazla bilgi için Web Alıcısında akış aktarımı bölümüne bakın.

Otomatik yeniden bağlantı

Cast çerçevesi, aşağıdakiler gibi birçok hafif köşe durumunda yeniden bağlantıyı otomatik olarak işlemek için yeniden bağlantı mantığı ekler:

  • Kablosuz ağ geçici olarak kaybedildiğinden kurtulma
  • Cihaz uykusundan kurtar
  • Uygulamanın arka planını kurtarma
  • Uygulama kilitlendiyse kurtarma

Medya kontrolünün işleyiş şekli

Medya adı alanını destekleyen bir Web Alıcı uygulamasıyla bir Cast oturumu oluşturulursa çerçeve tarafından otomatik olarak bir GCKRemoteMediaClient örneği oluşturulur; bu içeriğe GCKCastSession örneğinin remoteMediaClient özelliği olarak erişilebilir.

GCKRemoteMediaClient tarihinde Web Alıcısına istek gönderen tüm yöntemler, bu isteği izlemek için kullanılabilecek bir GCKRequest nesnesi döndürür. İşlemin nihai sonucuyla ilgili bildirimleri almak için bu nesneye bir GCKRequestDelegate atanabilir.

GCKRemoteMediaClient örneğinin, uygulamanın birden fazla bölümü tarafından paylaşılabileceği ve aslında Yayınla ile iletişim kutusu ve mini medya denetimleri gibi çerçevenin bazı dahili bileşenlerinin örneği paylaşması beklenir. Bu amaçla GCKRemoteMediaClient, birden fazla GCKRemoteMediaClientListener kaydının kaydedilmesini destekler.

Medya meta verilerini ayarlama

GCKMediaMetadata sınıfı, yayınlamak istediğiniz medya öğesi hakkındaki bilgileri temsil eder. Aşağıdaki örnekte bir film için yeni bir GCKMediaMetadata örneği oluşturulur ve başlık, alt başlık, kayıt stüdyosunun adı ve iki resim ayarlanır.

Swift
let metadata = GCKMediaMetadata()
metadata.setString("Big Buck Bunny (2008)", forKey: kGCKMetadataKeyTitle)
metadata.setString("Big Buck Bunny tells the story of a giant rabbit with a heart bigger than " +
  "himself. When one sunny day three rodents rudely harass him, something " +
  "snaps... and the rabbit ain't no bunny anymore! In the typical cartoon " +
  "tradition he prepares the nasty rodents a comical revenge.",
                   forKey: kGCKMetadataKeySubtitle)
metadata.addImage(GCKImage(url: URL(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg")!,
                           width: 480,
                           height: 360))
Amaç C
GCKMediaMetadata *metadata = [[GCKMediaMetadata alloc]
                                initWithMetadataType:GCKMediaMetadataTypeMovie];
[metadata setString:@"Big Buck Bunny (2008)" forKey:kGCKMetadataKeyTitle];
[metadata setString:@"Big Buck Bunny tells the story of a giant rabbit with a heart bigger than "
 "himself. When one sunny day three rodents rudely harass him, something "
 "snaps... and the rabbit ain't no bunny anymore! In the typical cartoon "
 "tradition he prepares the nasty rodents a comical revenge."
             forKey:kGCKMetadataKeySubtitle];
[metadata addImage:[[GCKImage alloc]
                    initWithURL:[[NSURL alloc] initWithString:@"https://commondatastorage.googleapis.com/"
                                 "gtv-videos-bucket/sample/images/BigBuckBunny.jpg"]
                    width:480
                    height:360]];

Medya meta verilerinin bulunduğu görsellerin kullanımı hakkında bilgi edinmek için Resim Seçimi ve Önbelleğe Alma bölümüne bakın.

Medya yükle

Medya öğesi yüklemek için medyanın meta verilerini kullanarak bir GCKMediaInformation örneği oluşturun. Daha sonra, alıcıda medyayı yüklemek için mevcut GCKCastSession dosyasını edinin ve GCKRemoteMediaClient kullanın. Ardından alıcıda çalışan bir medya oynatıcı uygulamasını (ör. oynatma, duraklatma ve durdurma) kontrol etmek için GCKRemoteMediaClient uygulamasını kullanabilirsiniz.

Swift
let url = URL.init(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
guard let mediaURL = url else {
  print("invalid mediaURL")
  return
}

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentURL: mediaURL)
mediaInfoBuilder.streamType = GCKMediaStreamType.none;
mediaInfoBuilder.contentType = "video/mp4"
mediaInfoBuilder.metadata = metadata;
mediaInformation = mediaInfoBuilder.build()

guard let mediaInfo = mediaInformation else {
  print("invalid mediaInformation")
  return
}

if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia(mediaInfo) {
  request.delegate = self
}
Amaç C
GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentURL:
   [NSURL URLWithString:@"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"]];
mediaInfoBuilder.streamType = GCKMediaStreamTypeNone;
mediaInfoBuilder.contentType = @"video/mp4";
mediaInfoBuilder.metadata = metadata;
self.mediaInformation = [mediaInfoBuilder build];

GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
  request.delegate = self;
}

Medya kanallarını kullanma ile ilgili bölüme de bakın.

4K video biçimi

Medyanızın ne tür bir video olduğunu belirlemek için GCKMediaStatus özelliğinin videoInfo özelliğini kullanarak geçerli GCKVideoInfo örneğini alın. Bu örnekte HDR TV biçimi türü ile piksel cinsinden yükseklik ve genişlik bulunmaktadır. 4K biçimindeki varyantlar, hdrType özelliğinde GCKVideoInfoHDRType sıralama değerleriyle gösterilir.

Mini kumanda ekleyin

Yayın Tasarımı Kontrol Listesi'ne göre, bir gönderen uygulamanın kullanıcı mevcut içerik sayfasından ayrıldığında görünmesi gereken mini kumanda olarak bilinen kalıcı kontrolü sağlaması gerekir. Mini kumanda, geçerli Yayın oturumu için anında erişim ve görünür bir hatırlatıcı sağlar.

Yayın çerçevesi, mini kumandayı göstermek istediğiniz sahnelere eklenebilecek bir kontrol çubuğu (GCKUIMiniMediaControlsViewController) sağlar.

Gönderen uygulamanız video veya ses canlı yayını oynatırken SDK, mini kumandadaki oynat/duraklat düğmesi yerine otomatik olarak bir oynat/durdur düğmesi gösterir.

Gönderen uygulamanızın, Yayın widget'larının görünümünü nasıl yapılandırabileceğini öğrenmek için iOS Gönderen Kullanıcı Arayüzünü Özelleştirme bölümüne bakın.

Mini denetleyiciyi bir gönderen uygulamasına eklemenin iki yolu vardır:

  • Mevcut görüntüleme denetleyicinizi kendi görünüm denetleyicisiyle sarmalayarak Cast çerçevesinin mini kumandanın düzenini yönetmesine izin verin.
  • Mini kumanda widget'ının düzenini, resimli taslakta bir alt görünüm sağlayarak mevcut görünüm denetleyicinize ekleyerek kendiniz yönetin.

GCKUICastKapsayıcıViewController'ı kullanarak sarmalayın

İlk yöntem, başka bir görünüm kumandasını saran ve alta bir GCKUIMiniMediaControlsViewController ekleyen GCKUICastContainerViewController aracını kullanmaktır. Bu özelleştirme, animasyonu özelleştirememeniz ve kapsayıcı görünümü denetleyicisinin davranışını yapılandırabilmeniz nedeniyle sınırlıdır.

Bu yöntem genellikle, yetki verilen uygulamanın -[application:didFinishLaunchingWithOptions:] yöntemiyle yapılır:

Swift
func applicationDidFinishLaunching(_ application: UIApplication) {
  ...

  // Wrap main view in the GCKUICastContainerViewController and display the mini controller.
  let appStoryboard = UIStoryboard(name: "Main", bundle: nil)
  let navigationController = appStoryboard.instantiateViewController(withIdentifier: "MainNavigation")
  let castContainerVC =
          GCKCastContext.sharedInstance().createCastContainerController(for: navigationController)
  castContainerVC.miniMediaControlsItemEnabled = true
  window = UIWindow(frame: UIScreen.main.bounds)
  window!.rootViewController = castContainerVC
  window!.makeKeyAndVisible()

  ...
}
Amaç C
- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  // Wrap main view in the GCKUICastContainerViewController and display the mini controller.
  UIStoryboard *appStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
  UINavigationController *navigationController =
          [appStoryboard instantiateViewControllerWithIdentifier:@"MainNavigation"];
  GCKUICastContainerViewController *castContainerVC =
          [[GCKCastContext sharedInstance] createCastContainerControllerForViewController:navigationController];
  castContainerVC.miniMediaControlsItemEnabled = YES;
  self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
  self.window.rootViewController = castContainerVC;
  [self.window makeKeyAndVisible];
  ...

}
Swift
var castControlBarsEnabled: Bool {
  set(enabled) {
    if let castContainerVC = self.window?.rootViewController as? GCKUICastContainerViewController {
      castContainerVC.miniMediaControlsItemEnabled = enabled
    } else {
      print("GCKUICastContainerViewController is not correctly configured")
    }
  }
  get {
    if let castContainerVC = self.window?.rootViewController as? GCKUICastContainerViewController {
      return castContainerVC.miniMediaControlsItemEnabled
    } else {
      print("GCKUICastContainerViewController is not correctly configured")
      return false
    }
  }
}
Amaç C

AppTemsilci.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;
@property (nonatomic, assign) BOOL castControlBarsEnabled;

@end

UygulamaYetkisi Ver.m

@implementation AppDelegate

...

- (void)setCastControlBarsEnabled:(BOOL)notificationsEnabled {
  GCKUICastContainerViewController *castContainerVC;
  castContainerVC =
      (GCKUICastContainerViewController *)self.window.rootViewController;
  castContainerVC.miniMediaControlsItemEnabled = notificationsEnabled;
}

- (BOOL)castControlBarsEnabled {
  GCKUICastContainerViewController *castContainerVC;
  castContainerVC =
      (GCKUICastContainerViewController *)self.window.rootViewController;
  return castContainerVC.miniMediaControlsItemEnabled;
}

...

@end

Mevcut görünüm denetleyiciye yerleştir

İkinci yöntem, GCKUIMiniMediaControlsViewController örneğini oluşturup container görünümü denetleyicisine alt görünüm olarak eklemek için mini kumandayı createMiniMediaControlsViewController kullanarak doğrudan mevcut görünüm kumandanıza eklemektir.

Uygulama yetkisi verilen kullanıcıda görünüm denetleyicinizi ayarlayın:

Swift
func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  ...

  GCKCastContext.sharedInstance().useDefaultExpandedMediaControls = true
  window?.clipsToBounds = true

  let rootContainerVC = (window?.rootViewController as? RootContainerViewController)
  rootContainerVC?.miniMediaControlsViewEnabled = true

  ...

  return true
}
Amaç C
- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  [GCKCastContext sharedInstance].useDefaultExpandedMediaControls = YES;

  self.window.clipsToBounds = YES;

  RootContainerViewController *rootContainerVC;
  rootContainerVC =
      (RootContainerViewController *)self.window.rootViewController;
  rootContainerVC.miniMediaControlsViewEnabled = YES;

  ...

  return YES;
}

Kök görünüm denetleyicinizde bir GCKUIMiniMediaControlsViewController örneği oluşturun ve bunu alt görünüm olarak kapsayıcı görünümü denetleyiciye ekleyin:

Swift
let kCastControlBarsAnimationDuration: TimeInterval = 0.20

@objc(RootContainerViewController)
class RootContainerViewController: UIViewController, GCKUIMiniMediaControlsViewControllerDelegate {
  @IBOutlet weak private var _miniMediaControlsContainerView: UIView!
  @IBOutlet weak private var _miniMediaControlsHeightConstraint: NSLayoutConstraint!
  private var miniMediaControlsViewController: GCKUIMiniMediaControlsViewController!
  var miniMediaControlsViewEnabled = false {
    didSet {
      if self.isViewLoaded {
        self.updateControlBarsVisibility()
      }
    }
  }

  var overriddenNavigationController: UINavigationController?

  override var navigationController: UINavigationController? {

    get {
      return overriddenNavigationController
    }

    set {
      overriddenNavigationController = newValue
    }
  }
  var miniMediaControlsItemEnabled = false

  override func viewDidLoad() {
    super.viewDidLoad()
    let castContext = GCKCastContext.sharedInstance()
    self.miniMediaControlsViewController = castContext.createMiniMediaControlsViewController()
    self.miniMediaControlsViewController.delegate = self
    self.updateControlBarsVisibility()
    self.installViewController(self.miniMediaControlsViewController,
                               inContainerView: self._miniMediaControlsContainerView)
  }

  func updateControlBarsVisibility() {
    if self.miniMediaControlsViewEnabled && self.miniMediaControlsViewController.active {
      self._miniMediaControlsHeightConstraint.constant = self.miniMediaControlsViewController.minHeight
      self.view.bringSubview(toFront: self._miniMediaControlsContainerView)
    } else {
      self._miniMediaControlsHeightConstraint.constant = 0
    }
    UIView.animate(withDuration: kCastControlBarsAnimationDuration, animations: {() -> Void in
      self.view.layoutIfNeeded()
    })
    self.view.setNeedsLayout()
  }

  func installViewController(_ viewController: UIViewController?, inContainerView containerView: UIView) {
    if let viewController = viewController {
      self.addChildViewController(viewController)
      viewController.view.frame = containerView.bounds
      containerView.addSubview(viewController.view)
      viewController.didMove(toParentViewController: self)
    }
  }

  func uninstallViewController(_ viewController: UIViewController) {
    viewController.willMove(toParentViewController: nil)
    viewController.view.removeFromSuperview()
    viewController.removeFromParentViewController()
  }

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "NavigationVCEmbedSegue" {
      self.navigationController = (segue.destination as? UINavigationController)
    }
  }

...
Amaç C

KökKapsayıcıGörüntüKontrolü.h

static const NSTimeInterval kCastControlBarsAnimationDuration = 0.20;

@interface RootContainerViewController () <GCKUIMiniMediaControlsViewControllerDelegate> {
  __weak IBOutlet UIView *_miniMediaControlsContainerView;
  __weak IBOutlet NSLayoutConstraint *_miniMediaControlsHeightConstraint;
  GCKUIMiniMediaControlsViewController *_miniMediaControlsViewController;
}

@property(nonatomic, weak, readwrite) UINavigationController *navigationController;

@property(nonatomic, assign, readwrite) BOOL miniMediaControlsViewEnabled;
@property(nonatomic, assign, readwrite) BOOL miniMediaControlsItemEnabled;

@end

KökKapsayıcıGörüntüKontrolü.m

@implementation RootContainerViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  GCKCastContext *castContext = [GCKCastContext sharedInstance];
  _miniMediaControlsViewController =
      [castContext createMiniMediaControlsViewController];
  _miniMediaControlsViewController.delegate = self;

  [self updateControlBarsVisibility];
  [self installViewController:_miniMediaControlsViewController
              inContainerView:_miniMediaControlsContainerView];
}

- (void)setMiniMediaControlsViewEnabled:(BOOL)miniMediaControlsViewEnabled {
  _miniMediaControlsViewEnabled = miniMediaControlsViewEnabled;
  if (self.isViewLoaded) {
    [self updateControlBarsVisibility];
  }
}

- (void)updateControlBarsVisibility {
  if (self.miniMediaControlsViewEnabled &&
      _miniMediaControlsViewController.active) {
    _miniMediaControlsHeightConstraint.constant =
        _miniMediaControlsViewController.minHeight;
    [self.view bringSubviewToFront:_miniMediaControlsContainerView];
  } else {
    _miniMediaControlsHeightConstraint.constant = 0;
  }
  [UIView animateWithDuration:kCastControlBarsAnimationDuration
                   animations:^{
                     [self.view layoutIfNeeded];
                   }];
  [self.view setNeedsLayout];
}

- (void)installViewController:(UIViewController *)viewController
              inContainerView:(UIView *)containerView {
  if (viewController) {
    [self addChildViewController:viewController];
    viewController.view.frame = containerView.bounds;
    [containerView addSubview:viewController.view];
    [viewController didMoveToParentViewController:self];
  }
}

- (void)uninstallViewController:(UIViewController *)viewController {
  [viewController willMoveToParentViewController:nil];
  [viewController.view removeFromSuperview];
  [viewController removeFromParentViewController];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  if ([segue.identifier isEqualToString:@"NavigationVCEmbedSegue"]) {
    self.navigationController =
        (UINavigationController *)segue.destinationViewController;
  }
}

...

@end

Mini kumandanın ne zaman görünmesi gerektiğini GCKUIMiniMediaControlsViewControllerDelegate ana makine görünüm denetleyicisine bildirir:

Swift
  func miniMediaControlsViewController(_: GCKUIMiniMediaControlsViewController,
                                       shouldAppear _: Bool) {
    updateControlBarsVisibility()
  }
Amaç C
- (void)miniMediaControlsViewController:
            (GCKUIMiniMediaControlsViewController *)miniMediaControlsViewController
                           shouldAppear:(BOOL)shouldAppear {
  [self updateControlBarsVisibility];
}

Genişletilmiş kumanda ekle

Google Cast Tasarım Kontrol Listesi, gönderen uygulamanın, yayınlanan medya için genişletilmiş kumandayı sağlamasını gerektirir. Genişletilmiş kumanda, mini kumandanın tam ekran sürümüdür.

Genişletilmiş kumanda, uzaktan medya oynatmanın tam kontrolüne sahip olan tam ekran görünümüdür. Bu görünüm, Web Alıcısı ses kontrolü ve oturum yaşam döngüsü (bağlama/yayınlamayı durdurma) hariç, bir yayınlama uygulamasının yayın oturumunun tüm yönetilen özelliklerini yönetebilmesini sağlamalıdır. Ayrıca medya oturumuyla ilgili tüm durum bilgilerini (poster, başlık, alt başlık vb.) sağlar.

Bu görünümün işlevselliği GCKUIExpandedMediaControlsViewController sınıfı tarafından uygulanır.

Yapmanız gereken ilk şey yayın bağlamında varsayılan genişletilmiş kumandayı etkinleştirmektir. Varsayılan genişletilmiş kumandayı etkinleştirmek için uygulama yetkisini değiştirin:

Swift
func applicationDidFinishLaunching(_ application: UIApplication) {
  ..

  GCKCastContext.sharedInstance().useDefaultExpandedMediaControls = true

  ...
}
Amaç C
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  [GCKCastContext sharedInstance].useDefaultExpandedMediaControls = YES;

  ..
}

Kullanıcı video yayınlamaya başladığında genişletilmiş kumandayı yüklemek için aşağıdaki kodu görüntüleme kumandanıza ekleyin:

Swift
func playSelectedItemRemotely() {
  GCKCastContext.sharedInstance().presentDefaultExpandedMediaControls()

  ...

  // Load your media
  sessionManager.currentSession?.remoteMediaClient?.loadMedia(mediaInformation)
}
Amaç C
- (void)playSelectedItemRemotely {
  [[GCKCastContext sharedInstance] presentDefaultExpandedMediaControls];

  ...

  // Load your media
  [self.sessionManager.currentSession.remoteMediaClient loadMedia:mediaInformation];
}

Genişletilmiş kumanda, kullanıcı mini kumandaya dokunduğunda otomatik olarak başlatılır.

Gönderen uygulamanız video veya ses canlı yayını oynatırken SDK, genişletilmiş kumandadaki oynat/duraklat düğmesi yerine otomatik olarak oynat/durdur düğmesi gösterir.

Gönderen uygulamanızın, Yayın widget'larının görünümünü nasıl yapılandırabileceğini öğrenmek için iOS Uygulamanıza Özel Stiller Uygulama konusuna bakın.

Ses düzeyi kontrolü

Yayın çerçevesi, gönderen uygulamanın ses düzeyini otomatik olarak yönetir. Çerçeve, sağlanan kullanıcı arayüzü widget'ları için Web Alıcısı hacmiyle otomatik olarak senkronize edilir. Uygulama tarafından sağlanan bir kaydırma çubuğunu senkronize etmek için GCKUIDeviceVolumeController simgesini kullanın.

Fiziksel düğme ses denetimi

Gönderen cihazdaki fiziksel ses düğmeleri, GCKCastContext üzerinde ayarlanan GCKCastOptions üzerindeki physicalVolumeButtonsWillControlDeviceVolume işaretini kullanarak Web Alıcısı'nda Yayınlama oturumunun ses düzeyini değiştirmek için kullanılabilir.

Swift
let criteria = GCKDiscoveryCriteria(applicationID: kReceiverAppID)
let options = GCKCastOptions(discoveryCriteria: criteria)
options.physicalVolumeButtonsWillControlDeviceVolume = true
GCKCastContext.setSharedInstanceWith(options)
Amaç C
GCKDiscoveryCriteria *criteria = [[GCKDiscoveryCriteria alloc]
                                          initWithApplicationID:kReceiverAppID];
GCKCastOptions *options = [[GCKCastOptions alloc]
                                          initWithDiscoveryCriteria :criteria];
options.physicalVolumeButtonsWillControlDeviceVolume = YES;
[GCKCastContext setSharedInstanceWithOptions:options];

Hataları ele alma

Gönderen uygulamaların tüm hata geri çağırmalarını ele alması ve Yayın yaşam döngüsünün her aşaması için en iyi yanıtı seçmesi çok önemlidir. Uygulama, kullanıcıya hata iletişim kutuları gösterebilir veya Yayınlama oturumunu sonlandırmaya karar verebilir.

Günlük Kaydı

GCKLogger, çerçeveye göre günlük kaydı için kullanılan bir tekildir. Günlük mesajlarını nasıl işleyeceğinizi özelleştirmek için GCKLoggerDelegate simgesini kullanın.

SDK; GCKLogger kullanılarak hata ayıklama mesajları, hatalar ve uyarılar biçiminde günlük çıktıları üretir. Bu günlük mesajları hata ayıklamaya yardımcı olur ve sorunları gidermeye ve tanımlamaya yardımcı olur. Varsayılan olarak günlük çıkışı gizlenir, ancak bir GCKLoggerDelegate atayarak gönderen uygulama bu mesajları SDK'dan alabilir ve sistem konsoluna kaydedebilir.

Swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GCKLoggerDelegate {
  let kReceiverAppID = kGCKDefaultMediaReceiverApplicationID
  let kDebugLoggingEnabled = true

  var window: UIWindow?

  func applicationDidFinishLaunching(_ application: UIApplication) {
    ...

    // Enable logger.
    GCKLogger.sharedInstance().delegate = self

    ...
  }

  // MARK: - GCKLoggerDelegate

  func logMessage(_ message: String,
                  at level: GCKLoggerLevel,
                  fromFunction function: String,
                  location: String) {
    if (kDebugLoggingEnabled) {
      print(function + " - " + message)
    }
  }
}
Amaç C

AppTemsilci.h

@interface AppDelegate () <GCKLoggerDelegate>
@end

UygulamaYetkisi Ver.m

@implementation AppDelegate

static NSString *const kReceiverAppID = @"AABBCCDD";
static const BOOL kDebugLoggingEnabled = YES;

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  // Enable logger.
  [GCKLogger sharedInstance].delegate = self;

  ...

  return YES;
}

...

#pragma mark - GCKLoggerDelegate

- (void)logMessage:(NSString *)message
           atLevel:(GCKLoggerLevel)level
      fromFunction:(NSString *)function
          location:(NSString *)location {
  if (kDebugLoggingEnabled) {
    NSLog(@"%@ - %@, %@", function, message, location);
  }
}

@end

Hata ayıklama ve ayrıntılı mesajları da etkinleştirmek için, yetki verilmiş kullanıcıyı ayarladıktan sonra bu satırı koda ekleyin (daha önce gösterilmektedir):

Swift
let filter = GCKLoggerFilter.init()
filter.minimumLevel = GCKLoggerLevel.verbose
GCKLogger.sharedInstance().filter = filter
Amaç C
GCKLoggerFilter *filter = [[GCKLoggerFilter alloc] init];
[filter setMinimumLevel:GCKLoggerLevelVerbose];
[GCKLogger sharedInstance].filter = filter;

Ayrıca, GCKLogger tarafından oluşturulan günlük mesajlarını da filtreleyebilirsiniz. Sınıf başına minimum günlük kaydı düzeyini ayarlayın. Örneğin:

Swift
let filter = GCKLoggerFilter.init()
filter.setLoggingLevel(GCKLoggerLevel.verbose, forClasses: ["GCKUICastButton",
                                                            "GCKUIImageCache",
                                                            "NSMutableDictionary"])
GCKLogger.sharedInstance().filter = filter
Amaç C
GCKLoggerFilter *filter = [[GCKLoggerFilter alloc] init];
[filter setLoggingLevel:GCKLoggerLevelVerbose
             forClasses:@[@"GCKUICastButton",
                          @"GCKUIImageCache",
                          @"NSMutableDictionary"
                          ]];
[GCKLogger sharedInstance].filter = filter;

Sınıf adları, gerçek adlar veya glob kalıpları olabilir (örneğin, GCKUI\* ve GCK\*Session).