Cast को अपने iOS ऐप्लिकेशन में इंटिग्रेट करें

इस डेवलपर गाइड में अपने iOS में Google Cast सहायता जोड़ने का तरीका बताया गया है iOS सेंडर SDK टूल का इस्तेमाल करने वाला मैसेज भेजने के लिए इस्तेमाल किया जाने वाला ऐप्लिकेशन.

मोबाइल डिवाइस या लैपटॉप भेजने वाले का नाम है, जो वीडियो को कंट्रोल करता है और Google Cast डिवाइस रिसीवर है जो टीवी पर कॉन्टेंट दिखाता है.

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

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

ऐप्लिकेशन फ़्लो

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

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

मैसेज भेजने वाले लोगों की समस्या हल करने के लिए, आपको लॉग इन करने की सुविधा चालू करनी होगी.

Google Cast में सभी क्लास, तरीकों, और इवेंट की पूरी सूची देखने के लिए iOS फ़्रेमवर्क, Google Cast iOS API देखें रेफ़रंस. इन सेक्शन में, का इस्तेमाल करें.

मुख्य थ्रेड से कॉल करने के तरीके

कास्ट कॉन्टेक्स्ट शुरू करें

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

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

-[application:didFinishLaunchingWithOptions:] तरीका भी एक अच्छी जगह है का इस्तेमाल करें. इनका इस्तेमाल डीबग करने और समस्या हल करने में किया जा सकता है.

स्विफ़्ट
@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)
    }
  }
}
मकसद-सी

AppDelegate.h

@interface AppDelegate () <GCKLoggerDelegate>
@end

AppDelegate.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 विजेट

Cast iOS SDK टूल आपको ऐसे विजेट उपलब्ध कराता है, जो Cast डिज़ाइन का अनुपालन करते हैं चेकलिस्ट:

  • शुरुआती ओवरले: GCKCastContext क्लास का एक तरीका है, presentCastInstructionsViewControllerOnceWithCastButton इसका इस्तेमाल वेब रिसीवर को पहली बार कास्ट करने वाले बटन को स्पॉटलाइट करने के लिए किया जा सकता है उपलब्ध है. भेजने वाले का ऐप्लिकेशन, किताब के नाम और उसके टाइटल की जगह को अपनी पसंद के मुताबिक बना सकता है टेक्स्ट और 'खारिज करें' बटन का इस्तेमाल करें.

  • कास्ट करें बटन: कास्ट करने की सुविधा देने वाले iOS डिवाइस के SDK टूल 4.6.0 और इसके बाद के वर्शन में, 'कास्ट करें' बटन हमेशा दिखता है जब भेजने वाले का डिवाइस वाई-फ़ाई से कनेक्ट होता है. उपयोगकर्ता के पहली बार टैप करने पर ऐप्लिकेशन शुरू करने के बाद, 'कास्ट करें' बटन पर, अनुमतियों वाला डायलॉग बॉक्स तो उपयोगकर्ता, ऐप्लिकेशन को लोकल नेटवर्क का ऐक्सेस दे सकता है: नेटवर्क. इसके बाद, जब उपयोगकर्ता 'कास्ट करें' बटन पर टैप करता है, तो डायलॉग बॉक्स में, खोजे गए डिवाइसों की सूची दिखती है. जब उपयोगकर्ता टैप करता है जब डिवाइस कनेक्ट हो, तब कास्ट करें बटन पर, यह मीडिया का मेटाडेटा, जैसे कि टाइटल, रिकॉर्डिंग स्टूडियो का नाम, और थंबनेल इमेज) या उपयोगकर्ता को कास्ट डिवाइस से डिसकनेक्ट करने की अनुमति देती है. जब उपयोगकर्ता जब कोई डिवाइस उपलब्ध न हो, तब 'कास्ट करें' बटन पर टैप करता हो. उपयोगकर्ता को यह जानकारी देते हुए दिखाया जाएगा कि डिवाइस क्यों नहीं मिल रहे साथ ही, समस्या को हल करने का तरीका भी जानें.

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

  • एक्सपैंडेड कंट्रोलर: जब उपयोगकर्ता कॉन्टेंट कास्ट कर रहा हो, तो उसे मीडिया सूचना पर क्लिक करना होगा या मिनी कंट्रोलर, एक्सपैंडेड कंट्रोलर लॉन्च होता है. यह कंट्रोलर, इस समय मीडिया मेटाडेटा चलाया जा रहा है और इसमें मीडिया को कंट्रोल करने के लिए कई बटन मौजूद हैं मीडिया प्लेबैक.

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

