iOS ऐप्लिकेशन को कास्ट करें

1. खास जानकारी

Google Cast का लोगो

यह कोडलैब आपको किसी मौजूदा iOS वीडियो ऐप्लिकेशन में बदलाव करने का तरीका बताता है, ताकि Google Cast की सुविधा वाले डिवाइस पर कॉन्टेंट कास्ट किया जा सके.

Google Cast क्या है?

Google Cast, उपयोगकर्ताओं को मोबाइल डिवाइस से टीवी पर कॉन्टेंट को कास्ट करने की सुविधा देता है. इसके बाद, लोग अपने मोबाइल डिवाइस को रिमोट कंट्रोल के तौर पर इस्तेमाल करके, टीवी पर मीडिया चला सकते हैं.

Google Cast SDK टूल की मदद से, अपने ऐप्लिकेशन का डेटा बढ़ाया जा सकता है, ताकि उन डिवाइसों (जैसे कि टीवी या साउंड सिस्टम) को कंट्रोल किया जा सके जिन पर Google Cast की सुविधा चालू है. कास्ट SDK टूल से, Google Cast डिज़ाइन चेकलिस्ट के आधार पर ज़रूरी यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट जोड़ने की सुविधा मिलती है.

Google Cast डिज़ाइन चेकलिस्ट इसलिए दी गई है, ताकि Cast के साथ काम करने वाले सभी प्लैटफ़ॉर्म पर, कास्ट करने वालों के अनुभव को आसान बनाया जा सके और उनका अनुमान लगाया जा सके.

हम क्या बनाने जा रहे हैं?

इस कोडलैब को पूरा कर लेने के बाद, आपके पास एक iOS वीडियो ऐप्लिकेशन होगा, जिससे Google Cast डिवाइस पर वीडियो कास्ट किए जा सकेंगे.

आप इन चीज़ों के बारे में जानेंगे

  • सैंपल वीडियो ऐप्लिकेशन में Google Cast SDK टूल जोड़ने का तरीका.
  • Google Cast डिवाइस को चुनने के लिए, कास्ट बटन जोड़ने का तरीका.
  • कास्ट डिवाइस से कनेक्ट करने और मीडिया रिसीवर को लॉन्च करने का तरीका.
  • वीडियो को कास्ट करने का तरीका.
  • अपने ऐप्लिकेशन में कास्ट मिनी कंट्रोलर जोड़ने का तरीका.
  • बड़ा किया गया कंट्रोलर जोड़ने का तरीका.
  • शुरुआती ओवरले देने का तरीका.
  • कास्ट विजेट को पसंद के मुताबिक बनाने का तरीका.
  • Cast Connect को इंटिग्रेट करने का तरीका

आपको इनकी ज़रूरत होगी

  • नया Xcode.
  • iOS 9 या इसके बाद के वर्शन (या Xcode सिम्युलेटर) वाला एक मोबाइल डिवाइस.
  • अगर डिवाइस का इस्तेमाल किया जा रहा है, तो मोबाइल डिवाइस को डेवलपमेंट कंप्यूटर से कनेक्ट करने के लिए यूएसबी डेटा केबल.
  • Google Cast डिवाइस, जैसे कि Chromecast या Android TV, जिसे इंटरनेट ऐक्सेस के साथ कॉन्फ़िगर किया गया हो.
  • एचडीएमआई इनपुट वाला टीवी या मॉनिटर.
  • Cast Connect के इंटिग्रेशन को टेस्ट करने के लिए, Chromecast with Google TV की ज़रूरत होती है. हालांकि, कोडलैब के बाकी टूल के लिए यह ज़रूरी नहीं है. अगर आपके पास AdSense कनेक्ट नहीं है, तो इस ट्यूटोरियल को खत्म करने के लिए, Cast Connect सहायता जोड़ें चरण को बेझिझक छोड़ दें.

अनुभव

  • आपके पास iOS डेवलपमेंट की पहले से जानकारी होनी चाहिए.
  • इसके लिए, आपके पास टीवी देखने के बारे में पहले से जानकारी भी होनी चाहिए :)

आपको इस ट्यूटोरियल का इस्तेमाल कैसे करना है?

इसे सिर्फ़ पढ़ें इसे पढ़ें और सभी कसरतों को पूरा करें

iOS ऐप्लिकेशन बनाने के अपने अनुभव के लिए आपकी रेटिंग क्या होगी?

नया इंटरमीडिएट कुशल

आपके हिसाब से टीवी देखने का अनुभव कैसा रहा?

नई इंटरमीडिएट कुशल

2. सैंपल कोड पाएं

आप या तो अपने कंप्यूटर पर सभी सैंपल कोड डाउनलोड कर सकते हैं...

और डाउनलोड की गई ZIP फ़ाइल को अनपैक करें.

3. सैंपल ऐप्लिकेशन चलाएं

Apple iOS का लोगो

पहले, आइए देखते हैं कि पूरा किया गया सैंपल ऐप्लिकेशन कैसा दिखता है. यह ऐप्लिकेशन एक बेसिक वीडियो प्लेयर है. उपयोगकर्ता सूची से वीडियो चुन सकता है और फिर वीडियो को डिवाइस पर स्थानीय रूप से चला सकता है या उसे Google Cast डिवाइस पर कास्ट कर सकता है.

डाउनलोड किए गए कोड के साथ, नीचे दिए गए निर्देशों में Xcode में पूरे सैंपल ऐप्लिकेशन को खोलने और चलाने का तरीका बताया गया है:

