1. Genel Bakış

Bu codelab'de, Google Cast uyumlu bir cihazda içerik yayınlamak için mevcut bir iOS video uygulamasını nasıl değiştireceğiniz öğretilecektir.
Google Cast nedir?
Google Cast, kullanıcıların mobil cihazdaki içerikleri TV'ye yayınlamasına olanak tanır. Kullanıcılar daha sonra mobil cihazlarını TV'de medya oynatma için uzaktan kumanda olarak kullanabilir.
Google Cast SDK'sı, uygulamanızı Google Cast özellikli cihazları (ör. TV veya ses sistemi) kontrol edecek şekilde genişletmenize olanak tanır. Cast SDK, Google Cast Tasarım Kontrol Listesi'ne göre gerekli kullanıcı arayüzü bileşenlerini eklemenize olanak tanır.
Google Cast Tasarım Kontrol Listesi, desteklenen tüm platformlarda Cast kullanıcı deneyimini basit ve tahmin edilebilir hale getirmek için sağlanır.
Ne geliştireceğiz?
Bu codelab'i tamamladığınızda, videoları Google Cast cihazına yayınlayabilen bir iOS video uygulamanız olacak.
Neler öğreneceksiniz?
- Google Cast SDK'sını örnek bir video uygulamasına ekleme
- Google Cast cihazı seçmek için Yayınla düğmesini ekleme
- Yayın cihazına bağlanma ve medya alıcısını başlatma
- Video yayınlama
- Uygulamanıza Cast mini denetleyici ekleme
- Genişletilmiş denetleyici ekleme
- Tanıtım amaçlı yer paylaşımı nasıl sağlanır?
- Cast widget'larını özelleştirme
- Cast Connect'i entegre etme
İhtiyacınız olanlar
- En yeni Xcode.
- iOS 9 veya sonraki bir sürümün yüklü olduğu bir mobil cihaz (veya Xcode Simulator)
- Mobil cihazınızı geliştirme bilgisayarınıza bağlamak için USB veri kablosu (cihaz kullanılıyorsa).
- İnternet erişimiyle yapılandırılmış bir Chromecast veya Android TV gibi Google Cast yayın cihazı.
- HDMI girişi olan bir TV veya monitör.
- Cast Connect entegrasyonunu test etmek için Google TV Yüklü bir Chromecast gereklidir ancak codelab'in geri kalanı için isteğe bağlıdır. Yoksa bu eğitimin sonuna doğru Cast Connect desteği ekleme adımını atlayabilirsiniz.
Deneyim
- Daha önce iOS geliştirme konusunda bilgi sahibi olmanız gerekir.
- Ayrıca TV izleme konusunda önceden bilgi sahibi olmanız gerekir :)
Bu eğitimi nasıl kullanacaksınız?
iOS uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?
TV izleme deneyiminizi nasıl değerlendirirsiniz?
2. Örnek kodu alın
Örnek kodun tamamını bilgisayarınıza indirebilirsiniz.
ve indirilen ZIP dosyasını açın.
3. Örnek uygulamayı çalıştırma

Öncelikle, tamamlanmış örnek uygulamanın nasıl göründüğüne bakalım. Uygulama, temel bir video oynatıcıdır. Kullanıcı listeden bir video seçebilir, ardından videoyu cihazda yerel olarak oynatabilir veya Google Cast yayın cihazına yayınlayabilir.
Kod indirildikten sonra, aşağıdaki talimatlarda tamamlanmış örnek uygulamanın Xcode'da nasıl açılıp çalıştırılacağı açıklanmaktadır:
Sık sorulan sorular
CocoaPods kurulumu
CocoaPods'u kurmak için konsolunuza gidin ve macOS'te bulunan varsayılan Ruby'yi kullanarak yükleyin:
sudo gem install cocoapods
Sorun yaşarsanız bağımlılık yöneticisini indirmek ve yüklemek için resmi belgelere bakın.
Proje ayarlama
- Terminalinize gidin ve codelab dizinine gidin.
- Podfile'daki bağımlılıkları yükleyin.
cd app-done pod update pod install
- Xcode'u açın ve Open another project... (Başka bir proje aç...) seçeneğini belirleyin.
- Örnek kod klasöründeki

app-donedizinindenCastVideos-ios.xcworkspacedosyasını seçin.
Uygulamayı çalıştırma
Hedefi ve simülatörü seçip uygulamayı çalıştırın:

Birkaç saniye sonra video uygulamasının göründüğünü görmelisiniz.
Gelen ağ bağlantılarını kabul etme hakkında bildirim göründüğünde "İzin ver"i tıkladığınızdan emin olun. Bu seçenek kabul edilmezse yayın simgesi görünmez.

Yayınla düğmesini tıklayın ve Google Cast yayın cihazınızı seçin.
Bir video seçip oynat düğmesini tıklayın.
Video, Google Cast yayın cihazınızda oynatılmaya başlar.
Genişletilmiş kumanda görüntülenir. Oynatmayı kontrol etmek için oynatma/duraklatma düğmesini kullanabilirsiniz.
Video listesine geri dönün.
Ekranın alt kısmında artık mini bir kontrol cihazı görünüyor.

Alıcıdaki videoyu duraklatmak için mini denetleyicideki duraklatma düğmesini tıklayın. Videoyu tekrar oynatmaya devam etmek için mini kontrol panelindeki oynatma düğmesini tıklayın.
Google Cast cihazda yayını durdurmak için Yayınla düğmesini tıklayın.
4. Başlangıç projesini hazırlama