यह फ़्रेमवर्क, UIButton सब-क्लास के तौर पर कास्ट बटन कॉम्पोनेंट देता है. यह काम कर सकता है ऐप्लिकेशन के टाइटल बार में जोड़ने के लिए, इसे UIBarButtonItem में रैप करें. सामान्य UIViewController सब-क्लास, कास्ट बटन को इस तरह इंस्टॉल कर सकती है:

स्विफ़्ट
let castButton = GCKUICastButton(frame: CGRect(x: 0, y: 0, width: 24, height: 24))
castButton.tintColor = UIColor.gray
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: castButton)
मकसद-सी
GCKUICastButton *castButton = [[GCKUICastButton alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
castButton.tintColor = [UIColor grayColor];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:castButton];

डिफ़ॉल्ट रूप से, बटन को टैप करने से कास्ट करें संवाद खुल जाएगा फ़्रेमवर्क शामिल है.

GCKUICastButton स्टोरीबोर्ड में सीधे भी जोड़ा जा सकता है.

डिवाइस खोज कॉन्फ़िगर करें

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

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

सेशन मैनेजमेंट के काम करने का तरीका

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

सेशन को क्लास मैनेज करती है GCKSessionManager जो GCKCastContext. अलग-अलग सेशन को क्लास के सब-क्लास के तौर पर दिखाया जाता है GCKSession: उदाहरण के लिए, GCKCastSession कास्ट डिवाइसों वाले सेशन के बारे में बताता है. आपके पास फ़िलहाल ऐक्टिव कास्ट को ऐक्सेस करने का विकल्प है सेशन (अगर कोई है), GCKSessionManager की currentCastSession प्रॉपर्टी के तौर पर.

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

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

अगर सेशन की लाइफ़साइकल के जवाब में, ऐप्लिकेशन को खास तरह की प्रोसेसिंग की ज़रूरत है इवेंट है, तो यह इनके साथ एक या एक से ज़्यादा GCKSessionManagerListener इंस्टेंस रजिस्टर कर सकता है GCKSessionManager. GCKSessionManagerListener एक प्रोटोकॉल है, जो सेशन शुरू होने, सेशन खत्म होने वगैरह जैसे इवेंट के लिए कॉलबैक.

स्ट्रीम को ट्रांसफ़र करें

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

स्ट्रीमिंग के दौरान नया डेस्टिनेशन डिवाइस पाने के लिए, GCKCastSession#device प्रॉपर्टी [sessionManager:didResumeCastSession:] कॉलबैक.

यहां जाएं: वेब रिसीवर पर स्ट्रीम ट्रांसफ़र करना हमारा वीडियो देखें.

अपने-आप फिर से कनेक्ट होने की सुविधा

कास्ट फ़्रेमवर्क, फिर से कनेक्ट करने का लॉजिक जोड़ता है, ताकि फिर से कनेक्ट होने की प्रोसेस अपने-आप मैनेज हो सके कई बेहद ज़रूरी मामलों में हो सकते हैं, जैसे:

  • कुछ समय के लिए वाई-फ़ाई बंद हो जाने के बाद, डेटा वापस पाएं
  • डिवाइस की स्लीप मोड से रिकवर करें
  • ऐप्लिकेशन के बैकग्राउंड में बदलाव करके उसे वापस पाएं
  • ऐप्लिकेशन क्रैश होने पर रिकवर करना

मीडिया कंट्रोल के काम करने का तरीका

अगर कास्ट सेशन ऐसे वेब रिसीवर ऐप्लिकेशन के साथ शुरू किया गया है जो मीडिया के साथ काम करता है नेमस्पेस, GCKRemoteMediaClient फ़्रेमवर्क अपने-आप बन जाएगा; तो इसे remoteMediaClient प्रॉपर्टी GCKCastSession इंस्टेंस.

GCKRemoteMediaClient पर मौजूद वे सभी तरीके जो वेब पाने वाले को अनुरोध भेजते हैं वापस करेगा GCKRequest ऑब्जेक्ट जो का इस्तेमाल उस अनुरोध को ट्रैक करने के लिए किया जा सकता है. ऐप्लिकेशन GCKRequestDelegate को इस ऑब्जेक्ट को असाइन किया जा सकता है, ताकि आपको इस बारे में सूचनाएं मिल सकें कार्रवाई का नतीजा है.

उम्मीद है कि GCKRemoteMediaClient ऐप्लिकेशन के कई हिस्सों में शेयर किया जा सकता हो. साथ ही, कुछ इंटरनल कॉम्पोनेंट भी शेयर किए जा सकते हों कास्ट डायलॉग और मिनी मीडिया कंट्रोल जैसे फ़्रेमवर्क एक-दूसरे से इंस्टेंस. इसके लिए, GCKRemoteMediaClient एक से ज़्यादा डोमेन के रजिस्ट्रेशन का इस्तेमाल करता है GCKRemoteMediaClientListener.

मीडिया मेटाडेटा सेट करें

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

स्विफ़्ट
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))
मकसद-सी
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]];