अक्सर पूछे जाने वाले सवाल

CocoaPods का सेटअप

CocoaPods को सेटअप करने के लिए, अपने कंसोल पर जाएं और macOS पर उपलब्ध, डिफ़ॉल्ट Ruby का इस्तेमाल करके इंस्टॉल करें:

sudo gem install cocoapods

अगर आपको कोई समस्या होती है, तो डिपेंडेंसी मैनेजर को डाउनलोड और इंस्टॉल करने के लिए, आधिकारिक दस्तावेज़ देखें.

प्रोजेक्ट सेटअप

  1. अपने टर्मिनल पर जाएं और कोडलैब (कोड बनाना सीखना) डायरेक्ट्री पर नेविगेट करें.
  2. Podfile से डिपेंडेंसी इंस्टॉल करें.
cd app-done
pod update
pod install
  1. Xcode खोलें और कोई अन्य प्रोजेक्ट खोलें... चुनें
  2. सैंपल कोड फ़ोल्डर में फ़ोल्डर का आइकॉनapp-done डायरेक्ट्री से CastVideos-ios.xcworkspace फ़ाइल चुनें.

ऐप्लिकेशन चलाएं

टारगेट और सिम्युलेटर चुनें. इसके बाद, ऐप्लिकेशन चलाएं:

XCode ऐप्लिकेशन सिम्युलेटर टूलबार

कुछ सेकंड बाद, आपको वीडियो ऐप्लिकेशन दिखेगा.

जब इनकमिंग नेटवर्क कनेक्ट होने की सूचना दिखे, तो 'अनुमति दें' पर क्लिक करें. अगर यह विकल्प स्वीकार नहीं किया जाता है, तो 'कास्ट करें' आइकॉन नहीं दिखेगा.

पुष्टि करने वाला डायलॉग बॉक्स, जिसमें इनबाउंड नेटवर्क कनेक्शन को स्वीकार करने की अनुमति मांगी गई है

'कास्ट करें' बटन पर क्लिक करें और अपना Google Cast डिवाइस चुनें.

कोई वीडियो चुनें और 'चलाएं' बटन पर क्लिक करें.

वीडियो आपके Google Cast डिवाइस पर चलने लगेगा.

बड़ा किया गया कंट्रोलर दिखाया जाएगा. प्लेबैक को कंट्रोल करने के लिए, 'चलाएं/रोकें' बटन का इस्तेमाल किया जा सकता है.

वीडियो की सूची पर वापस जाएं.

स्क्रीन के सबसे नीचे, अब एक मिनी कंट्रोलर दिखेगा.

iPhone का इलस्ट्रेशन, जिसमें Cast Videos ऐप्लिकेशन चल रहा है और सबसे नीचे मिनी कंट्रोलर दिख रहा है

रिसीवर पर वीडियो रोकने के लिए, मिनी कंट्रोलर में 'रोकें' बटन पर क्लिक करें. वीडियो को फिर से चलाने के लिए, मिनी कंट्रोलर में 'चलाएं' बटन पर क्लिक करें.

Google Cast डिवाइस पर कास्ट करना रोकने के लिए, कास्ट करें बटन पर क्लिक करें.

4. शुरुआती प्रोजेक्ट तैयार करना

iPhone पर Castवीडियो ऐप्लिकेशन का इलस्ट्रेशन

आपके डाउनलोड किए गए स्टार्ट ऐप्लिकेशन के लिए, हमें Google Cast के लिए सहायता जोड़नी होगी. यहां Google Cast की कुछ शब्दावली दी गई है, जिनका इस्तेमाल हम इस कोडलैब में करेंगे:

  • भेजने वाला ऐप्लिकेशन, मोबाइल डिवाइस या लैपटॉप पर चलता है,
  • रिसीवर ऐप्लिकेशन, Google Cast डिवाइस पर चलता है.

प्रोजेक्ट सेटअप

अब आप Xcode का इस्तेमाल करके, स्टार्टर प्रोजेक्ट पर बनाने के लिए तैयार हैं:

  1. अपने टर्मिनल पर जाएं और कोडलैब (कोड बनाना सीखना) डायरेक्ट्री पर नेविगेट करें.
  2. Podfile से डिपेंडेंसी इंस्टॉल करें.
cd app-start
pod update
pod install
  1. Xcode खोलें और कोई अन्य प्रोजेक्ट खोलें... चुनें
  2. सैंपल कोड फ़ोल्डर में फ़ोल्डर का आइकॉनapp-start डायरेक्ट्री से CastVideos-ios.xcworkspace फ़ाइल चुनें.

ऐप डिज़ाइन

यह ऐप्लिकेशन, रिमोट वेब सर्वर से वीडियो की सूची फ़ेच करता है और उपयोगकर्ता को ब्राउज़ करने के लिए सूची उपलब्ध कराता है. उपयोगकर्ता मोबाइल डिवाइस पर वीडियो का विवरण देखने या उसे स्थानीय रूप से चलाने के लिए उसे चुन सकते हैं.

ऐप्लिकेशन में दो मुख्य व्यू कंट्रोलर होते हैं: MediaTableViewController और MediaViewController.

MediaTableViewController