İndirdiğiniz başlangıç uygulamasına Google Cast desteği eklememiz gerekiyor. Bu codelab'de kullanacağımız bazı Google Cast terimleri şunlardır:
- Bir gönderen uygulaması mobil cihazda veya dizüstü bilgisayarda çalışıyorsa,
- Google Cast cihazında bir alıcı uygulaması çalışıyor olmalıdır.
Proje ayarlama
Artık Xcode'u kullanarak başlangıç projesinin üzerine geliştirme yapmaya hazırsınız:
- Terminalinize gidin ve codelab dizinine gidin.
- Podfile'daki bağımlılıkları yükleyin.
cd app-start pod update pod install
- Xcode'u açın ve Open another project... (Başka bir proje aç...) seçeneğini belirleyin.
- Örnek kod klasöründeki

app-startdizinindenCastVideos-ios.xcworkspacedosyasını seçin.
Uygulama tasarımı
Uygulama, uzak bir web sunucusundan video listesi getirir ve kullanıcının göz atması için bir liste sağlar. Kullanıcılar, ayrıntıları görmek veya videoyu mobil cihazda yerel olarak oynatmak için bir video seçebilir.
Uygulama, iki ana görünüm denetleyicisinden oluşur: MediaTableViewController ve MediaViewController.
MediaTableViewController
Bu UITableViewController, bir MediaListModel örneğindeki videoların listesini gösterir. Videoların listesi ve ilişkili meta verileri, uzak bir sunucuda JSON dosyası olarak barındırılır. MediaListModel, bu JSON'u getirir ve MediaItem nesnelerinin listesini oluşturmak için işler.
MediaItem nesnesi, bir videoyu ve ilişkili meta verilerini (ör. başlık, açıklama, resim URL'si ve yayın URL'si) modeller.
MediaTableViewController bir MediaListModel örneği oluşturur ve ardından tablo görünümünü yükleyebilmesi için medya meta verileri indirildiğinde bilgilendirilmek üzere kendisini MediaListModelDelegate olarak kaydeder.
Kullanıcıya, her videonun kısa bir açıklamasının yer aldığı video küçük resimlerinin listesi gösterilir. Bir öğe seçildiğinde, karşılık gelen MediaItem, MediaViewController öğesine iletilir.
MediaViewController
Bu görünüm denetleyicisi, belirli bir videoyla ilgili meta verileri gösterir ve kullanıcının videoyu mobil cihazda yerel olarak oynatmasına olanak tanır.
Görünüm denetleyicisi, LocalPlayerView, bazı medya kontrolleri ve seçilen videonun açıklamasını göstermek için bir metin alanı içerir. Oynatıcı, ekranın üst kısmını kaplar ve videonun ayrıntılı açıklaması için yer bırakır. Kullanıcı, yerel video oynatmayı başlatabilir/duraklatabilir veya arayabilir.
Sık sorulan sorular
5. Yayın düğmesini ekleme

