इस डेवलपर गाइड में अपने 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
.