चित्र चयन और कैश मेमोरी में सेव करना सेक्शन में, मीडिया मेटाडेटा वाली इमेज के इस्तेमाल के बारे में बताया गया है.

मीडिया लोड करें

मीडिया आइटम लोड करने के लिए, बनाएं GCKMediaInformation मीडिया के मेटाडेटा का इस्तेमाल करके इंस्टेंस बनाएँ. फिर वर्तमान GCKCastSession और इसका इस्तेमाल करो GCKRemoteMediaClient पाने वाले ऐप्लिकेशन पर मीडिया लोड करने के लिए. इसके बाद, GCKRemoteMediaClient का इस्तेमाल किया जा सकता है रिसीवर पर चल रहे मीडिया प्लेयर ऐप्लिकेशन को कंट्रोल करने के लिए, जैसे कि प्ले के लिए, रोकें, और बंद करें.

स्विफ़्ट
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
}
मकसद-सी
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;
}

इस पर भी सेक्शन देखें मीडिया ट्रैक इस्तेमाल करके.

4K वीडियो फ़ॉर्मैट

यह पता लगाने के लिए कि आपका मीडिया किस वीडियो फ़ॉर्मैट का है, इसकी videoInfo प्रॉपर्टी का इस्तेमाल करें GCKMediaStatus CANNOT TRANSLATE GCKVideoInfo. इस इंस्टेंस में एचडीआर टीवी के फ़ॉर्मैट का टाइप और उसकी ऊंचाई और चौड़ाई की जानकारी शामिल है पिक्सल. 4K फ़ॉर्मैट वाले वैरिएंट, hdrType प्रॉपर्टी में एनम के हिसाब से दिखाए जाते हैं वैल्यू GCKVideoInfoHDRType.

मिनी कंट्रोलर जोड़ें

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

कास्ट फ़्रेमवर्क एक कंट्रोल बार उपलब्ध कराता है. GCKUIMiniMediaControlsViewController जिसे उन सीन में जोड़ा जा सकता है जिनमें आपको मिनी कंट्रोलर दिखाना है.

जब आपका भेजने वाला ऐप्लिकेशन कोई वीडियो या ऑडियो लाइव स्ट्रीम चला रहा होता है, तो SDK टूल इसके बाद, 'चलाएं/रोकें' बटन के बजाय, अपने-आप एक 'चलाएं/बंद करें' बटन दिखाता है ट्रैक करने में मदद मिलती है.

iOS सेंडर यूज़र इंटरफ़ेस (यूआई) को पसंद के मुताबिक बनाना देखें. भेजने वाला ऐप्लिकेशन, कास्ट विजेट के लुक को कॉन्फ़िगर कर सकता है.

भेजने वाले ऐप्लिकेशन में मिनी कंट्रोलर जोड़ने के दो तरीके हैं:

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

GCKUICastContainerViewController का इस्तेमाल करके रैप करें

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

यह पहला तरीका आम तौर पर ऐप्लिकेशन डेलिगेट का -[application:didFinishLaunchingWithOptions:] तरीका:

स्विफ़्ट
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()

  ...
}
मकसद-सी
- (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];
  ...

}
स्विफ़्ट
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
    }
  }
}
मकसद-सी

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>

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

@end

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

मौजूदा व्यू कंट्रोलर में एम्बेड करें

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

ऐप्लिकेशन डेलिगेट में अपना व्यू कंट्रोलर सेट अप करें:

स्विफ़्ट
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
}
मकसद-सी
- (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;
}

अपने रूट व्यू कंट्रोलर में, GCKUIMiniMediaControlsViewController बनाएं इंस्टेंस और इसे कंटेनर व्यू कंट्रोलर में सबव्यू के तौर पर जोड़ें:

स्विफ़्ट
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)
    }
  }

...
मकसद-सी

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

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

कॉन्टेंट बनाने GCKUIMiniMediaControlsViewControllerDelegate यह होस्ट व्यू कंट्रोलर को बताता है कि मिनी कंट्रोलर कब दिखना चाहिए:

स्विफ़्ट
  func miniMediaControlsViewController(_: GCKUIMiniMediaControlsViewController,
                                       shouldAppear _: Bool) {
    updateControlBarsVisibility()
  }
मकसद-सी
- (void)miniMediaControlsViewController:
            (GCKUIMiniMediaControlsViewController *)miniMediaControlsViewController
                           shouldAppear:(BOOL)shouldAppear {
  [self updateControlBarsVisibility];
}

बड़ा किया गया कंट्रोलर जोड़ें

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

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

इस व्यू की काम की क्षमता को GCKUIExpandedMediaControlsViewController क्लास.

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