यह UITableViewController, MediaListModel इंस्टेंस के वीडियो की सूची दिखाता है. वीडियो और उनसे जुड़े मेटाडेटा को रिमोट सर्वर पर JSON फ़ाइल के तौर पर होस्ट किया जाता है. MediaListModel, इस JSON को फ़ेच करता है और इसे प्रोसेस करके, MediaItem ऑब्जेक्ट की सूची बनाता है.

MediaItem ऑब्जेक्ट, किसी वीडियो और उससे जुड़े मेटाडेटा के मॉडल बनाता है. जैसे, टाइटल, ब्यौरा, इमेज का यूआरएल, और स्ट्रीम का यूआरएल.

MediaTableViewController एक MediaListModel इंस्टेंस बनाता है. इसके बाद, मीडिया मेटाडेटा डाउनलोड होने पर सूचना पाने के लिए, खुद को MediaListModelDelegate के तौर पर रजिस्टर करता है, ताकि यह टेबल व्यू को लोड कर सके.

उपयोगकर्ता को वीडियो के थंबनेल की एक सूची दिखती है. साथ ही, हर वीडियो के साथ उसके बारे में कम शब्दों में जानकारी दी जाती है. जब कोई आइटम चुना जाता है, तो उससे जुड़ा MediaItem MediaViewController को पास कर दिया जाता है.

MediaViewController

यह व्यू कंट्रोलर किसी वीडियो के बारे में मेटाडेटा दिखाता है और उपयोगकर्ता को मोबाइल डिवाइस पर वीडियो चलाने की अनुमति देता है.

चुने गए वीडियो की जानकारी दिखाने के लिए व्यू कंट्रोलर, LocalPlayerView, कुछ मीडिया कंट्रोल, और टेक्स्ट एरिया होस्ट करता है. प्लेयर, स्क्रीन के ऊपरी हिस्से को कवर करता है. इससे वीडियो के बारे में पूरी जानकारी नहीं मिल पाती है. उपयोगकर्ता के पास वीडियो को चलाने/रोकने या स्थानीय वीडियो चलाने की सुविधा होती है.

अक्सर पूछे जाने वाले सवाल

5. 'कास्ट करें' बटन जोड़ना

iPhone के एक तिहाई हिस्से की इमेज, जिसमें Cast Videos ऐप्लिकेशन चल रहा है और ऊपर दाएं कोने में कास्ट बटन दिख रहा है

कास्ट की सुविधा वाला ऐप्लिकेशन, अपने हर व्यू कंट्रोलर में कास्ट बटन दिखाता है. 'कास्ट करें' बटन पर क्लिक करने पर, कास्ट डिवाइसों की सूची दिखती है जिसे उपयोगकर्ता चुन सकता है. अगर उपयोगकर्ता, भेजने वाले डिवाइस पर कॉन्टेंट चला रहा था, तो कास्ट डिवाइस को चुनने पर उस पर वीडियो चलना शुरू हो जाता है या फिर से शुरू हो जाता है. कास्ट सत्र के दौरान किसी भी समय, उपयोगकर्ता कास्ट बटन पर क्लिक कर सकता है और कास्ट डिवाइस पर आपके ऐप्लिकेशन को कास्ट करना बंद कर सकता है. उपयोगकर्ता को आपके ऐप्लिकेशन की किसी भी स्क्रीन पर कास्ट डिवाइस से कनेक्ट या डिसकनेक्ट करने की सुविधा होनी चाहिए, जैसा कि Google Cast डिज़ाइन चेकलिस्ट में बताया गया है.

कॉन्फ़िगरेशन

स्टार्ट प्रोजेक्ट के लिए वही डिपेंडेंसी और Xcode सेट अप की ज़रूरत होती है जो आपने पूरे किए गए सैंपल ऐप्लिकेशन के लिए किया था. उस सेक्शन पर वापस जाएं और GoogleCast.framework को स्टार्ट ऐप्लिकेशन प्रोजेक्ट में जोड़ने के लिए, वही तरीका अपनाएं.

डेटा लेयर में इवेंट बनाने की प्रोसेस

कास्ट फ़्रेमवर्क में ग्लोबल सिंगलटन ऑब्जेक्ट, GCKCastContext होता है. यह फ़्रेमवर्क की सभी गतिविधियों का कोऑर्डिनेट करता है. ऐप्लिकेशन के लाइफ़साइकल में इस ऑब्जेक्ट को आम तौर पर, ऐप्लिकेशन का ऐक्सेस देने वाले application(_:didFinishLaunchingWithOptions:) तरीके से शुरू किया जाना चाहिए. ऐसा इसलिए किया जाता है, ताकि भेजने वाले ऐप्लिकेशन के रीस्टार्ट होने पर, अपने-आप सेशन फिर से शुरू होने की सुविधा ठीक से ट्रिगर हो सके. साथ ही, डिवाइसों के लिए स्कैन करना शुरू हो सके.

GCKCastContext शुरू करते समय GCKCastOptions ऑब्जेक्ट देना ज़रूरी है. इस क्लास में ऐसे विकल्प हैं जो फ़्रेमवर्क के व्यवहार पर असर डालते हैं. रिसीवर का ऐप्लिकेशन आईडी सबसे अहम है. इसका इस्तेमाल कास्ट डिवाइस पर खोज के नतीजों को फ़िल्टर करने और कास्ट सेशन शुरू होने पर, रिसीवर ऐप्लिकेशन को लॉन्च करने के लिए किया जाता है.