Cast uyumlu bir uygulama, her görünüm denetleyicisinde yayın düğmesini gösterir. Yayınla düğmesini tıkladığınızda, kullanıcının seçebileceği yayın cihazlarının listesi gösterilir. Kullanıcı, gönderen cihazda yerel olarak içerik oynatıyorsa bir yayın cihazı seçildiğinde bu yayın cihazında oynatma başlatılır veya devam ettirilir. Yayın oturumu sırasında kullanıcı istediği zaman Yayınla düğmesini tıklayarak uygulamanızın yayın cihazına yayınlanmasını durdurabilir. Kullanıcı, Google Cast Tasarım Kontrol Listesi'nde açıklandığı gibi, uygulamanızın herhangi bir ekranındayken yayın cihazına bağlanabilmeli veya bağlantısını kesebilmelidir.
Yapılandırma
Başlangıç projesi, tamamlanmış örnek uygulamada kullandığınız bağımlılıkları ve Xcode kurulumunu gerektirir. Bu bölüme dönün ve başlangıç uygulaması projesine GoogleCast.framework eklemek için aynı adımları uygulayın.
Başlatma
Cast çerçevesinde, çerçevedeki tüm etkinlikleri koordine eden genel tekil nesne GCKCastContext bulunur. Bu nesne, gönderen uygulama yeniden başlatıldığında otomatik oturum devam ettirme işleminin düzgün şekilde tetiklenebilmesi ve cihaz taramasının başlatılabilmesi için uygulamanın yaşam döngüsünün başlarında, genellikle uygulama temsilcisinin application(_:didFinishLaunchingWithOptions:) yönteminde başlatılmalıdır.
GCKCastContext başlatılırken bir GCKCastOptions nesnesi sağlanmalıdır. Bu sınıf, çerçevenin davranışını etkileyen seçenekleri içerir. Bunların en önemlisi, yayın cihazı keşif sonuçlarını filtrelemek ve bir yayın oturumu başlatıldığında alıcı uygulamasını başlatmak için kullanılan alıcı uygulama kimliğidir.
application(_:didFinishLaunchingWithOptions:) yöntemi, Cast çerçevesinden günlük kaydı mesajlarını almak için bir günlük kaydı temsilcisi ayarlamak üzere de kullanılabilir. Bu bilgiler, hata ayıklama ve sorun giderme açısından yararlı olabilir.
Kendi Cast uyumlu uygulamanızı geliştirirken Cast geliştiricisi olarak kaydolmanız ve ardından uygulamanız için bir uygulama kimliği almanız gerekir. Bu codelab'de örnek bir uygulama kimliği kullanacağız.
AppDelegate.swift'ı kullanıcı varsayılanlarındaki uygulama kimliğiyle başlatmak ve Google Cast çerçevesi için bir günlükçü eklemek üzere GCKCastContext'a aşağıdaki kodu ekleyin:
import GoogleCast
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
fileprivate var enableSDKLogging = true
...
func application(_: UIApplication,
didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
...
let options = GCKCastOptions(discoveryCriteria: GCKDiscoveryCriteria(applicationID: kReceiverAppID))
options.physicalVolumeButtonsWillControlDeviceVolume = true
GCKCastContext.setSharedInstanceWith(options)
window?.clipsToBounds = true
setupCastLogging()
...
}
...
func setupCastLogging() {
let logFilter = GCKLoggerFilter()
let classesToLog = ["GCKDeviceScanner", "GCKDeviceProvider", "GCKDiscoveryManager", "GCKCastChannel",
"GCKMediaControlChannel", "GCKUICastButton", "GCKUIMediaController", "NSMutableDictionary"]
logFilter.setLoggingLevel(.verbose, forClasses: classesToLog)
GCKLogger.sharedInstance().filter = logFilter
GCKLogger.sharedInstance().delegate = self
}
}
...
// MARK: - GCKLoggerDelegate
extension AppDelegate: GCKLoggerDelegate {
func logMessage(_ message: String,
at _: GCKLoggerLevel,
fromFunction function: String,
location: String) {
if enableSDKLogging {
// Send SDK's log messages directly to the console.
print("\(location): \(function) - \(message)")
}
}
}
Yayınla düğmesi
GCKCastContext başlatıldığına göre, kullanıcının yayın cihazı seçmesine izin vermek için Yayınla düğmesini eklememiz gerekiyor. Cast SDK, UIButton alt sınıfı olarak GCKUICastButton adlı bir yayın düğmesi bileşeni sağlar. UIBarButtonItem içine alınarak uygulamanın başlık çubuğuna eklenebilir. Yayınla düğmesini hem MediaTableViewController hem de MediaViewController uygulamasına eklememiz gerekiyor.
Aşağıdaki kodu MediaTableViewController.swift ve MediaViewController.swift dosyalarına ekleyin:
import GoogleCast
@objc(MediaTableViewController)
class MediaTableViewController: UITableViewController, GCKSessionManagerListener,
MediaListModelDelegate, GCKRequestDelegate {
private var castButton: GCKUICastButton!
...
override func viewDidLoad() {
print("MediaTableViewController - viewDidLoad")
super.viewDidLoad()
...
castButton = GCKUICastButton(frame: CGRect(x: CGFloat(0), y: CGFloat(0),
width: CGFloat(24), height: CGFloat(24)))
// Overwrite the UIAppearance theme in the AppDelegate.
castButton.tintColor = UIColor.white
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: castButton)
...
}
...
}
Ardından, MediaViewController.swift dosyasına aşağıdaki kodu ekleyin:
import GoogleCast
@objc(MediaViewController)
class MediaViewController: UIViewController, GCKSessionManagerListener, GCKRemoteMediaClientListener,
LocalPlayerViewDelegate, GCKRequestDelegate {
private var castButton: GCKUICastButton!
...
override func viewDidLoad() {
super.viewDidLoad()
print("in MediaViewController viewDidLoad")
...
castButton = GCKUICastButton(frame: CGRect(x: CGFloat(0), y: CGFloat(0),
width: CGFloat(24), height: CGFloat(24)))
// Overwrite the UIAppearance theme in the AppDelegate.
castButton.tintColor = UIColor.white
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: castButton)
...
}
...
}
Şimdi uygulamayı çalıştırın. Uygulamanın gezinme çubuğunda bir yayın düğmesi görürsünüz. Bu düğmeyi tıkladığınızda yerel ağınızdaki yayın cihazları listelenir. Cihaz keşfi, GCKCastContext tarafından otomatik olarak yönetilir. Yayın cihazınızı seçtiğinizde örnek alıcı uygulaması, yayın cihazına yüklenir. Göz atma etkinliği ile yerel oynatıcı etkinliği arasında geçiş yapabilirsiniz. Yayın düğmesinin durumu senkronize edilir.
Medya oynatma için henüz destek eklemediğimizden Cast cihazında videoları oynatamazsınız. Yayınlamayı durdurmak için Yayınla düğmesini tıklayın.
6. Video içeriğini yayınlama