स्विफ़्ट
func applicationDidFinishLaunching(_ application: UIApplication) {
  ..

  GCKCastContext.sharedInstance().useDefaultExpandedMediaControls = true

  ...
}
मकसद-सी
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  [GCKCastContext sharedInstance].useDefaultExpandedMediaControls = YES;

  ..
}

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

स्विफ़्ट
func playSelectedItemRemotely() {
  GCKCastContext.sharedInstance().presentDefaultExpandedMediaControls()

  ...

  // Load your media
  sessionManager.currentSession?.remoteMediaClient?.loadMedia(mediaInformation)
}
मकसद-सी
- (void)playSelectedItemRemotely {
  [[GCKCastContext sharedInstance] presentDefaultExpandedMediaControls];

  ...

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

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

जब आपका भेजने वाला ऐप्लिकेशन कोई वीडियो या ऑडियो लाइव स्ट्रीम चला रहा होता है, तो SDK टूल इसके बाद, 'चलाएं/रोकें' बटन के बजाय, अपने-आप एक 'चलाएं/बंद करें' बटन दिखाता है का विकल्प भी चुना जा सकता है.

iOS में कस्टम स्टाइल लागू करना ऐप्लिकेशन आपका भेजने वाला ऐप्लिकेशन, कास्ट विजेट के लुक को कैसे कॉन्फ़िगर कर सकता है.

आवाज़ कंट्रोल करें

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

फ़िज़िकल बटन की आवाज़ को कम या ज़्यादा करने का बटन

भेजने वाले के डिवाइस पर मौजूद फ़िज़िकल आवाज़ बटन का इस्तेमाल, का उपयोग करके वेब प्राप्तकर्ता पर कास्ट सत्र का वॉल्यूम physicalVolumeButtonsWillControlDeviceVolume फ़्लैग GCKCastOptions, जो कि GCKCastContext.

स्विफ़्ट
let criteria = GCKDiscoveryCriteria(applicationID: kReceiverAppID)
let options = GCKCastOptions(discoveryCriteria: criteria)
options.physicalVolumeButtonsWillControlDeviceVolume = true
GCKCastContext.setSharedInstanceWith(options)
मकसद-सी
GCKDiscoveryCriteria *criteria = [[GCKDiscoveryCriteria alloc]
                                          initWithApplicationID:kReceiverAppID];
GCKCastOptions *options = [[GCKCastOptions alloc]
                                          initWithDiscoveryCriteria :criteria];
options.physicalVolumeButtonsWillControlDeviceVolume = YES;
[GCKCastContext setSharedInstanceWithOptions:options];

गड़बड़ियां ठीक करना

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

लॉग इन हो रहा है

GCKLogger सिंगलटन (सिंगलटन) है. इसका इस्तेमाल फ़्रेमवर्क में लॉग करने के लिए किया जाता है. इसका इस्तेमाल करें GCKLoggerDelegate का इस्तेमाल करें.

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

स्विफ़्ट
@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)
    }
  }
}
मकसद-सी

AppDelegate.h

@interface AppDelegate () <GCKLoggerDelegate>
@end

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

डीबग और ज़्यादा शब्दों वाले मैसेज को चालू करने के लिए, इस लाइन को इसके बाद कोड में जोड़ें डेलिगेट सेट करना (पहले दिखाया गया है):

स्विफ़्ट
let filter = GCKLoggerFilter.init()
filter.minimumLevel = GCKLoggerLevel.verbose
GCKLogger.sharedInstance().filter = filter
मकसद-सी
GCKLoggerFilter *filter = [[GCKLoggerFilter alloc] init];
[filter setMinimumLevel:GCKLoggerLevelVerbose];
[GCKLogger sharedInstance].filter = filter;

लॉग मैसेज को फ़िल्टर भी किया जा सकता है, GCKLogger. हर क्लास के लिए लॉग इन करने का कम से कम लेवल सेट करें, उदाहरण के लिए:

स्विफ़्ट
let filter = GCKLoggerFilter.init()
filter.setLoggingLevel(GCKLoggerLevel.verbose, forClasses: ["GCKUICastButton",
                                                            "GCKUIImageCache",
                                                            "NSMutableDictionary"])
GCKLogger.sharedInstance().filter = filter
मकसद-सी
GCKLoggerFilter *filter = [[GCKLoggerFilter alloc] init];
[filter setLoggingLevel:GCKLoggerLevelVerbose
             forClasses:@[@"GCKUICastButton",
                          @"GCKUIImageCache",
                          @"NSMutableDictionary"
                          ]];
[GCKLogger sharedInstance].filter = filter;

क्लास के नाम, लिटरल नाम या ग्लोब पैटर्न हो सकते हैं. उदाहरण के लिए, GCKUI\* और GCK\*Session.