कास्ट फ़्रेमवर्क से लॉगिंग मैसेज पाने के लिए, लॉगिंग डेली को सेट अप करने के लिए भी application(_:didFinishLaunchingWithOptions:) तरीका एक अच्छी जगह है. इनसे, डीबग करने और समस्या हल करने में मदद मिल सकती है.

अपना खुद का कास्ट-चालू ऐप्लिकेशन बनाने पर, आपको कास्ट डेवलपर के तौर पर रजिस्टर करना होगा और फिर अपने ऐप्लिकेशन के लिए ऐप्लिकेशन आईडी लेना होगा. इस कोडलैब के लिए हम एक सैंपल ऐप्लिकेशन आईडी का इस्तेमाल करेंगे.

GCKCastContext को उपयोगकर्ता डिफ़ॉल्ट के ऐप्लिकेशन आईडी के साथ शुरू करने के लिए, AppDelegate.swift में नीचे दिया गया कोड जोड़ें. साथ ही, Google Cast फ़्रेमवर्क के लिए एक लॉगर जोड़ें:

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)")
    }
  }
}

कास्ट बटन

GCKCastContext अब शुरू हो गया है, इसलिए हमें कास्ट बटन जोड़ना होगा, ताकि लोग कास्ट डिवाइस चुन सकें. कास्ट SDK टूल, UIButton सब-क्लास के तौर पर GCKUICastButton नाम का एक कास्ट बटन कॉम्पोनेंट उपलब्ध कराता है. UIBarButtonItem में रैप करके, ऐप्लिकेशन के टाइटल बार में जोड़ा जा सकता है. हमें MediaTableViewController और MediaViewController, दोनों पर कास्ट बटन जोड़ना होगा.

MediaTableViewController.swift और MediaViewController.swift में यह कोड जोड़ें:

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)

    ...
  }
  ...
}

इसके बाद, अपने MediaViewController.swift में यह कोड जोड़ें:

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)

    ...
  }
  ...
}

अब ऐप्लिकेशन चलाएं. आपको ऐप्लिकेशन के नेविगेशन बार में 'कास्ट करें' बटन दिखेगा और इस पर क्लिक करने पर आपके लोकल नेटवर्क पर कास्ट डिवाइसों की सूची दिखेगी. डिवाइस डिस्कवरी को GCKCastContext अपने-आप मैनेज करता है. अपना कास्ट डिवाइस चुनें और सैंपल पाने वाला ऐप्लिकेशन, कास्ट डिवाइस पर लोड हो जाएगा. ब्राउज़ करने की गतिविधि और लोकल प्लेयर की गतिविधि के बीच नेविगेट किया जा सकता है. साथ ही, 'कास्ट करें' बटन की स्थिति सिंक में रखी जाती है.

हमने मीडिया प्लेबैक के लिए किसी भी तरह की सहायता को चालू नहीं किया है, इसलिए आप अभी कास्ट डिवाइस पर वीडियो नहीं चला सकते. कास्ट करना रोकने के लिए, 'कास्ट करें' बटन पर क्लिक करें.

6. वीडियो कॉन्टेंट कास्ट किया जा रहा है

iPhone पर CastVideos ऐप्लिकेशन का इलस्ट्रेशन, जिसमें किसी वीडियो ('Tears of Steel') की जानकारी दिख रही है. सबसे नीचे मिनी प्लेयर है

हम सैंपल ऐप्लिकेशन को बेहतर बनाने की कोशिश करेंगे, ताकि कास्ट डिवाइस पर कहीं से भी वीडियो चलाए जा सकें. ऐसा करने के लिए, हमें कास्ट फ़्रेमवर्क से जनरेट किए गए अलग-अलग इवेंट को सुनना होगा.

मीडिया कास्ट किया जा रहा है

हाई लेवल पर, अगर आपको कास्ट डिवाइस पर मीडिया चलाना है, तो इन बातों का ध्यान रखें:

  1. कास्ट SDK टूल से एक GCKMediaInformation ऑब्जेक्ट बनाएं, जो किसी मीडिया आइटम को मॉडल करता हो.
  2. आपके रिसीवर का ऐप्लिकेशन लॉन्च करने के लिए, उपयोगकर्ता कास्ट डिवाइस से कनेक्ट करता है.
  3. अपने रिसीवर में GCKMediaInformation ऑब्जेक्ट को लोड करें और कॉन्टेंट चलाएं.
  4. मीडिया की स्थिति ट्रैक करें.
  5. उपयोगकर्ता की बातचीत के हिसाब से, पाने वाले को वीडियो चलाने के निर्देश भेजें.

पहले चरण में एक ऑब्जेक्ट को दूसरे ऑब्जेक्ट पर मैप किया जाता है. GCKMediaInformation ऐसा है जिसे Cast SDK टूल समझता है और MediaItem किसी मीडिया आइटम के लिए हमारे ऐप्लिकेशन का एनकैप्सुलेशन है; हम MediaItem को GCKMediaInformation पर आसानी से मैप कर सकते हैं. हम पिछले सेक्शन में दूसरा चरण पहले ही पूरा कर चुके हैं. कास्ट SDK टूल से तीसरे चरण का आसानी से इस्तेमाल किया जा सकता है.

MediaViewController ऐप्लिकेशन का नमूना पहले से ही इस Enum का इस्तेमाल करके, लोकल और रिमोट वीडियो के बीच अंतर करता है:

enum PlaybackMode: Int {
  case none = 0
  case local
  case remote
}

private var playbackMode = PlaybackMode.none