Örnek uygulamayı, videoları Cast cihazda uzaktan oynatacak şekilde genişleteceğiz. Bunu yapmak için Cast çerçevesi tarafından oluşturulan çeşitli etkinlikleri dinlememiz gerekir.
Medya yayınlama
Genel olarak, bir yayın cihazında medya oynatmak istiyorsanız şunlar gerekir:
- Cast SDK'dan medya öğesini modelleyen bir
GCKMediaInformationnesnesi oluşturun. - Kullanıcı, alıcı uygulamanızı başlatmak için yayın cihazına bağlanır.
GCKMediaInformationnesnesini alıcınıza yükleyin ve içeriği oynatın.- Medya durumunu takip edin.
- Kullanıcı etkileşimlerine göre alıcıya oynatma komutları gönderme.
1. adım, bir nesneyi başka bir nesneyle eşlemeye karşılık gelir. GCKMediaInformation, Cast SDK'nın anladığı bir şeydir ve MediaItem, medya öğesi için uygulamamızın kapsülüdür. MediaItem öğesini GCKMediaInformation öğesiyle kolayca eşleyebiliriz. Önceki bölümde 2. adımı tamamlamıştık. 3. adımı Cast SDK ile kolayca gerçekleştirebilirsiniz.
MediaViewController örnek uygulaması, bu enum'u kullanarak yerel ve uzaktan oynatma arasında ayrım yapıyor:
enum PlaybackMode: Int {
case none = 0
case local
case remote
}
private var playbackMode = PlaybackMode.none
Bu codelab'de tüm örnek oyuncu mantığının tam olarak nasıl çalıştığını anlamanız önemli değildir. Uygulamanızın medya oynatıcısının, iki oynatma konumunu benzer şekilde algılayacak şekilde değiştirilmesi gerektiğini anlamanız önemlidir.
Şu anda yerel oynatıcı, yayınlama durumları hakkında henüz bir bilgiye sahip olmadığı için her zaman yerel oynatma durumundadır. Cast çerçevesinde gerçekleşen durum geçişlerine göre kullanıcı arayüzünü güncellememiz gerekiyor. Örneğin, yayınlamaya başladığımızda yerel oynatmayı durdurmamız ve bazı kontrolleri devre dışı bırakmamız gerekir. Benzer şekilde, bu görünüm denetleyicisindeyken yayınlamayı durdurursak yerel oynatmaya geçmemiz gerekir. Bunu işlemek için Cast çerçevesi tarafından oluşturulan çeşitli etkinlikleri dinlememiz gerekir.
Yayınlama oturumu yönetimi
Cast çerçevesinde, Cast oturumu bir cihaza bağlanma, başlatma (veya katılma), alıcı uygulamasına bağlanma ve uygunsa medya kontrol kanalı başlatma adımlarını birleştirir. Medya kontrol kanalı, Cast çerçevesinin alıcı medya oynatıcıdan mesaj gönderip aldığı yerdir.
Kullanıcı, Yayınla düğmesinden bir cihaz seçtiğinde yayın oturumu otomatik olarak başlatılır ve bağlantıyı kestiğinde otomatik olarak durdurulur. Ağ sorunları nedeniyle alıcı oturumuna yeniden bağlanma da Cast çerçevesi tarafından otomatik olarak gerçekleştirilir.
Yayın oturumları, GCKCastContext.sharedInstance().sessionManager üzerinden erişilebilen GCKSessionManager tarafından yönetilir. GCKSessionManagerListener geri çağırmaları, oluşturma, askıya alma, devam ettirme ve sonlandırma gibi oturum etkinliklerini izlemek için kullanılabilir.
Öncelikle oturum dinleyicimizi kaydetmemiz ve bazı değişkenleri başlatmamız gerekir:
class MediaViewController: UIViewController, GCKSessionManagerListener,
GCKRemoteMediaClientListener, LocalPlayerViewDelegate, GCKRequestDelegate {
...
private var sessionManager: GCKSessionManager!
...
required init?(coder: NSCoder) {
super.init(coder: coder)
sessionManager = GCKCastContext.sharedInstance().sessionManager
...
}
override func viewWillAppear(_ animated: Bool) {
...
let hasConnectedSession: Bool = (sessionManager.hasConnectedSession())
if hasConnectedSession, (playbackMode != .remote) {
populateMediaInfo(false, playPosition: 0)
switchToRemotePlayback()
} else if sessionManager.currentSession == nil, (playbackMode != .local) {
switchToLocalPlayback()
}
sessionManager.add(self)
...
}
override func viewWillDisappear(_ animated: Bool) {
...
sessionManager.remove(self)
sessionManager.currentCastSession?.remoteMediaClient?.remove(self)
...
super.viewWillDisappear(animated)
}
func switchToLocalPlayback() {
...
sessionManager.currentCastSession?.remoteMediaClient?.remove(self)
...
}
func switchToRemotePlayback() {
...
sessionManager.currentCastSession?.remoteMediaClient?.add(self)
...
}
// MARK: - GCKSessionManagerListener
func sessionManager(_: GCKSessionManager, didStart session: GCKSession) {
print("MediaViewController: sessionManager didStartSession \(session)")
setQueueButtonVisible(true)
switchToRemotePlayback()
}
func sessionManager(_: GCKSessionManager, didResumeSession session: GCKSession) {
print("MediaViewController: sessionManager didResumeSession \(session)")
setQueueButtonVisible(true)
switchToRemotePlayback()
}
func sessionManager(_: GCKSessionManager, didEnd _: GCKSession, withError error: Error?) {
print("session ended with error: \(String(describing: error))")
let message = "The Casting session has ended.\n\(String(describing: error))"
if let window = appDelegate?.window {
Toast.displayMessage(message, for: 3, in: window)
}
setQueueButtonVisible(false)
switchToLocalPlayback()
}
func sessionManager(_: GCKSessionManager, didFailToStartSessionWithError error: Error?) {
if let error = error {
showAlert(withTitle: "Failed to start a session", message: error.localizedDescription)
}
setQueueButtonVisible(false)
}
func sessionManager(_: GCKSessionManager,
didFailToResumeSession _: GCKSession, withError _: Error?) {
if let window = UIApplication.shared.delegate?.window {
Toast.displayMessage("The Casting session could not be resumed.",
for: 3, in: window)
}
setQueueButtonVisible(false)
switchToLocalPlayback()
}
...
}
MediaViewController uygulamasında, yerel oynatıcıya geçebilmek veya yerel oynatıcıdan çıkabilmek için yayın cihazına bağlandığımızda ya da bağlantımız kesildiğinde bilgilendirilmek istiyoruz. Bağlantının yalnızca mobil cihazınızda çalışan uygulama örneğiniz tarafından değil, farklı bir mobil cihazda çalışan başka bir uygulama örneğiniz (veya başka bir uygulama) tarafından da kesintiye uğrayabileceğini unutmayın.
Şu anda etkin olan oturuma GCKCastContext.sharedInstance().sessionManager.currentCastSession olarak erişilebilir. Oturumlar, yayın iletişim kutularındaki kullanıcı hareketlerine yanıt olarak otomatik şekilde oluşturulur ve sonlandırılır.
Medya yükleniyor
Cast SDK'sında GCKRemoteMediaClient, alıcıda uzaktan medya oynatmayı yönetmek için bir dizi kullanışlı API sağlar. Medya oynatmayı destekleyen bir GCKCastSession için SDK tarafından otomatik olarak bir GCKRemoteMediaClient örneği oluşturulur. Bu bilgilere, GCKCastSession örneğinin remoteMediaClient özelliği olarak erişilebilir.
Alıcıda şu anda seçili olan videoyu yüklemek için MediaViewController.swift dosyasına aşağıdaki kodu ekleyin:
@objc(MediaViewController)
class MediaViewController: UIViewController, GCKSessionManagerListener,
GCKRemoteMediaClientListener, LocalPlayerViewDelegate, GCKRequestDelegate {
...
@objc func playSelectedItemRemotely() {
loadSelectedItem(byAppending: false)
}
/**
* Loads the currently selected item in the current cast media session.
* @param appending If YES, the item is appended to the current queue if there
* is one. If NO, or if
* there is no queue, a new queue containing only the selected item is created.
*/
func loadSelectedItem(byAppending appending: Bool) {
print("enqueue item \(String(describing: mediaInfo))")
if let remoteMediaClient = sessionManager.currentCastSession?.remoteMediaClient {
let mediaQueueItemBuilder = GCKMediaQueueItemBuilder()
mediaQueueItemBuilder.mediaInformation = mediaInfo
mediaQueueItemBuilder.autoplay = true
mediaQueueItemBuilder.preloadTime = TimeInterval(UserDefaults.standard.integer(forKey: kPrefPreloadTime))
let mediaQueueItem = mediaQueueItemBuilder.build()
if appending {
let request = remoteMediaClient.queueInsert(mediaQueueItem, beforeItemWithID: kGCKMediaQueueInvalidItemID)
request.delegate = self
} else {
let queueDataBuilder = GCKMediaQueueDataBuilder(queueType: .generic)
queueDataBuilder.items = [mediaQueueItem]
queueDataBuilder.repeatMode = remoteMediaClient.mediaStatus?.queueRepeatMode ?? .off
let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder()
mediaLoadRequestDataBuilder.mediaInformation = mediaInfo
mediaLoadRequestDataBuilder.queueData = queueDataBuilder.build()
let request = remoteMediaClient.loadMedia(with: mediaLoadRequestDataBuilder.build())
request.delegate = self
}
}
}
...
}
Şimdi, uzaktan oynatmayı desteklemek için mevcut çeşitli yöntemleri Cast oturumu mantığını kullanacak şekilde güncelleyin:
required init?(coder: NSCoder) {
super.init(coder: coder)
...
castMediaController = GCKUIMediaController()
...
}
func switchToLocalPlayback() {
print("switchToLocalPlayback")
if playbackMode == .local {
return
}
setQueueButtonVisible(false)
var playPosition: TimeInterval = 0
var paused: Bool = false
var ended: Bool = false
if playbackMode == .remote {
playPosition = castMediaController.lastKnownStreamPosition
paused = (castMediaController.lastKnownPlayerState == .paused)
ended = (castMediaController.lastKnownPlayerState == .idle)
print("last player state: \(castMediaController.lastKnownPlayerState), ended: \(ended)")
}
populateMediaInfo((!paused && !ended), playPosition: playPosition)
sessionManager.currentCastSession?.remoteMediaClient?.remove(self)
playbackMode = .local
}
func switchToRemotePlayback() {
print("switchToRemotePlayback; mediaInfo is \(String(describing: mediaInfo))")
if playbackMode == .remote {
return
}
// If we were playing locally, load the local media on the remote player
if playbackMode == .local, (_localPlayerView.playerState != .stopped), (mediaInfo != nil) {
print("loading media: \(String(describing: mediaInfo))")
let paused: Bool = (_localPlayerView.playerState == .paused)
let mediaQueueItemBuilder = GCKMediaQueueItemBuilder()
mediaQueueItemBuilder.mediaInformation = mediaInfo
mediaQueueItemBuilder.autoplay = !paused
mediaQueueItemBuilder.preloadTime = TimeInterval(UserDefaults.standard.integer(forKey: kPrefPreloadTime))
mediaQueueItemBuilder.startTime = _localPlayerView.streamPosition ?? 0
let mediaQueueItem = mediaQueueItemBuilder.build()
let queueDataBuilder = GCKMediaQueueDataBuilder(queueType: .generic)
queueDataBuilder.items = [mediaQueueItem]
queueDataBuilder.repeatMode = .off
let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder()
mediaLoadRequestDataBuilder.queueData = queueDataBuilder.build()
let request = sessionManager.currentCastSession?.remoteMediaClient?.loadMedia(with: mediaLoadRequestDataBuilder.build())
request?.delegate = self
}
_localPlayerView.stop()
_localPlayerView.showSplashScreen()
setQueueButtonVisible(true)
sessionManager.currentCastSession?.remoteMediaClient?.add(self)
playbackMode = .remote
}
/* Play has been pressed in the LocalPlayerView. */
func continueAfterPlayButtonClicked() -> Bool {
let hasConnectedCastSession = sessionManager.hasConnectedCastSession
if mediaInfo != nil, hasConnectedCastSession() {
// Display an alert box to allow the user to add to queue or play
// immediately.
if actionSheet == nil {
actionSheet = ActionSheet(title: "Play Item", message: "Select an action", cancelButtonText: "Cancel")
actionSheet?.addAction(withTitle: "Play Now", target: self,
selector: #selector(playSelectedItemRemotely))
}
actionSheet?.present(in: self, sourceView: _localPlayerView)
return false
}
return true
}
Şimdi uygulamayı mobil cihazınızda çalıştırın. Yayın cihazınıza bağlanın ve bir video oynatmaya başlayın. Videoyu alıcıda oynarken görmeniz gerekir.
7. Mini kumanda
Cast Tasarım Kontrol Listesi, kullanıcının mevcut içerik sayfasından ayrılması durumunda tüm Cast uygulamalarının mini denetleyici sağlamasını zorunlu kılar. Mini denetleyici, mevcut yayın oturumuna anında erişim ve görünür bir hatırlatıcı sağlar.

Cast SDK, kalıcı kontrolleri göstermek istediğiniz sahnelere eklenebilen bir kontrol çubuğu (GCKUIMiniMediaControlsViewController) sağlar.
Örnek uygulamada, başka bir görünüm denetleyicisini sarmalayan ve alt kısma GCKUICastContainerViewController ekleyen GCKUIMiniMediaControlsViewController öğesini kullanacağız.
AppDelegate.swift dosyasını değiştirin ve aşağıdaki yöntemde if useCastContainerViewController koşulu için aşağıdaki kodu ekleyin:
func application(_: UIApplication,
didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
...
let appStoryboard = UIStoryboard(name: "Main", bundle: nil)
guard let navigationController = appStoryboard.instantiateViewController(withIdentifier: "MainNavigation")
as? UINavigationController else { return false }
let castContainerVC = GCKCastContext.sharedInstance().createCastContainerController(for: navigationController)
as GCKUICastContainerViewController
castContainerVC.miniMediaControlsItemEnabled = true
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = castContainerVC
window?.makeKeyAndVisible()
...
}
Mini oynatıcının görünürlüğünü kontrol etmek için bu özelliği ve belirleyici/alıcıyı ekleyin (bunları daha sonraki bir bölümde kullanacağız):
var isCastControlBarsEnabled: Bool {
get {
if useCastContainerViewController {
let castContainerVC = (window?.rootViewController as? GCKUICastContainerViewController)
return castContainerVC!.miniMediaControlsItemEnabled
} else {
let rootContainerVC = (window?.rootViewController as? RootContainerViewController)
return rootContainerVC!.miniMediaControlsViewEnabled
}
}
set(notificationsEnabled) {
if useCastContainerViewController {
var castContainerVC: GCKUICastContainerViewController?
castContainerVC = (window?.rootViewController as? GCKUICastContainerViewController)
castContainerVC?.miniMediaControlsItemEnabled = notificationsEnabled
} else {
var rootContainerVC: RootContainerViewController?
rootContainerVC = (window?.rootViewController as? RootContainerViewController)
rootContainerVC?.miniMediaControlsViewEnabled = notificationsEnabled
}
}
}
Uygulamayı çalıştırın ve bir video yayınlayın. Alıcıda oynatma başladığında her sahnenin alt kısmında mini kontrolcü görünür. Mini denetleyiciyi kullanarak uzaktan oynatmayı kontrol edebilirsiniz. Göz atma etkinliği ile yerel oynatıcı etkinliği arasında geçiş yaparsanız mini denetleyici durumu, alıcıdaki medya oynatma durumuyla senkronize kalmalıdır.
8. Tanıtım amaçlı yer paylaşımı
Google Cast tasarım kontrol listesi, gönderen uygulamasının mevcut kullanıcılara yayın düğmesini tanıtmasını gerektirir. Bu sayede kullanıcılar, gönderen uygulamasının artık Cast'i desteklediğini öğrenir ve Google Cast'i yeni kullanmaya başlayan kullanıcılara yardımcı olunur.

GCKCastContext sınıfında, kullanıcıya ilk kez gösterildiğinde yayın düğmesini vurgulamak için kullanılabilecek bir presentCastInstructionsViewControllerOnce yöntemi bulunur. Aşağıdaki kodu MediaViewController.swift ve MediaTableViewController.swift dosyalarına ekleyin:
override func viewDidLoad() {
...
NotificationCenter.default.addObserver(self, selector: #selector(castDeviceDidChange),
name: NSNotification.Name.gckCastStateDidChange,
object: GCKCastContext.sharedInstance())
}
@objc func castDeviceDidChange(_: Notification) {
if GCKCastContext.sharedInstance().castState != .noDevicesAvailable {
// You can present the instructions on how to use Google Cast on
// the first time the user uses you app
GCKCastContext.sharedInstance().presentCastInstructionsViewControllerOnce(with: castButton)
}
}
Uygulamayı mobil cihazınızda çalıştırdığınızda tanıtım yer paylaşımını görürsünüz.
9. Genişletilmiş kontrol cihazı
Google Cast tasarım kontrol listesi, gönderen uygulamanın yayınlanan medya için genişletilmiş denetleyici sağlamasını zorunlu kılar. Genişletilmiş denetleyici, mini denetleyicinin tam ekran sürümüdür.

Genişletilmiş denetleyici, uzaktan medya oynatma üzerinde tam kontrol sağlayan tam ekran görünümüdür. Bu görünüm, alıcı ses kontrolü ve oturum yaşam döngüsü (bağlan/yayınlamayı durdur) hariç olmak üzere, yayın oturumunun yönetilebilir her yönünü bir yayın uygulaması tarafından yönetilmesine olanak tanımalıdır. Ayrıca medya oturumuyla ilgili tüm durum bilgilerini (sanat eseri, başlık, altyazı vb.) sağlar.
Bu görünümün işlevselliği GCKUIExpandedMediaControlsViewController sınıfı tarafından uygulanır.
İlk olarak yayın bağlamında varsayılan genişletilmiş denetleyiciyi etkinleştirmeniz gerekir. Varsayılan genişletilmiş denetleyiciyi etkinleştirmek için AppDelegate.swift öğesini değiştirin:
import GoogleCast
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
func application(_: UIApplication,
didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
...
// Add after the setShareInstanceWith(options) is set.
GCKCastContext.sharedInstance().useDefaultExpandedMediaControls = true
...
}
...
}
Kullanıcı video yayınlamaya başladığında genişletilmiş denetleyiciyi yüklemek için MediaViewController.swift bölümüne aşağıdaki kodu ekleyin:
@objc func playSelectedItemRemotely() {
...
appDelegate?.isCastControlBarsEnabled = false
GCKCastContext.sharedInstance().presentDefaultExpandedMediaControls()
}
Kullanıcı mini kumandaya dokunduğunda genişletilmiş kumanda da otomatik olarak başlatılır.
Uygulamayı çalıştırın ve bir video yayınlayın. Genişletilmiş denetleyiciyi görürsünüz. Video listesine geri dönün. Mini denetleyiciyi tıkladığınızda genişletilmiş denetleyici tekrar yüklenir.
10. Cast Connect desteği ekleme
Cast Connect kitaplığı, mevcut gönderen uygulamalarının Cast protokolü aracılığıyla Android TV uygulamalarıyla iletişim kurmasına olanak tanır. Cast Connect, Android TV uygulamanızın alıcı görevi gördüğü Cast altyapısı üzerine kuruludur.
Bağımlılıklar
Podfile cihazınızda google-cast-sdk değerinin aşağıda listelendiği gibi 4.4.8 veya daha yüksek bir değere ayarlandığından emin olun. Dosyada değişiklik yaptıysanız değişikliği projenizle senkronize etmek için konsoldan pod update komutunu çalıştırın.
pod 'google-cast-sdk', '>=4.4.8'
GCKLaunchOptions
Android alıcı olarak da bilinen Android TV uygulamasını başlatmak için androidReceiverCompatible işaretini GCKLaunchOptions nesnesinde doğru olarak ayarlamamız gerekir. Bu GCKLaunchOptions nesnesi, alıcının nasıl başlatılacağını belirler ve GCKCastContext.setSharedInstanceWith kullanılarak paylaşılan örnekte ayarlanan GCKCastOptions'ye iletilir.
AppDelegate.swift dosyanıza aşağıdaki satırları ekleyin:
let options = GCKCastOptions(discoveryCriteria:
GCKDiscoveryCriteria(applicationID: kReceiverAppID))
...
/** Following code enables CastConnect */
let launchOptions = GCKLaunchOptions()
launchOptions.androidReceiverCompatible = true
options.launchOptions = launchOptions
GCKCastContext.setSharedInstanceWith(options)
Başlatma Kimlik Bilgilerini Ayarlama
Gönderen tarafında, oturuma kimin katıldığını belirtmek için GCKCredentialsData değerini belirtebilirsiniz. credentials, ATV uygulamanızın anlayabileceği sürece kullanıcı tarafından tanımlanabilen bir dizedir. GCKCredentialsData yalnızca başlatma veya katılma sırasında Android TV uygulamanıza iletilir. Bağlıyken tekrar ayarlarsanız Android TV uygulamanıza aktarılmaz.
Başlatma Kimlik Bilgileri'ni ayarlamak için GCKLaunchOptions ayarlandıktan sonra GCKCredentialsData herhangi bir zamanda tanımlanmalıdır. Bunu göstermek için oturum oluşturulduğunda kimlik bilgilerinin iletilmesini sağlayacak şekilde Creds düğmesine mantık ekleyelim. MediaTableViewController.swift dosyasına aşağıdaki kodu ekleyin:
class MediaTableViewController: UITableViewController, GCKSessionManagerListener, MediaListModelDelegate, GCKRequestDelegate {
...
private var credentials: String? = nil
...
override func viewDidLoad() {
...
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Creds", style: .plain,
target: self, action: #selector(toggleLaunchCreds))
...
setLaunchCreds()
}
...
@objc func toggleLaunchCreds(_: Any){
if (credentials == nil) {
credentials = "{\"userId\":\"id123\"}"
} else {
credentials = nil
}
Toast.displayMessage("Launch Credentials: "+(credentials ?? "Null"), for: 3, in: appDelegate?.window)
print("Credentials set: "+(credentials ?? "Null"))
setLaunchCreds()
}
...
func setLaunchCreds() {
GCKCastContext.sharedInstance()
.setLaunch(GCKCredentialsData(credentials: credentials))
}
}
Yükleme isteğinde kimlik bilgilerini ayarlama
Hem web hem de Android TV alıcı uygulamalarınızda credentials işlevini kullanmak için loadSelectedItem işlevi altındaki MediaTableViewController.swift sınıfınıza aşağıdaki kodu ekleyin:
let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder()
...
mediaLoadRequestDataBuilder.credentials = credentials
...
Göndereninizin yayın yaptığı alıcı uygulamaya bağlı olarak SDK, yukarıdaki kimlik bilgilerini devam eden oturuma otomatik olarak uygular.
Cast Connect'i test etme
Android TV APK'sını Google TV Yüklü Chromecast'e yükleme adımları
- Android TV cihazınızın IP adresini bulun. Genellikle Ayarlar > Ağ ve İnternet > (Cihazınızın bağlı olduğu ağın adı) bölümünde bulunur. Sağ tarafta ayrıntılar ve cihazınızın ağdaki IP'si gösterilir.
- Terminali kullanarak ADB üzerinden cihazınıza bağlanmak için cihazınızın IP adresini kullanın:
$ adb connect <device_ip_address>:5555
- Terminal pencerenizde, bu codelab'in başında indirdiğiniz codelab örneklerinin bulunduğu üst düzey klasöre gidin. Örneğin:
$ cd Desktop/ios_codelab_src
- Bu klasördeki .apk dosyasını aşağıdaki komutu çalıştırarak Android TV'nize yükleyin:
$ adb -s <device_ip_address>:5555 install android-tv-app.apk
- Android TV cihazınızdaki Uygulamalarınız menüsünde Video Yayınla adlı bir uygulama görmeniz gerekir.
- İşlem tamamlandıktan sonra uygulamayı bir emülatörde veya mobil cihazda oluşturup çalıştırın. Android TV cihazınızla yayın oturumu oluşturduktan sonra Android TV'nizde Android alıcı uygulaması başlatılmalıdır. iOS mobil göndericinizden bir video oynattığınızda video, Android alıcıda başlatılır ve Android TV cihazınızın uzaktan kumandasını kullanarak oynatmayı kontrol etmenize olanak tanır.
11. Cast widget'larını özelleştirme
Başlatma
App-Done klasörüyle başlayın. AppDelegate.swift dosyanızdaki applicationDidFinishLaunchingWithOptions yöntemine aşağıdakileri ekleyin.
func application(_: UIApplication,
didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
...
let styler = GCKUIStyle.sharedInstance()
...
}
Bu codelab'in geri kalanında belirtildiği gibi bir veya daha fazla özelleştirme uyguladıktan sonra aşağıdaki kodu çağırarak stilleri işleyin.
styler.apply()
Yayın görünümlerini özelleştirme
Cast Application Framework'ün yönettiği tüm görünümleri, görünümlerde varsayılan stil yönergeleri kullanarak özelleştirebilirsiniz. Örneğin, simge renk tonunu değiştirelim.
styler.castViews.iconTintColor = .lightGray
Gerekirse varsayılanları ekran bazında geçersiz kılabilirsiniz. Örneğin, yalnızca genişletilmiş medya kumandası için simge renk tonu rengi olarak lightGrayColor'ı geçersiz kılmak istiyorsanız.
styler.castViews.mediaControl.expandedController.iconTintColor = .green
Renkleri değiştirme
Tüm görünümlerin (veya her görünümün ayrı ayrı) arka plan rengini özelleştirebilirsiniz. Aşağıdaki kod, Cast Application Framework tarafından sağlanan tüm görünümlerinizin arka plan rengini mavi olarak ayarlar.
styler.castViews.backgroundColor = .blue
styler.castViews.mediaControl.miniController.backgroundColor = .yellow
Yazı tiplerini değiştirme
Yayın görünümlerinde görünen farklı etiketlerin yazı tiplerini özelleştirebilirsiniz. Örnek olarak tüm yazı tiplerini "Courier-Oblique" olarak ayarlayalım.
styler.castViews.headingTextFont = UIFont.init(name: "Courier-Oblique", size: 16) ?? UIFont.systemFont(ofSize: 16)
styler.castViews.mediaControl.headingTextFont = UIFont.init(name: "Courier-Oblique", size: 6) ?? UIFont.systemFont(ofSize: 6)
Varsayılan düğme resimlerini değiştirme
Projeye kendi özel resimlerinizi ekleyin ve düğmelerinizi stilize etmek için resimleri düğmelerinize atayın.
let muteOnImage = UIImage.init(named: "yourImage.png")
if let muteOnImage = muteOnImage {
styler.castViews.muteOnImage = muteOnImage
}
Yayınla düğmesinin temasını değiştirme
Cast widget'larını UIAppearance protokolünü kullanarak da temalandırabilirsiniz. Aşağıdaki kod, GCKUICastButton'ı göründüğü tüm görünümlerde temalandırır:
GCKUICastButton.appearance().tintColor = UIColor.gray
12. Tebrikler
Artık iOS'te Cast SDK widget'larını kullanarak bir video uygulamasında Cast'i nasıl etkinleştireceğinizi biliyorsunuz.
Daha fazla bilgi için iOS Sender geliştirici kılavuzunu inceleyin.