SDK रनटाइम की मदद से, विज्ञापन दिखाने वाले SDK टूल को सैंडबॉक्स किए गए एनवायरमेंट में चलाया जा सकता है. इससे, उन्हें पब्लिशर की व्यू हैरारकी को ऐक्सेस करने से रोका जा सकता है. विज्ञापन दिखाने के लिए, प्लैटफ़ॉर्म एसडीके को SandboxedSdkProvider.getView एपीआई का ऐक्सेस देता है, ताकि विज्ञापन व्यू मिल सके. इसके बाद, इसे SurfacePackage के तौर पर पैकेज किया जाता है, ताकि इसे आईपीसी (इंटर-प्रोसेस कम्यूनिकेशन) के ज़रिए क्लाइंट ऐप्लिकेशन को भेजा जा सके. इसमें कई कमियां हैं, जिनके बारे में यहां बताया गया है. इसके बाद, इस दस्तावेज़ में Jetpack लाइब्रेरी का सुझाव दिया जाएगा. इसे इन चुनौतियों को हल करने के लिए बनाया जा रहा है.
प्लैटफ़ॉर्म एपीआई को बेहतर बनाने की वजह
फ़्रेमवर्क एपीआई को इस तरह से डिज़ाइन किया गया है कि वे अलग-अलग स्थितियों में काम कर सकें. साथ ही, यूज़र इंटरफ़ेस (यूआई) प्रज़ेंटेशन के लिए साइड चैनल बनाने का काम, ऐप्लिकेशन और एसडीके पर छोड़ देते हैं. यह साइड चैनल, ये काम करता है:
- इस कुकी की मदद से, एसडीके अपने लाइफ़टाइम के दौरान कई विज्ञापन व्यू मैनेज कर सकता है. साथ ही, यह समझ सकता है कि एसडीके के बनाए जाने के बाद, विज्ञापन यूज़र इंटरफ़ेस (यूआई) का क्या होता है.
- इससे व्यू बनाने और कॉन्टेंट बाइंड करने की प्रोसेस अलग हो जाती है. साइड चैनल का इस्तेमाल करने से, एसडीके ऐप्लिकेशन (कॉन्टेंट) को विज्ञापन अनुरोध से जुड़ा ऑब्जेक्ट वापस भेज पाता है. इसे विज्ञापन कंटेनर से तब जोड़ा जा सकता है, जब ऐप्लिकेशन को यह सही लगे.
- यह कुकी, प्लैटफ़ॉर्म के उन कंस्ट्रक्ट को ऐब्स्ट्रैक्ट करती है जिनका इस्तेमाल अलग-अलग प्रोसेस में यूज़र इंटरफ़ेस (यूआई) दिखाने के लिए किया जाता है. (फ़िलहाल, प्लैटफ़ॉर्म
SurfaceControlViewhostका इस्तेमाल करता है और इससेSurfacePackageजनरेट करता है.) - इस कुकी की मदद से, SDK Runtime में मौजूद विज्ञापन SDK टूल को सूचनाएं अपने-आप मिलती हैं. ये सूचनाएं तब मिलती हैं, जब विज्ञापन कंटेनर के यूज़र इंटरफ़ेस (यूआई) में बदलाव होता है. अगर पब्लिशर, विज्ञापन कंटेनर के लेआउट में बदलाव करता है, तो एसडीके को इन बदलावों के बारे में तब तक पता नहीं चलता, जब तक पब्लिशर एसडीके को सूचना देने के लिए किसी एपीआई को साफ़ तौर पर कॉल नहीं करता.
- यह कुकी, विज्ञापन के यूज़र इंटरफ़ेस (यूआई) और विज्ञापन कंटेनर के साइज़ में बदलावों को सिंक करती है. इससे उपयोगकर्ता को कोई जंक नहीं दिखता.
- यह पुराने सिस्टम के साथ काम करने की सुविधा को अपने-आप मैनेज करता है.
SurfacePackageएपीआई लेवल 30 से पहले उपलब्ध नहीं है. इसके अलावा, जिन डिवाइसों पर SDK टूल का रनटाइम नहीं होता है और SDK टूल, पब्लिशर के लिए प्रोसेस-लोकल होता है उन पर विज्ञापन के लिएSurfacePackageबनाना फ़ायदेमंद नहीं होता. ऐसा इसलिए, क्योंकि व्यू को सीधे SDK टूल से हासिल किया जा सकता है. साइड चैनल, इस जटिलता को SDK टूल और ऐप्लिकेशन डेवलपर कोड से अलग करता है. - इसकी मदद से, विज्ञापन के यूज़र इंटरफ़ेस (यूआई) को कंपोज़ेबल के साथ आसानी से इंटिग्रेट किया जा सकता है. Jetpack Compose डेवलपर, व्यू के साथ काम नहीं करते हैं. वे अब भी ऐसे एसडीके डेवलपर की ओर से जनरेट किए गए यूज़र इंटरफ़ेस (यूआई) को होस्ट कर सकते हैं जो अब भी व्यू के साथ काम करता है.
यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी
यूआई लाइब्रेरी, ऊपर बताई गई मुश्किलों को कम करती हैं. साथ ही, एक साइड चैनल उपलब्ध कराती हैं. इसका इस्तेमाल पब्लिशर और एसडीके, अलग-अलग प्रोसेस में यूज़र इंटरफ़ेस (यूआई) दिखाने के लिए कर सकते हैं. साथ ही, उपयोगकर्ता के इंटरैक्ट करने और डिवाइस के साथ इंटरैक्ट करने पर, इसे अपडेट रख सकते हैं.
तीन यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी उपलब्ध हैं: core, client, और provider. कोर लाइब्रेरी, क्लाइंट और प्रोवाइडर लाइब्रेरी के लिए इस्तेमाल किए जाने वाले इंटरफ़ेस उपलब्ध कराती है. यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराने वाली कंपनी (आम तौर पर, एसडीके) सेवा देने वाली कंपनी की लाइब्रेरी पर निर्भर करती है. वहीं, यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करने वाली कंपनी (आम तौर पर, पब्लिशर) क्लाइंट लाइब्रेरी पर निर्भर करती है. क्लाइंट और प्रोवाइडर लाइब्रेरी, दोनों मिलकर एक साइड चैनल बनाती हैं. इस चैनल का इस्तेमाल, यूज़र इंटरफ़ेस (यूआई) सेशन बनाने और उसे बनाए रखने के लिए किया जाता है.
एपीआई
SDK Runtime UI प्रज़ेंटेशन के लिए एपीआई ये हैं:
SandboxedUiAdapter: इसे SDK टूल बनाता है. इससे पब्लिशर के यूज़र इंटरफ़ेस (यूआई) में दिखाने के लिए कॉन्टेंट मिलता है.
SandboxedSdkView: इसे पब्लिशर बनाता है. यह एक कंटेनर होता है, जिसमें SandboxedUiAdapter से मिला कॉन्टेंट होता है.
Session: इसे एसडीके ने SandboxedUiAdapter.openSession() के जवाब में बनाया है. यह एक यूज़र इंटरफ़ेस (यूआई) सेशन को दिखाता है. कॉल. यह SDK टूल और पब्लिशर के बीच कम्यूनिकेशन टनल का SDK टूल वाला हिस्सा बनाता है. साथ ही, SandboxedSdkView में होने वाले बदलावों के बारे में सूचनाएं पाता है. जैसे, विंडो अलग करना, उनका साइज़ बदलना या कॉन्फ़िगरेशन में बदलाव करना.
SessionClient: इसे क्लाइंट लाइब्रेरी बनाती है. यह एसडीके और पब्लिशर के बीच कम्यूनिकेशन टनल का पब्लिशर एंड बनाता है.
SandboxedSdkUiSessionStateChangedListener: इसे पब्लिशर ने बनाया है. SandboxedSdkView से जुड़े यूज़र इंटरफ़ेस (यूआई) सेशन की स्थिति में होने वाले बदलावों के लिए लिसनर.
इन एपीआई के बारे में ज़्यादा जानने के लिए, privacysandbox-ui के रेफ़रंस दस्तावेज़ पढ़ें.
कंट्रोल फ़्लो
यहां दिए गए डायग्राम में, अलग-अलग स्थितियों में क्लाइंट और सेवा देने वाली कंपनी की यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी के बीच इंटरैक्शन दिखाया गया है:
पिछले डायग्राम में दिखाया गया है कि पब्लिशर, प्रोग्राम के हिसाब से या अपने एक्सएमएल के ज़रिए SandboxedSdkView
कैसे बना सकता है. साथ ही, एसडीके से मिले SdkSandboxUiAdapter
को एसडीके से तय किए गए एपीआई के ज़रिए कैसे अटैच कर सकता है. यूज़र इंटरफ़ेस (यूआई) की सभी स्थितियों में होने वाले बदलावों को देखने के लिए, पब्लिशर को SdkSandboxUiAdapter अटैच करने से पहले SandboxedSdkView में SandboxedSdkUiSessionStateChangedListener जोड़ना चाहिए.
इस डायग्राम में दिखाया गया है कि अगर पब्लिशर की गतिविधि, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करती है, तो क्लाइंट लाइब्रेरी, कॉन्फ़िगरेशन में हुए बदलाव को एसडीके को फ़ॉरवर्ड करती है, ताकि वे अपने यूज़र इंटरफ़ेस (यूआई) को उसके मुताबिक अपडेट कर सकें. उदाहरण के लिए, जब उपयोगकर्ता डिवाइस को घुमाता है और पब्लिशर अपनी गतिविधि में कॉन्फ़िगरेशन में हुए बदलावों को हैंडल करने का एलान करता है, तब इस फ़्लो को ट्रिगर किया जा सकता है. इसके लिए, android:configChanges=["orientation"] को सेट करना होगा.
इस डायग्राम में दिखाया गया है कि SDK, SessionClient पर मौजूद तरीकों का इस्तेमाल करके, विज्ञापन कंटेनर में बदलाव करने का अनुरोध कैसे कर सकता है. इस एपीआई को तब ट्रिगर किया जाता है, जब SDK टूल को विज्ञापन का साइज़ बदलना होता है. साथ ही, उसे पब्लिशर से विज्ञापन कंटेनर का साइज़ बदलने के लिए कहना होता है, ताकि नए डाइमेंशन के हिसाब से विज्ञापन को दिखाया जा सके. ऐसा उपयोगकर्ता के इंटरैक्शन के जवाब में हो सकता है. जैसे, mraid.resize().
इस डायग्राम में दिखाया गया है कि विंडो से अलग होने पर सेशन कैसे बंद होता है.SandboxedSdkView एसडीके, SessionClient.onSessionError() को शुरू करके सेशन को किसी भी समय बंद कर सकता है. उदाहरण के लिए, जब उपयोगकर्ता की नेटवर्क कनेक्टिविटी खत्म हो जाती है.
Z ऑर्डर
क्लाइंट यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी, SDK टूल के यूज़र इंटरफ़ेस (यूआई) को होस्ट करने के लिए, SurfaceView का इस्तेमाल करती है.
SurfaceView, Z ऑर्डर का इस्तेमाल करके, पब्लिशर की विंडो के ऊपर या नीचे अपना यूज़र इंटरफ़ेस (यूआई) दिखा सकता है. इसे SandboxedSdkView.orderProviderUiAboveClientUi() तरीके से कंट्रोल किया जाता है. यह बूलियन setOnTop को स्वीकार करता है.
जब setOnTop true होता है, तब SandboxedSdkView पर मौजूद हर android.view.MotionEvent को एसडीके पर भेजा जाता है. जब false, तब इन्हें पब्लिशर को भेजा जाता है. डिफ़ॉल्ट रूप से, मोशन इवेंट SDK टूल को भेजे जाते हैं.
आम तौर पर, पब्लिशर को विज्ञापन व्यू के डिफ़ॉल्ट Z-ऑर्डर में बदलाव करने की ज़रूरत नहीं होती. हालांकि, जब विज्ञापन को कवर करने वाला यूज़र इंटरफ़ेस (यूआई) दिखाया जाता है, जैसे कि ड्रॉप-डाउन मेन्यू, तो Z-ऑर्डर को कुछ समय के लिए डिफ़ॉल्ट से बदलकर, विज्ञापन को कवर करने वाले यूज़र इंटरफ़ेस (यूआई) एलिमेंट को खारिज करने पर वापस डिफ़ॉल्ट पर सेट कर देना चाहिए. हम क्लाइंट यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी में इस प्रोसेस को ऑटोमेट करने के तरीके खोज रहे हैं.
स्क्रोल करना
जब विज्ञापन यूज़र इंटरफ़ेस (यूआई) को पब्लिशर विंडो के ऊपर Z-ऑर्डर किया जाता है, तब विज्ञापन यूज़र इंटरफ़ेस (यूआई) से MotionEvents को SDK टूल पर भेजा जाता है. विज्ञापन के यूज़र इंटरफ़ेस (यूआई) पर स्क्रोल और फ़्लिंग जेस्चर शुरू करने पर, खास तरीके से कार्रवाई की जाती है:
- ऊपर-नीचे स्क्रोल करने और फ़्लिंग करने के जेस्चर, पब्लिशर के कंटेनर को भेजे जाते हैं और वहीं से मैनेज किए जाते हैं. इससे पब्लिशर के उस कंटेनर में बेहतर यूज़र एक्सपीरियंस मिलता है जिसमें विज्ञापन का यूज़र इंटरफ़ेस (यूआई) रखा गया है. साथ ही, यह कंटेनर वर्टिकल तौर पर स्क्रोल किया जा सकता है. इसके लिए, SDK टूल या पब्लिशर को कुछ और करने की ज़रूरत नहीं होती.
- हॉरिज़ॉन्टल स्क्रोल और फ़्लिंग के जेस्चर, एसडीके को भेजे जाते हैं और एसडीके ही इन्हें मैनेज करता है. इससे तब बेहतर यूज़र एक्सपीरियंस मिलता है, जब विज्ञापन का यूज़र इंटरफ़ेस (यूआई) हॉरिज़ॉन्टल तौर पर स्क्रोल किया जा सकता हो. जैसे, विज्ञापन कैरसेल.
लागू करने के बारे में जानकारी देने वाली गाइड
एसडीके को ये काम करने चाहिए:
SandboxedUiAdapter: यह पब्लिशर को एसडीके के तय किए गए एपीआई के जवाब में मिलता है. जैसे,loadAd. इस तरीके केopenSession()तरीके का इस्तेमाल, एसडीके के सर्वर को विज्ञापन का अनुरोध करने और उस अनुरोध के लिए विज्ञापन व्यू तैयार करने के लिए किया जाना चाहिए.Session**: यहSandboxedUiAdapter.openSessionकॉल के जवाब में मिलता है. यह क्लाइंट लाइब्रेरी को विज्ञापन यूज़र इंटरफ़ेस (यूआई) पाने और इस एपीआई में हुए बदलावों के बारे में एसडीके को सूचना देने का तरीका उपलब्ध कराता है. सभीSessionतरीकों को यहां लागू किया जाना चाहिए.
पब्लिशर को ये काम करने चाहिए:
- एक्सएमएल या प्रोग्राम के हिसाब से
SandboxedSdkViewबनाएं. - यूज़र इंटरफ़ेस (यूआई) में बदलाव देखने के लिए,
SandboxedSdkUiSessionStateChangedListenerकोSandboxedSdkViewसे अटैच करें. SandboxedUiAdapterसे मिले एसडीके टूल कोSandboxedSdkViewसे अटैच करें.- विंडो में हमेशा की तरह
SandboxedSdkViewजोड़ें. साथ ही, क्लाइंट लाइब्रेरी को SDK की मदद से यूज़र इंटरफ़ेस (यूआई) सेशन बनाने और उसे बनाए रखने दें. - सही समय पर,
SandboxedSdkUiSessionChangedListenerकी ओर से रिपोर्ट की गई स्थिति में बदलावों पर प्रतिक्रिया दें. उदाहरण के लिए, अगर एसडीके सेशन को अचानक बंद कर देता है, तो पब्लिशरSandboxedSdkViewको किसी स्टैटिक इमेज से बदल सकता है या उसे व्यू हैरारकी से हटा सकता है. - जब विज्ञापन के यूज़र इंटरफ़ेस (यूआई) को कवर करने वाले ट्रांज़िशन किए जा रहे हों, जैसे कि ड्रॉप-डाउन मेन्यू, तो विज्ञापन के यूज़र इंटरफ़ेस (यूआई) को पब्लिशर की विंडो के नीचे रखने के लिए,
orderProviderUiAboveClientUiको कुछ समय के लिए false पर सेट करें. ड्रॉप-डाउन मेन्यू बंद होने के बाद,orderProviderUiAboveClientUiकोtrueपर कॉल करें.
प्लैटफ़ॉर्म एपीआई का भविष्य
यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी के बीटा वर्शन के रिलीज़ होने के बाद, हम यूज़र इंटरफ़ेस (यूआई) प्रज़ेंटेशन से जुड़े एसडीके रनटाइम प्लैटफ़ॉर्म एपीआई को बंद करने का प्लान बना रहे हैं. जैसे, SdkSandboxManager.requestSurfacePackage() और SandbxedSdkProvider.getView().
ऐसे सवाल जिन पर फ़ैसला लेना बाकी है
- क्या विज्ञापन के यूज़र इंटरफ़ेस (यूआई) के इस्तेमाल से जुड़े ऐसे और सामान्य उदाहरण हैं जिन्हें यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी को अपने-आप हैंडल करना चाहिए?
- विज्ञापन का यूज़र इंटरफ़ेस (यूआई) दिखाने के लिए, किन यूज़र इंटरफ़ेस (यूआई) फ़्रेमवर्क का इस्तेमाल किया जाता है? क्या आपको यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी को इन फ़्रेमवर्क के साथ इंटिग्रेट करने में समस्याएं आ सकती हैं?
- क्या स्क्रोल किए जा सकने वाले पब्लिशर कंटेनर में स्क्रोल किए जा सकने वाले विज्ञापन यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करना, आपके लिए सामान्य बात है? इस मामले में, विज्ञापन यूज़र इंटरफ़ेस (यूआई) और कंटेनर के लिए स्क्रोल करने की दिशा क्या है? जब उपयोगकर्ता, विज्ञापन के यूज़र इंटरफ़ेस (यूआई) पर स्क्रोल करना शुरू करता है, तो आपको क्या लगता है कि क्या होगा?