इस कोडलैब में, यह समझना ज़रूरी नहीं है कि सैंपल प्लेयर लॉजिक कैसे काम करता है. यह समझना ज़रूरी है कि आपके ऐप्लिकेशन के मीडिया प्लेयर में बदलाव करना होगा, ताकि आपको वीडियो चलाने की दो जगहों के बारे में एक समान जानकारी मिल सके.

फ़िलहाल, लोकल प्लेयर हमेशा लोकल वीडियो मोड में ही रहता है, क्योंकि अभी उसे कास्ट करने की स्थितियों के बारे में कोई जानकारी नहीं है. कास्ट फ़्रेमवर्क में होने वाले स्टेट ट्रांज़िशन के आधार पर, हमें यूज़र इंटरफ़ेस (यूआई) को अपडेट करना होगा. उदाहरण के लिए, अगर हम कास्ट करना शुरू करते हैं, तो हमें लोकल प्लेबैक को रोकना होगा और कुछ कंट्रोल बंद करने होंगे. इसी तरह, अगर इस व्यू कंट्रोलर में होने पर हम कास्ट करना बंद कर देते हैं, तो हमें लोकल प्लेबैक में ट्रांज़िशन करना होगा. इसे मैनेज करने के लिए, हमें कास्ट फ़्रेमवर्क से जनरेट किए गए अलग-अलग इवेंट को सुनने की ज़रूरत होती है.

कास्ट सेशन को मैनेज करना

कास्ट फ़्रेमवर्क के लिए, कास्ट सेशन में डिवाइस से कनेक्ट करने, लॉन्च करने (या उसमें शामिल होने), रिसीवर ऐप्लिकेशन से कनेक्ट करने, और ज़रूरत पड़ने पर मीडिया कंट्रोल चैनल शुरू करने के चरण शामिल होते हैं. मीडिया कंट्रोल चैनल की मदद से, कास्ट फ़्रेमवर्क, रिसीवर के मीडिया प्लेयर को मैसेज भेजने और पाने की सुविधा देता है.

जब लोग कास्ट बटन से किसी डिवाइस को चुनते हैं, तब कास्ट सेशन अपने-आप शुरू हो जाएगा और डिसकनेक्ट करने पर यह अपने-आप बंद हो जाएगा. नेटवर्किंग की समस्याओं की वजह से, रिसीवर के सेशन से दोबारा कनेक्ट करने पर कास्ट फ़्रेमवर्क अपने-आप मैनेज हो जाता है.

कास्ट सेशन को GCKSessionManager मैनेज करता है. इसे GCKCastContext.sharedInstance().sessionManager से ऐक्सेस किया जा सकता है. GCKSessionManagerListener कॉलबैक का इस्तेमाल, सेशन इवेंट को मॉनिटर करने के लिए किया जा सकता है. जैसे, सेशन बनाना, निलंबित करना, फिर से शुरू करना, और बंद करना.

सबसे पहले, हमें अपने सेशन लिसनर को रजिस्टर करना होगा और कुछ वैरिएबल को शुरू करना होगा:

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 में, हम कास्ट डिवाइस से कनेक्ट या डिसकनेक्ट होने पर सूचना पाना चाहते हैं, ताकि हम लोकल प्लेयर पर या उससे स्विच कर सकें. ध्यान दें कि कनेक्टिविटी में रुकावट आपके मोबाइल डिवाइस पर चल रहे आपके ऐप्लिकेशन के इंस्टेंस से ही नहीं, बल्कि अलग-अलग मोबाइल डिवाइस पर चल रहे आपके (या किसी अन्य) ऐप्लिकेशन के किसी अन्य इंस्टेंस से भी बाधित हो सकती है.

फ़िलहाल, चालू सेशन को GCKCastContext.sharedInstance().sessionManager.currentCastSession से ऐक्सेस किया जा सकता है. कास्ट डायलॉग से उपयोगकर्ता के जेस्चर के जवाब में सेशन अपने-आप बन जाते हैं और बंद कर दिए जाते हैं.

मीडिया लोड हो रहा है

कास्ट SDK टूल में, GCKRemoteMediaClient सुविधाजनक एपीआई का सेट उपलब्ध कराता है. इसकी मदद से, रिसीवर पर रिमोट मीडिया प्लेबैक को मैनेज किया जा सकता है. मीडिया चलाने की सुविधा देने वाले GCKCastSession के लिए, SDK टूल GCKRemoteMediaClient का इंस्टेंस अपने-आप बना देगा. इसे GCKCastSession इंस्टेंस की remoteMediaClient प्रॉपर्टी के तौर पर ऐक्सेस किया जा सकता है.

हाल ही में चुने गए वीडियो को रिसीवर पर लोड करने के लिए, MediaViewController.swift में यह कोड जोड़ें:

@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
      }
    }
  }
  ...
}

अब रिमोट प्लेबैक के साथ काम करने के लिए, कास्ट सेशन लॉजिक का इस्तेमाल करने के लिए मौजूदा अलग-अलग तरीकों को अपडेट करें:

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
}

अब, अपने मोबाइल डिवाइस पर ऐप्लिकेशन चलाएं. अपने कास्ट डिवाइस से कनेक्ट करें और वीडियो चलाना शुरू करें. आपको रिसीवर पर वीडियो चल रहा दिखेगा.

7. मिनी कंट्रोलर

कास्ट डिज़ाइन चेकलिस्ट के लिए यह ज़रूरी है कि जब उपयोगकर्ता मौजूदा कॉन्टेंट पेज से बाहर जाए, तब सभी कास्ट ऐप्लिकेशन मिनी कंट्रोलर दिखाएं. मिनी कंट्रोलर, मौजूदा कास्ट सेशन के लिए तुरंत ऐक्सेस और दिखने वाला रिमाइंडर देता है.

iPhone के निचले हिस्से की इमेज, जिसमें Castवीडियो ऐप्लिकेशन चल रहा है और मिनी कंट्रोलर पर फ़ोकस किया गया है

कास्ट SDK टूल में एक कंट्रोल बार, GCKUIMiniMediaControlsViewController होता है. इसे उन सीन में जोड़ा जा सकता है जिनमें आपको स्थायी कंट्रोल दिखाने हैं.

सैंपल के तौर पर उपलब्ध ऐप्लिकेशन के लिए, हम GCKUICastContainerViewController का इस्तेमाल करेंगे. यह दूसरे व्यू कंट्रोलर को रैप करता है और सबसे नीचे GCKUIMiniMediaControlsViewController जोड़ता है.

AppDelegate.swift फ़ाइल में बदलाव करें और if useCastContainerViewController शर्त के लिए, यहां दिए गए कोड को यहां बताए गए तरीके से जोड़ें:

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()
  ...
}

मिनी कंट्रोलर के दिखने को कंट्रोल करने के लिए, इस प्रॉपर्टी और सेटर/गेटर को जोड़ें. हम बाद के सेक्शन में इनका इस्तेमाल करेंगे:

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
      }
    }
  }

ऐप्लिकेशन चलाएं और वीडियो कास्ट करें. रिसीवर पर वीडियो चलाने के बाद, आपको हर सीन के नीचे मिनी कंट्रोलर दिखेगा. मिनी कंट्रोलर का इस्तेमाल करके, रिमोट प्लेबैक को कंट्रोल किया जा सकता है. अगर ब्राउज़ करने की गतिविधि और लोकल प्लेयर की गतिविधि के बीच नेविगेट किया जाता है, तो मिनी कंट्रोलर की स्थिति, रिसीवर की मीडिया प्लेबैक स्थिति के साथ सिंक रहेगी.

8. शुरुआती ओवरले

Google Cast की डिज़ाइन चेकलिस्ट के लिए ज़रूरी है कि भेजने वाले ऐप्लिकेशन के ज़रिए मौजूदा उपयोगकर्ताओं को कास्ट बटन पेश किया जाए. इससे उन्हें पता चलेगा कि भेजने वाले ऐप्लिकेशन पर अब कास्ट करने की सुविधा उपलब्ध है और यह Google Cast के नए उपयोगकर्ताओं को भी मदद करता है.

iPhone की इमेज, जिसमें कास्ट करें बटन ओवरले के साथ Castवीडियो ऐप्लिकेशन चल रहा है. इस इमेज में, कास्ट बटन को हाइलाइट किया गया है और 'मीडिया को अपने टीवी और स्पीकर पर कास्ट करने के लिए छुएं' मैसेज दिखाया गया है

GCKCastContext क्लास में presentCastInstructionsViewControllerOnce तरीका है. इसका इस्तेमाल, उपयोगकर्ताओं को पहली बार कास्ट बटन दिखाए जाने पर उसे हाइलाइट करने के लिए किया जा सकता है. MediaViewController.swift और MediaTableViewController.swift में यह कोड जोड़ें:

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)
  }
}

अपने मोबाइल डिवाइस पर ऐप्लिकेशन चलाएं और आपको शुरुआती ओवरले दिखेगा.

9. बड़ा किया गया कंट्रोलर

Google Cast की डिज़ाइन चेकलिस्ट के लिए ज़रूरी है कि सेंडर ऐप्लिकेशन, कास्ट किए जा रहे मीडिया के लिए बड़ा किया गया कंट्रोलर उपलब्ध कराए. बड़ा किया गया कंट्रोलर, मिनी कंट्रोलर का फ़ुल स्क्रीन वर्शन होता है.

iPhone की इमेज, जिसमें Castवीडियो ऐप्लिकेशन चल रहा है और इसमें वीडियो चल रहा है और सबसे नीचे, बड़ा किया हुआ कंट्रोलर दिख रहा है

बड़ा किया गया कंट्रोलर फ़ुल स्क्रीन व्यू है, जो रिमोट मीडिया प्लेबैक का पूरा कंट्रोल देता है. इस व्यू की मदद से, कास्ट करने वाले ऐप्लिकेशन को कास्ट सेशन के हर पहलू को मैनेज करने की अनुमति मिलती है. हालांकि, इसमें रिसीवर की आवाज़ को कंट्रोल करने और सेशन की लाइफ़साइकल (कास्ट करना बंद करें) को छोड़कर, अन्य एलिमेंट को मैनेज किया जा सकता है. यह मीडिया सेशन की स्थिति की पूरी जानकारी भी देता है. जैसे, आर्टवर्क, टाइटल, सबटाइटल वगैरह.

यह व्यू, GCKUIExpandedMediaControlsViewController क्लास से लागू होता है.

सबसे पहले आपको कास्ट के कॉन्टेक्स्ट में, डिफ़ॉल्ट एक्सपैंडेड कंट्रोलर को चालू करना होगा. डिफ़ॉल्ट विस्तृत नियंत्रक को चालू करने के लिए AppDelegate.swift को बदलें:

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
    ...
  }
  ...
}

उपयोगकर्ता के वीडियो कास्ट करना शुरू करने पर, बड़ा किए गए कंट्रोलर को लोड करने के लिए, MediaViewController.swift में यह कोड जोड़ें:

@objc func playSelectedItemRemotely() {
  ...
  appDelegate?.isCastControlBarsEnabled = false
  GCKCastContext.sharedInstance().presentDefaultExpandedMediaControls()
}

उपयोगकर्ता के मिनी कंट्रोलर पर टैप करने पर, बड़ा किया गया कंट्रोलर भी अपने-आप लॉन्च हो जाएगा.

ऐप्लिकेशन चलाएं और वीडियो कास्ट करें. आपको बड़ा किया गया कंट्रोलर दिखेगा. वीडियो की सूची पर वापस जाएं. मिनी कंट्रोलर पर क्लिक करने पर, बड़ा किया गया कंट्रोलर फिर से लोड हो जाएगा.

10. Cast Connect की सुविधा जोड़ें

Cast Connect लाइब्रेरी की मदद से, भेजने वाले मौजूदा ऐप्लिकेशन को Cast प्रोटोकॉल की मदद से, Android TV ऐप्लिकेशन से संपर्क करने की अनुमति मिलती है. Cast Connect को कास्ट करना, कास्ट करने के इन्फ़्रास्ट्रक्चर के साथ बेहतर तरीके से काम करता है. इसमें, आपका Android TV ऐप्लिकेशन, रिसीवर की तरह काम करता है.

डिपेंडेंसी

अपने Podfile में, पक्का करें कि google-cast-sdk को 4.4.8 या इससे ऊपर के बारे में बताया गया हो, जैसा कि यहां बताया गया है. अगर आपने फ़ाइल में कोई बदलाव किया है, तो अपने प्रोजेक्ट से उस बदलाव को सिंक करने के लिए, कंसोल से pod update चलाएं.

pod 'google-cast-sdk', '>=4.4.8'

GCKLaunchOptions

Android TV ऐप्लिकेशन लॉन्च करने के लिए, हमें GCKLaunchOptions ऑब्जेक्ट में androidReceiverCompatible फ़्लैग को सही पर सेट करना होगा. इसे Android रिसीवर भी कहा जाता है. यह GCKLaunchOptions ऑब्जेक्ट यह बताता है कि रिसीवर को कैसे लॉन्च किया गया है और उसे GCKCastOptions को कैसे पास किया जाता है. ये कोड, शेयर किए गए इंस्टेंस में GCKCastContext.setSharedInstanceWith का इस्तेमाल करके सेट किए जाते हैं.

अपने AppDelegate.swift में ये लाइनें जोड़ें:

let options = GCKCastOptions(discoveryCriteria:
                          GCKDiscoveryCriteria(applicationID: kReceiverAppID))
...
/** Following code enables CastConnect */
let launchOptions = GCKLaunchOptions()
launchOptions.androidReceiverCompatible = true
options.launchOptions = launchOptions

GCKCastContext.setSharedInstanceWith(options)

लॉन्च क्रेडेंशियल सेट करें

भेजने वाले की तरफ़, GCKCredentialsData से यह जानकारी दी जा सकती है कि सेशन में कौन शामिल हो रहा है. credentials एक ऐसी स्ट्रिंग है जिसे उपयोगकर्ता तब तक तय कर सकता है, जब तक आपका ATV ऐप्लिकेशन इसे समझ सकता है. GCKCredentialsData, सिर्फ़ आपके Android TV ऐप्लिकेशन में लॉन्च होने या शामिल होने के समय भेजा जाता है. अगर कनेक्ट होने के दौरान उसे फिर से सेट किया जाता है, तो यह आपके Android TV ऐप्लिकेशन में नहीं जाएगा.

लॉन्च क्रेडेंशियल सेट करने के लिए, GCKLaunchOptions सेट होने के बाद GCKCredentialsData को कभी भी तय करना ज़रूरी है. इसे दिखाने के लिए, सेशन शुरू होने के दौरान क्रेडेंशियल को पास करने के लिए, क्रेड बटन के लिए लॉजिक जोड़ें. अपने MediaTableViewController.swift में यह कोड जोड़ें:

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))
  }
}

डेटा लोड करने के अनुरोध पर क्रेडेंशियल सेट करें

अपने वेब और Android TV रिसीवर, दोनों ऐप्लिकेशन पर credentials का इस्तेमाल करने के लिए, अपनी MediaTableViewController.swift क्लास में loadSelectedItem फ़ंक्शन के तहत यह कोड जोड़ें:

let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder()
...
mediaLoadRequestDataBuilder.credentials = credentials
...

फ़ाइल भेजने वाला व्यक्ति जिस ऐप्लिकेशन पर फ़ाइलें कास्ट कर रहा है उसके हिसाब से, SDK टूल ऊपर दिए गए क्रेडेंशियल को मौजूदा सेशन में अपने-आप लागू कर देगा.

Cast Connect को टेस्ट किया जा रहा है

Chromecast with Google TV पर Android TV APK इंस्टॉल करने का तरीका

  1. अपने Android TV डिवाइस का आईपी पता ढूंढें. आम तौर पर, यह सेटिंग > नेटवर्क और इंटरनेट > (उस नेटवर्क का नाम जिससे आपका डिवाइस कनेक्ट है) में उपलब्ध होता है. दाईं ओर, यह जानकारी और नेटवर्क पर आपके डिवाइस का आईपी दिखाएगा.
  2. टर्मिनल का इस्तेमाल करके अपने डिवाइस को ADB से कनेक्ट करने के लिए, आईपी पते का इस्तेमाल करें:
$ adb connect <device_ip_address>:5555
  1. अपनी टर्मिनल विंडो से, कोडलैब के उन नमूनों के लिए टॉप लेवल फ़ोल्डर पर जाएं जिन्हें आपने इस कोडलैब की शुरुआत में डाउनलोड किया था. उदाहरण के लिए:
$ cd Desktop/ios_codelab_src
  1. इस फ़ोल्डर में मौजूद .apk फ़ाइल को अपने Android TV पर इंस्टॉल करने के लिए यह तरीका अपनाएं:
$ adb -s <device_ip_address>:5555 install android-tv-app.apk
  1. Android TV डिवाइस पर, आपके ऐप्लिकेशन मेन्यू में जाकर, कास्ट वीडियो के नाम से एक ऐप्लिकेशन देखा जा सकता है.
  2. इसके बाद, ऐप्लिकेशन को एम्युलेटर या मोबाइल डिवाइस पर बनाएं और चलाएं. आपके Android TV डिवाइस के साथ कास्ट सेशन शुरू करने के बाद, अब आपके Android TV पर Android रिसीवर ऐप्लिकेशन लॉन्च हो जाएगा. iOS मोबाइल डिवाइस से वीडियो चलाने पर, Android रिसीवर में वीडियो लॉन्च हो जाना चाहिए. साथ ही, इससे Android TV डिवाइस के रिमोट से वीडियो को कंट्रोल करने में भी मदद मिलती है.

11. कास्ट विजेट को पसंद के मुताबिक बनाएं

डेटा लेयर में इवेंट बनाने की प्रोसेस

ऐप्लिकेशन-हो गया फ़ोल्डर से शुरू करें. अपनी AppDelegate.swift फ़ाइल में applicationDidFinishLaunchingWithOptions तरीके में ये जोड़ें.

func application(_: UIApplication,
                 didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  ...
  let styler = GCKUIStyle.sharedInstance()
  ...
}

कोडलैब के इस मॉड्यूल के बाकी हिस्से में बताए गए तरीके से एक या उससे ज़्यादा कस्टमाइज़ेशन लागू करने के बाद, नीचे दिए गए कोड को कॉल करके स्टाइल तय करें

styler.apply()

कास्ट व्यू को पसंद के मुताबिक बनाना

कास्ट ऐप्लिकेशन फ़्रेमवर्क जिन व्यू को मैनेज करता है उन सभी को पसंद के मुताबिक बनाया जा सकता है. ऐसा करने के लिए, आपको सभी व्यू के लिए, स्टाइलिंग के डिफ़ॉल्ट दिशा-निर्देश लागू करने होंगे. उदाहरण के लिए, चलिए आइकॉन की रंगत को बदलते हैं.

styler.castViews.iconTintColor = .lightGray

ज़रूरत पड़ने पर, हर स्क्रीन के हिसाब से डिफ़ॉल्ट सेटिंग को बदला जा सकता है. उदाहरण के लिए, सिर्फ़ बड़े किए गए मीडिया कंट्रोलर के आइकॉन के रंग के लिए LightGrayColor बदलने के लिए.

styler.castViews.mediaControl.expandedController.iconTintColor = .green

रंग बदलना

सभी व्यू के लिए या हर व्यू के लिए अलग-अलग बैकग्राउंड का रंग बदला जा सकता है. नीचे दिया गया कोड, आपके सभी कास्ट ऐप्लिकेशन फ़्रेमवर्क के व्यू के लिए, बैकग्राउंड का रंग नीला पर सेट कर देता है.

styler.castViews.backgroundColor = .blue
styler.castViews.mediaControl.miniController.backgroundColor = .yellow

फ़ॉन्ट बदलना

कास्ट व्यू में दिखने वाले अलग-अलग लेबल के लिए, फ़ॉन्ट को पसंद के मुताबिक बनाया जा सकता है. इलस्ट्रेशन के लिए सभी फ़ॉन्ट को ‘Courier-Oblique' पर सेट करें.

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)

डिफ़ॉल्ट बटन इमेज बदलना

प्रोजेक्ट में अपनी कस्टम इमेज जोड़ें और उन्हें स्टाइल देने के लिए, बटन से इमेज असाइन करें.

let muteOnImage = UIImage.init(named: "yourImage.png")
if let muteOnImage = muteOnImage {
  styler.castViews.muteOnImage = muteOnImage
}

'कास्ट बटन' की थीम बदलना

आप यूज़र इंटरफ़ेस (यूआई) प्रोटोकॉल का इस्तेमाल करके, कास्ट विजेट को थीम के तौर पर भी सेट कर सकते हैं. यह कोड उसके दिखने वाले सभी व्यू पर GCKUICast Button को थीम करता है:

GCKUICastButton.appearance().tintColor = UIColor.gray

12. बधाई हो

अब आपको iOS पर Cast SDK विजेट का इस्तेमाल करके, किसी वीडियो ऐप्लिकेशन को कास्ट करने का तरीका पता चल गया है.

ज़्यादा जानकारी के लिए, iOS से भेजने वाले की डेवलपर गाइड देखें.