स्मार्ट ऐप बैनर का उपयोग करके रिटारगेटिंग कैंपेन कैसे चलाएं? स्मार्ट ऐप बैनर के जरिए रिटारगेटिंग कैंपेन चलाने के लिए फर्स्ट-पार्टी वेब ब्राउजिंग संदर्भ को कैप्चर करने, कॉन्टेक्स्टुअल डीप-लिंक सीटीए (CTA) के साथ डायनामिक एचटीएमएल (HTML) बैनर रेंडर करने और रिटर्निंग यूज़र्स को एट्रिब्यूशन टोकन पास करते हुए सीधे संबंधित इन-ऐप सीन पर भेजने की आवश्यकता होती है।
स्मार्ट ऐप बैनर का उपयोग करके वेब विजिटर रिटारगेटिंग एक ग्रोथ इंजीनियरिंग रणनीति है जो मोबाइल वेबसाइटों पर फर्स्ट-पार्टी ब्राउजिंग संदर्भ को कैप्चर करती है और विजिटर्स को सीधे नेटिव एप्लिकेशन सीन में भेजने के लिए व्यक्तिगत प्रमोशनल बैनर प्रदर्शित करती है। स्टेटिक ऐप स्टोर लिंक को कॉन्टेक्स्टुअल डीप-लिंक से बदलकर, रिटारगेटिंग बैनर यूज़र की मंशा (intent) को सुरक्षित रखने, सक्रिय यूज़र्स को फिर से जोड़ने और दीर्घकालिक ऐप एंगेजमेंट का समर्थन करने में मदद करते हैं।
| शब्द | परिभाषा | संबंधित एंटिटी | खोज का उद्देश्य (Search Intent) |
|---|---|---|---|
| ऐप एंगेजमेंट | मोबाइल एप्लिकेशन के भीतर यूज़र इंटरैक्शन की गहराई, आवृत्ति और अवधि। | यूज़र रिटेंशन | सूचनात्मक / व्यावसायिक |
| स्मार्ट ऐप बैनर | एक वेब-आधारित प्रमोशनल घटक जो डायनामिक ऐप लॉन्च या डाउनलोड सीटीए प्रस्तुत करता है। | वेब से ऐप रीडायरेक्शन | सूचनात्मक |
| वेब टू ऐप | वेब ब्राउज़र विजिटर्स को नेटिव मोबाइल ऐप्स में भेजने की आर्किटेक्चरल प्रक्रिया। | मोबाइल डीप लिंकिंग | सूचनात्मक |

वेब विजिटर रिटारगेटिंग कैसे ऐप एंगेजमेंट का समर्थन कर सकती है
मोबाइल वेब इंटेंट विरोधाभास: उच्च ब्राउजिंग वॉल्यूम बनाम कम ट्रांजैक्शन दरें
मोबाइल वेबसाइटें एक व्यापक एक्विजिशन चैनल का प्रतिनिधित्व करती हैं, जो ऑर्गेनिक सर्च, पेड कैंपेन, सोशल डिस्कवरी और कंटेंट सिंडिकेशन से टॉप-ऑफ-फनल ट्रैफ़िक को कैप्चर करती हैं। हालाँकि, मोबाइल वेब ब्राउज़र पर उपभोक्ता व्यवहार अक्सर एक इंटेंट विरोधाभास दिखाता है: यूज़र्स अक्सर मोबाइल वेब पेजों पर उत्पादों को ब्राउज़, शोध और मूल्यांकन करते हैं, जबकि नेटिव मोबाइल एप्लिकेशन अक्सर सेव्ड लोकल स्टेट और सुव्यवस्थित नेविगेशन के कारण बेहतर ट्रांजैक्शन पाथवे प्रदान करते हैं।
मोबाइल ब्राउज़र नेटिव ऐप्स की तुलना में परिचालन घर्षण (friction) बिंदु पेश करते हैं, जैसे कि फिर से ऑथेंटिकेशन की आवश्यकता या बहु-चरणीय वेब फॉर्म। जब हाई-इंटेंट विजिटर्स किसी विशिष्ट उत्पाद कैटलॉग को ब्राउज़ करते हैं या मोबाइल वेब कार्ट में आइटम जोड़ते हैं, तो नेटिव ऐप वातावरण में सीधा ट्रांजैक्शन प्रदान करने में विफलता कार्ट परित्याग (cart abandonment) और कम कस्टमर लाइफटाइम वैल्यू (LTV) में योगदान कर सकती है।
"लॉबी ड्रॉप-ऑफ" को पार करना: होमपेज पर यूज़र्स को फिर से जोड़ने से कन्वर्जन क्यों कम होता है
मोबाइल वेब रिटारगेटिंग में एक सामान्य चुनौती स्टेटिक बैनर तैनात करना है जो रिटर्निंग यूज़र्स को नेटिव एप्लिकेशन की डिफ़ॉल्ट होम स्क्रीन पर भेजते हैं। जब कोई सक्रिय या पुराना ऐप यूज़र किसी मोबाइल वेबसाइट पर किसी विशिष्ट उत्पाद को ब्राउज़ करता है, तो एक सामान्य बैनर पर टैप करने से एक ऐप लॉन्च होता है जो उन्हें मुख्य लॉबी में उतार देता है।
यह डिस्कनेक्ट तुरंत संज्ञानात्मक घर्षण पैदा करता है। यूज़र को मैन्युअल रूप से श्रेणी मेनू के माध्यम से नेविगेट करना पड़ता है, सर्च क्वेरी निष्पादित करनी पड़ती है, या अपनी शॉपिंग कार्ट को स्क्रैच से खोजना पड़ता है। प्रत्येक मैन्युअल नेविगेशन चरण ड्रॉप-ऑफ के जोखिम को बढ़ाता है। डायनामिक स्मार्ट ऐप बैनर वेब-ब्राउजिंग संदर्भ को सीधे डीप-लिंक रूट के साथ जोड़कर इस घर्षण को दूर करते हैं, जिससे यूज़र्स को संबंधित उत्पाद दृश्य, प्री-पॉप्युलेटेड कार्ट, या नेटिव ऐप के भीतर प्रमोशनल लैंडिंग स्क्रीन तक पहुँचाया जाता है।
वेब विजिटर्स के लिए परिचालन घर्षण मेट्रिक के रूप में टाइम-टू-एक्शन का मूल्यांकन
लाइफसाइकिल मार्केटिंग में, नेविगेशन में देरी के साथ यूज़र का ध्यान तेजी से कम हो जाता है। परिचालन मेट्रिक टाइम-टू-एक्शन (
गैर-संदर्भित फनल में,
कॉन्टेक्स्ट स्टिचिंग स्टेटिक वेब बैनर को रिटारगेटिंग टूल में कैसे बदलती है
फर्स्ट-पार्टी वेब संदर्भ कैप्चर करना और स्टोरेज लाइफसाइकिल नेविगेट करना
स्टेटिक बैनर के विपरीत जो हार्डकोडेड कॉपी प्रदर्शित करते हैं, डायनामिक रिटारगेटिंग बैनर मैसेजिंग को अनुकूलित करने के लिए फर्स्ट-पार्टी वेब सत्र डेटा का निरीक्षण करते हैं। जब कोई विजिटर मोबाइल वेबसाइट नेविगेट करता है, तो क्लाइंट-साइड स्क्रिप्ट DOM, यूआरएल क्वेरी पैरामीटर, या फर्स्ट-पार्टी वेब स्टोरेज (sessionStorage या localStorage) से सत्र स्थिति पढ़ती है:
- देखा गया उत्पाद SKU: वर्तमान में देखे जा रहे विशिष्ट उत्पाद पहचानकर्ता (उदा.,
item_id=SKU_5501) को कैप्चर करता है। - कार्ट परित्याग टोकन: लंबित कार्ट पहचानकर्ताओं और छूट पात्रता फ्लैग को पढ़ता है।
- श्रेणी एफिनिटी: फ़ॉलबैक प्रचारों को निजीकृत करने के लिए उच्च-स्तरीय ब्राउजिंग श्रेणियों (उदा.,
electronics,apparel) को ट्रैक करता है।
आर्किटेक्ट्स को मोबाइल ब्राउज़र स्टोरेज लाइफसाइकिल के लिए हिसाब रखना चाहिए। आधुनिक वेबकिट ट्रैकिंग रोकथाम नीतियों के तहत, क्लाइंट-स्क्रिप्ट-राइटेबल स्टोरेज (localStorage, sessionStorage, IndexedDB) को वेबसाइट के साथ सात दिनों के यूज़र इंटरैक्शन न होने के बाद हटाया जा सकता है, जो वेबकिट ट्रैकिंग-रोकथाम स्थिति और हालिया यूज़र एंगेजमेंट पर निर्भर करता है। ब्राउज़र स्टोरेज को सबसे अच्छे प्रयास, अस्थायी क्लाइंट-साइड सत्र कैश के रूप में माना जाना चाहिए, न कि एक टिकाऊ ग्राहक प्रोफ़ाइल या आधिकारिक डेटाबेस के रूप में। आधिकारिक कार्ट स्थिति, आइटम उपलब्धता और यूज़र पात्रता का समाधान और सत्यापन हमेशा बैकएंड पर किया जाना चाहिए।

रिटारगेटिंग डेटा के लिए गोपनीयता और सहमति सीमाएं
वेब और नेटिव सीमाओं के बीच ब्राउजिंग संदर्भ को एकत्र करने और पारित करने के लिए गोपनीयता शासन का सख्त पालन आवश्यक है:
- डेटा न्यूनीकरण: रिटारगेटिंग संदर्भ को केवल वेबसाइट और एप्लिकेशन की लागू सहमति, नोटिस, रिटेंशन और डेटा-न्यूनीकरण नीतियों के तहत एकत्र और उपयोग करें।
- यूआरएल में कोई पीआईआई (PII) नहीं: सीधे पहचान योग्य व्यक्तिगत डेटा (PII) या संवेदनशील व्यक्तिगत विशेषताओं को बैनर यूआरएल या क्लाइंट-साइड स्टोरेज में एन्कोड करने से बचें।
- एपमेरल स्थिति: कैप्चर किए गए ब्राउजिंग संदर्भ को यूज़र की सहमति प्राथमिकताओं और प्लेटफॉर्म ट्रैकिंग-रोकथाम नियमों के अधीन अस्थायी फर्स्ट-पार्टी स्थिति के रूप में मानें।
डायनामिक कंटेंट रेंडरिंग: वास्तविक समय में बैनर कॉपी, आर्टवर्क और सीटीए को अपडेट करना
एक बार सत्र संदर्भ निकल जाने के बाद, बैनर अपना विज़ुअल लेआउट डायनामिक रूप से अपडेट करता है:
- बैनर शीर्षक सामान्य टेक्स्ट से कॉन्टेक्स्टुअल प्रॉम्प्ट (उदा., “अपना ऑर्डर जारी रखें” या “ऐप में उत्पाद देखें”) में अपडेट होता है।
- सीटीए बटन मानक “ऐप प्राप्त करें” से एक क्रियाशील प्रॉम्प्ट (उदा., “कार्ट खोलें”) में शिफ्ट हो जाता है।
- डायनामिक आर्टवर्क वर्तमान स्टॉक या मूल्य निर्धारण संकेतकों के साथ विशिष्ट उत्पाद थंबनेल प्रदर्शित करता है।
यह कॉन्टेक्स्टुअल प्रासंगिकता बैनर को एक निष्क्रिय विज्ञापन तत्व से एक इंटरैक्टिव उपयोगिता में बदल देती है।
क्रॉस-डोमेन बाधाओं का प्रबंधन: सफारी यूनिवर्सल लिंक के लिए समर्पित सबडोमेन की सिफारिश
आईओएस (iOS) पर यूनिवर्सल लिंक तैनात करते समय, वेब आर्किटेक्ट्स को एप्पल सफारी की समान-डोमेन नेविगेशन बाधा को नेविगेट करना होगा, जैसा कि एप्पल डेवलपर डॉक्यूमेंटेशन ऑन अलाउइंग ऐप्स एंड वेबसाइट्स टू लिंक टू योर कंटेंट में प्रलेखित है। यदि कोई यूज़र https://example.com पर एक वेब पेज ब्राउज़ करता है और उसी सटीक डोमेन की ओर इशारा करते हुए एक यूनिवर्सल लिंक पर टैप करता है, तो सफारी आमतौर पर नेटिव ऐप लॉन्च करने के बजाय ब्राउज़र में ही रहती है।
अलग से संबद्ध राउटिंग होस्ट का उपयोग करने से सफारी के प्रलेखित समान-डोमेन ब्राउजिंग व्यवहार से बचा जा सकता है, लेकिन नेटिव ऐप खोलना अभी भी वैध यूनिवर्सल लिंक एसोसिएशन, इंस्टॉल किए गए एप्लिकेशन पात्रता और प्लेटफॉर्म स्थिति पर निर्भर करता है:
- प्राथमिक मोबाइल वेबसाइट को
https://www.example.comपर होस्ट करें। - यूनिवर्सल लिंक बैनर लक्ष्यों को एक सत्यापित संबद्ध सबडोमेन के माध्यम से रूट करें, जैसे
https://app.example.com/product/5501।
जब वेब विजिटर्स के पास ऐप इंस्टॉल न हो तो डिफर्ड डीप लिंकिंग की भूमिका
डायनामिक बैनर द्वारा रिटारगेट किए गए सभी वेब विजिटर्स के पास एप्लिकेशन इंस्टॉल नहीं होती है। कस्टम यूआरआई (URI) स्कीम्स (myapp://) इंस्टॉल न होने वाले उपकरणों पर हल करने में विफल हो सकती हैं जब तक कि पेज स्पष्ट फ़ॉलबैक प्रदान न करे।
डिफर्ड डीप लिंकिंग इस परिदृश्य को संबोधित करती है। जब कोई इंस्टॉल न करने वाला यूज़र रिटारगेटिंग बैनर पर टैप करता है, तो राउटिंग लेयर ब्राउज़र को गूगल प्ले या ऐप स्टोर पर रीडायरेक्ट करने से पहले एट्रिब्यूशन सर्वर पर इच्छित गंतव्य संदर्भ (जैसे देखा गया SKU और सक्रिय प्रोमो टोकन) को कैप्चर कर लेती है। जब यूज़र पहली बार ऐप डाउनलोड और खोलता है, तो एक एट्रिब्यूशन एसडीके (SDK) कैश्ड पैरामीटर्स को पुनः प्राप्त करता है, जिससे नेटिव ऐप पहली बार लॉन्च पर लक्षित दृश्य को बहाल करने में सक्षम होता है जहाँ प्लेटफॉर्म गोपनीयता नीतियां समर्थित होती हैं।
डायनामिक पैरामीटर बाइंडिंग और डीप लिंक राउटिंग का तकनीकी मैकेनिक्स
रिटारगेटिंग के लिए यूआरएल पैरामीटर्स की संरचना
एक मजबूत रिटारगेटिंग क्वेरी स्ट्रिंग गंतव्य राउटिंग, प्रमोशनल टोकन और कैंपेन एट्रिब्यूशन को स्पष्ट रूप से व्यवस्थित करती है:
https://app.example.com/promo/cart?scene=cart&item_id=SKU_5501&promo_code=RESTART10&token=TK_1234567890abcdef&utm_source=web_retargeting
यह पेलोड राउटिंग निर्देशों (scene=cart), व्यावसायिक पहचानकर्ताओं (item_id), और ट्रैकिंग संदर्भ (utm_source) को स्पष्ट रूप से अलग करता है।
क्लाइंट-साइड डेटा सैनिटाइजेशन और लंबाई की बाधाओं को लागू करना
ओवासप (OWASP) मोबाइल एप्लिकेशन सिक्योरिटी टेस्टिंग गाइड गाइडेंस ऑन इनसिक्योर डीप लिंक्स के अनुसार, वेब यूआरएल या क्लाइंट-साइड स्टोरेज से निकाले गए सभी पैरामीटर्स को अविश्वसनीय इनपुट के रूप में माना जाना चाहिए।
डीप-लिंक हैंडऑफ़ पेलोड बनाने से पहले:
- अनुमोदित दृश्य लक्ष्यों (
cart,product_detail,promo_hub) की एक अनुमति सूची के विरुद्धsceneपहचानकर्ताओं को मान्य करें। - आईडी (IDs) और प्रोमो कोड पर अल्फ़ान्यूमेरिक रेगुलर एक्सप्रेशन फ़िल्टर (उदा.,
^[A-Za-z0-9_-]{1,64}$) लागू करें। - रूट टोकन पर सख्त लंबाई सीमाओं (उदा., 16 से 128 वर्ण) को लागू करें और एप्लिकेशन-परिभाषित वर्ण और लंबाई नीति के विरुद्ध कैंपेन स्ट्रिंग को मान्य करें, अमान्य मानों को अस्वीकार करें या सुरक्षित डिफ़ॉल्ट के साथ बदलें।
- रूट टोकन को अविश्वसनीय, अपारदर्शी संदर्भों के रूप में मानें। रूट टोकन के कब्जे को कभी भी प्रमाणित बैकएंड सत्यापन के बिना कार्ट एक्सेस, छूट या खाता क्रियाओं को अधिकृत नहीं करना चाहिए।
वेब एसडीके हैंडऑफ़ हैंडलर्स के माध्यम से सीधे हैंडऑफ़ को ट्रिगर करना
एक प्रतिनिधि ओपोइंस्टॉल (OpoInstall) वेब एसडीके एकीकरण एक वेक-ऑर-इंस्टॉल हैंडऑफ़ विधि को उजागर कर सकता है; अपने वातावरण में तैनात उत्पादन एसडीके संस्करण के विरुद्ध सटीक विधि नाम, कंस्ट्रक्टर, सीडीएन (CDN) पथ और पैरामीटर स्कीमा को सत्यापित करें।
ओपोइंस्टॉल क्रॉस-प्लेटफॉर्म वेब-टू-ऐप हैंडऑफ़ और डिफर्ड पैरामीटर रिकवरी का समर्थन करता है; सटीक राउटिंग तंत्र और एसडीके अनुबंध तैनात एसडीके संस्करण पर निर्भर करते हैं। पूर्ण इंटरफ़ेस पैरामीटर्स और एपीआई (API) विनिर्देशों के लिए एसडीके एकीकरण डॉक्यूमेंटेशन की समीक्षा करें।
[यूज़र मोबाइल वेब पेज ब्राउज़ करता है (उदा. SKU_1024 देखता है)]
│
▼
[स्क्रिप्ट फर्स्ट-पार्टी सत्र में संदर्भ कैप्चर करती है]
│
▼
[डायनामिक स्मार्ट बैनर कॉन्टेक्स्टुअल ऑफर रेंडर करता है]
│
▼
[यूज़र "ऐप में जारी रखें" पर टैप करता है]
│
┌───────────────────┴───────────────────┐
▼ ▼
[ऐप इंस्टॉल है] [ऐप इंस्टॉल नहीं है]
│ │
▼ ▼
[यूनिवर्सल लिंक / ऐप लिंक] [वेब राउटिंग लेयर]
│ │
▼ ▼
[सीधा नेटिव ऐप लॉन्च] [स्टोर डाउनलोड / डिफर्ड लिंक]
│ │
└───────────────────┬───────────────────┘
▼
[नेटिव एसडीके पैरामीटर रिट्रीवल]
│
▼
[सर्वर स्थिति और ऑथ सत्यापन]
│
▼
[लक्षित इन-ऐप सीन रेंडर करता है]
वेब रिटारगेटिंग के लिए घर्षण-रहित इन-ऐप सीन बहाली को आर्किटेक्ट कैसे करें
एंड्रॉइड और आईओएस (iOS) लाइफसाइकिल में कोल्ड स्टार्ट बनाम बैकग्राउंड रिज्यूमे को संभालना
नेटिव मोबाइल एप्लिकेशन को अलग-अलग निष्पादन स्थितियों में आने वाले रिटारगेटिंग पेलोड को संभालना चाहिए:
- वार्म रिज्यूमे: ऐप पहले से ही बैकग्राउंड मेमोरी में चल रहा है। एंड्रॉइड पर, जब गतिविधि कार्य कॉन्फ़िगरेशन किसी मौजूदा इंस्टेंस का पुन: उपयोग करता है, तो इंटेंट
onNewIntentको वितरित करता है। आईओएस पर, लिंकscene(_:continue:)को वितरित करता है। ऐप राउटर वैश्विक स्थिति को पुन: प्रारंभ किए बिना सक्रिय दृश्य पदानुक्रम को नेविगेट करता है। - कोल्ड स्टार्ट: ऐप प्रक्रिया समाप्त हो गई है। ऑपरेटिंग सिस्टम प्रक्रिया को बूट करता है और स्टार्टअप के दौरान इंटेंट वितरित करता है। नेटिव आर्किटेक्चर को पेलोड को कैप्चर करना चाहिए, इनिशियलाइज़ेशन को सत्यापित करना चाहिए, और प्राथमिक यूआई (UI) पदानुक्रम लोड होने के बाद गंतव्य सीन पर रूट करना चाहिए।
यूज़र ऑथेंटिकेशन क्रेडेंशियल्स से राउटिंग पहचानकर्ताओं को अलग करना
डीप लिंक यूआरएल और वेब-टू-ऐप बैनर को केवल राउटिंग इंटेंट (कौन सा उत्पाद या कार्ट प्रदर्शित करना है) और अपारदर्शी, अल्पकालिक संदर्भ टोकन ले जाना चाहिए। किसी भी परिस्थिति में डीप लिंक क्वेरी स्ट्रिंग को कच्चा डेटाबेस यूज़र आईडी, खाता पासवर्ड, या अनहैश्ड सत्र टोकन नहीं ले जाना चाहिए।
नेटिव ऐप को निजी यूज़र जानकारी प्रदर्शित करने या खाता स्थिति बदलने से पहले अपने सुरक्षित स्थानीय क्रेडेंशियल स्टोर (जैसे आईओएस कीचेन या एंड्रॉइड कीस्टोर) से यूज़र ऑथेंटिकेशन को स्वतंत्र रूप से हल करना चाहिए।
अनन्य छूट और कार्ट स्थिति के लिए सर्वर-साइड ऑथराइजेशन गेट्स को लागू करना
एक वैध डीप-लिंक क्वेरी स्ट्रिंग यह गारंटी नहीं देती है कि कोई प्रचार सक्रिय है या यूज़र इसका दावा करने का हकदार है। क्लाइंट एप्लिकेशन को सर्वर-साइड सत्यापन के लिए रूट टोकन को बैकएंड पर जमा करना चाहिए:
- सत्यापित करें कि प्रमोशनल कूपन कोड (
promo_code) समाप्त नहीं हुए हैं और प्रमाणित यूज़र के लिए पात्र हैं। - मान्य करें कि कार्ट टोकन सक्रिय हैं और प्रमाणित खाते से संबंधित हैं।
- कूपन दुरुपयोग को रोकने के लिए एकल-उपयोग आइडम्पोटेंसी (idempotency) और रिप्ले जांच लागू करें।
बासी लक्ष्यों का प्रबंधन: समाप्त हो चुके सौदों और आउट-ऑफ-स्टॉक इन्वेंट्री के लिए फ़ॉलबैक राउटिंग
वेब विजिटर्स प्रमोशनल डील समाप्त होने या इन्वेंट्री आइटम के बिक जाने के कई दिनों बाद रिटारगेटिंग बैनर पर क्लिक कर सकते हैं। यदि कोई ऐप राज्य सत्यापन के बिना हटाए गए उत्पाद को लोड करने का प्रयास करता है, तो यूज़र्स को टूटे हुए इंटरफ़ेस का सामना करना पड़ता है।
उत्पादन आर्किटेक्चर एक दो-स्तरीय फ़ॉलबैक गेट लागू करते हैं:
- क्लाइंट-साइड रूट सत्यापन: यदि लक्ष्य दृश्य अपरिचित है या पेलोड सिंटैक्स विकृत है, तो तुरंत डिफ़ॉल्ट होम स्क्रीन पर रूट करें।
- सर्वर-साइड स्थिति सत्यापन: यदि रूट वैध है लेकिन आइटम बिक गया है या प्रोमो कोड समाप्त हो गया है, तो एक जानकारीपूर्ण मोडल अधिसूचना प्रदर्शित करें (उदा., “यह आइटम वर्तमान में आउट ऑफ स्टॉक है, लेकिन संबंधित सिफारिशों का पता लगाएं”) और संबंधित श्रेणी हब पर सुचारू रूप से ट्रांजिशन करें।
कॉन्टेक्स्टुअल रिटारगेटिंग बैनर के लिए फ्रंटएंड और मोबाइल कार्यान्वयन

पूर्व-संलग्न फ़ॉलबैक के साथ कॉन्टेक्स्टुअल फ्रंटएंड स्क्रिप्ट की संरचना
कार्यान्वयन यह मानता है कि एक मॉड्यूलर बैनर घटक कंटेनर पहले से ही वेबपेज मार्कअप के भीतर माउंट किया गया है। स्क्रिप्ट क्लाइंट-साइड एसडीके हैंडलर्स से जुड़ने से पहले रक्षात्मक नल-चेक, प्लेटफॉर्म वर्गीकरण, स्थानीय स्टोरेज कूल-डाउन जांच, और सख्त पैरामीटर सैनिटाइजेशन लागू करती है। बैनर टेक्स्ट का वैयक्तिकरण सीधे सामान्यीकृत डेटा मॉडल से लिया जाता है ताकि प्रदर्शित कॉपी और अंतर्निहित हैंडऑफ़ पेलोड के बीच सख्त संरेखण सुनिश्चित हो सके।
एंड्रॉइड इंटेंट इंटरसेप्शन और कोटलिन में पैरामीटर एक्सट्रैक्शन
एंड्रॉइड पर, प्राथमिक MainActivity onCreate और onNewIntent के पार आने वाले डीप-लिंक इंटेंट को कैप्चर करती है, डेटा प्रकारों को सामान्य करती है और बैकएंड ऑथराइजेशन को सौंपने से पहले एक अनुमति सूची के विरुद्ध पेलोड फ़ील्ड को मान्य करती है।
आईओएस (iOS) सीनडेलिगेट यूनिवर्सल लिंक प्रोसेसिंग स्विफ्ट (Swift) में
आईओएस पर, SceneDelegate.swift scene(_:continue:) के माध्यम से वितरित यूनिवर्सल लिंक को संसाधित करता है, पैरामीटर्स को पार्स करता है, इनपुट को सैनिटाइज करता है, और मुख्य अभिनेता पर नेटिव व्यू कंट्रोलर तक रूट करता है।
नीचे दिया गया कार्यान्वयन फ्रंटएंड बैनर कॉन्फ़िगरेशन और नेटिव एंड्रॉइड (कोटलिन) और आईओएस (स्विफ्ट) पैरामीटर एक्सट्रैक्शन को प्रदर्शित करता है। प्रतिनिधि ओपोइंस्टॉल एकीकरण पैटर्न नीचे दिखाए गए हैं; वर्तमान में तैनात ओपोइंस्टॉल एसडीके रिलीज के विरुद्ध पैकेज नाम, एसडीके वर्ग, सीडीएन पथ, कॉलबैक नाम और विधि हस्ताक्षरों को सत्यापित करें।
// जावास्क्रिप्ट: कॉन्टेक्स्टुअल एक्सट्रैक्शन, प्लेटफॉर्म गेटिंग, और प्रतिनिधि एसडीके एकीकरण
// प्रतिनिधि एकीकरण पैटर्न। स्क्रिप्ट यूआरएल, कंस्ट्रक्टर नाम, और एपीआई हस्ताक्षरों को सत्यापित करें
// अपने वातावरण में तैनात उत्पादन ओपोइंस्टॉल एसडीके रिलीज के विरुद्ध।
// नोट: मान लें कि लक्ष्य आईडी के साथ एक पुन: प्रयोज्य बैनर घटक मार्कअप पहले से ही DOM में माउंट किया गया है।
(function() {
var DISMISS_KEY = "retarget_smart_banner_dismissed_at";
var COOL_DOWN_MS = 7 * 24 * 60 * 60 * 1000; // 7-दिवसीय कूल-डाउन विंडो
// 1. प्लेटफॉर्म मूल्यांकन: डेस्कटॉप वातावरण पर बैनर को दबाएं
function getMobilePlatform() {
var ua = navigator.userAgent || navigator.vendor || window.opera;
if (/Android/i.test(ua)) return "android";
var isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;
var isIPadOS = (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1);
if (isIOS || isIPadOS) return "ios";
return "unsupported_desktop";
}
var platform = getMobilePlatform();
if (platform === "unsupported_desktop") {
return; // डेस्कटॉप ब्राउज़र पर दबाएं
}
// 2. लोकल स्टोरेज के माध्यम से बर्खास्तगी सत्यापन
function shouldShowBanner() {
try {
var dismissedAt = localStorage.getItem(DISMISS_KEY);
if (!dismissedAt) return true;
var now = new Date().getTime();
return (now - parseInt(dismissedAt, 10)) > COOL_DOWN_MS;
} catch (e) {
return true; // यदि localStorage प्रतिबंधित है तो प्रदर्शन करने के लिए फ़ॉलबैक करें
}
}
if (!shouldShowBanner()) {
return;
}
// DOM नल-गार्ड्स: हेरफेर से पहले सत्यापित करें कि तत्व मौजूद हैं
var bannerContainer = document.getElementById("dynamicRetargetBanner");
var closeBtn = document.getElementById("bannerCloseBtn");
var actionBtn = document.getElementById("bannerActionBtn");
var bannerTitle = document.getElementById("bannerTitle");
if (!bannerContainer || !actionBtn || !bannerTitle) {
return;
}
// 3. फर्स्ट-पार्टी ब्राउजिंग संदर्भ निकालें और सैनिटाइज करें (संगत 'item_id' स्कीमा)
var urlParams = new URLSearchParams(window.location.search);
var rawScene = urlParams.get("scene") || "cart";
var rawId = urlParams.get("item_id") || "";
var rawPromo = urlParams.get("promo_code") || "";
var rawToken = urlParams.get("token") || "";
var rawChannel = urlParams.get("utm_source") || "web_retargeting";
function sanitizePayload() {
var allowedScenes = ["cart", "product_detail", "promo_hub"];
var targetScene = allowedScenes.indexOf(rawScene) !== -1 ? rawScene : "cart";
var idRegex = /^[A-Za-z0-9_-]{1,64}$/;
var targetId = idRegex.test(rawId) ? rawId : "";
// स्वतंत्र प्रोमो कोड सत्यापन (नेटिव अनुबंध से मेल खाते हुए सख्त 32-वर्ण सीमा)
var promoRegex = /^[A-Za-z0-9_-]{1,32}$/;
var promoCode = promoRegex.test(rawPromo) ? rawPromo : "";
var tokenRegex = /^[A-Za-z0-9_-]{16,128}$/;
var routeToken = tokenRegex.test(rawToken) ? rawToken : "";
var channelRegex = /^[A-Za-z0-9_-]{1,32}$/;
var channelCode = channelRegex.test(rawChannel) ? rawChannel : "web_retargeting";
var payload = {
scene: targetScene,
token: routeToken
};
if (targetId.length > 0) {
payload.item_id = targetId;
}
if (promoCode.length > 0) {
payload.promo_code = promoCode;
}
return {
payload: payload,
channelCode: channelCode
};
}
var normalizedData = sanitizePayload();
// सामान्यीकृत मॉडल के आधार पर बैनर संदेश को वैयक्तिकृत करें
if (normalizedData.payload.scene === "cart") {
bannerTitle.textContent = "अपना ऑर्डर जारी रखें";
actionBtn.textContent = "कार्ट खोलें";
} else if (normalizedData.payload.scene === "product_detail") {
bannerTitle.textContent = "ऐप में उत्पाद देखें";
actionBtn.textContent = "आइटम देखें";
}
bannerContainer.style.display = "block";
// यूज़र बर्खास्तगी को संभालें
if (closeBtn) {
closeBtn.addEventListener("click", function() {
try {
localStorage.setItem(DISMISS_KEY, new Date().getTime().toString());
} catch (e) {}
bannerContainer.style.display = "none";
});
}
// 4. प्रारंभिक स्टेटिक फ़ॉलबैक रूट
function executeStaticFallback() {
if (platform === "android") {
window.location.href = "https://play.google.com/store/apps/details?id=com.example.app";
} else if (platform === "ios") {
window.location.href = "https://apps.apple.com/app/id123456789";
}
}
var activeClickHandler = function() {
executeStaticFallback();
};
actionBtn.addEventListener("click", function(e) {
activeClickHandler(e);
});
// 5. एसडीके एकीकरण के लिए डायनामिक स्क्रिप्ट इंजेक्शन
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://web.cdn.opoinstallcloud.com/openinstall.js";
script.onload = function() {
try {
if (typeof OpenInstall === "function") {
var openInstall = new OpenInstall({
appKey: "YOUR_OPOINSTALL_APPKEY",
onready: function() {
var m = this;
// एसडीके तैयार होने पर डायनामिक डीप लिंक हैंडऑफ़ पर अपग्रेड करें
activeClickHandler = function() {
var sanitized = sanitizePayload();
m.wakeupOrInstall({
data: sanitized.payload,
channelCode: sanitized.channelCode
});
};
}
}, actionBtn);
}
} catch (err) {
// यदि इनिशियलाइज़ेशन विफल हो जाता है तो पूर्व-संलग्न स्टेटिक फ़ॉलबैक बनाए रखें
}
};
script.onerror = function() {
// यदि नेटवर्क अनुरोध विफल हो जाता है तो पूर्व-संलग्न स्टेटिक फ़ॉलबैक बनाए रखें
};
document.head.appendChild(script);
})();
// एंड्रॉइड: MainActivity.kt - पुन: जुड़ाव इंटेंट प्रसंस्करण और रूट सत्यापन गेट
// प्रतिनिधि एकीकरण पैटर्न। पैकेज नाम, कॉलबैक क्लास, और विधि हस्ताक्षर सत्यापित करें
// अपने वातावरण में तैनात उत्पादन ओपोइंस्टॉल एसडीके रिलीज के विरुद्ध।
package com.example.app.ui
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.opoinstall.api.OpoInstall
import com.opoinstall.api.listener.AppWakeUpAdapter
import com.opoinstall.api.model.AppData
import org.json.JSONObject
data class ValidatedRetargetingRoute(
val scene: String,
val targetId: String,
val promoCode: String,
val routeToken: String,
val rawKeys: Set<String>
)
object OpoInstallPayloadAdapter {
/**
* विषम एसडीके डेटा अभ्यावेदन (JSON स्ट्रिंग, मैप, या JSONObject) को सामान्य करता है
* सख्त फेल-क्लोज्ड टाइप चेकिंग के साथ एक कैननिकल एप्लिकेशन-स्वामित्व वाले रिटारगेटिंग मॉडल में।
*/
fun normalize(rawPayload: Any?): ValidatedRetargetingRoute? {
if (rawPayload == null) return null
val stringMap = when (rawPayload) {
is String -> parseJsonStringStrict(rawPayload)
is Map<*, *> -> parseMapStrict(rawPayload)
is JSONObject -> parseJsonObjectStrict(rawPayload)
else -> {
Log.w("PayloadAdapter", "असमर्थित एसडीके पेलोड प्रकार: ${rawPayload.javaClass.name}")
null
}
} ?: return null
val scene = stringMap["scene"] ?: ""
if (scene.isEmpty()) return null
return ValidatedRetargetingRoute(
scene = scene,
targetId = stringMap["item_id"] ?: "",
promoCode = stringMap["promo_code"] ?: "",
routeToken = stringMap["token"] ?: "",
rawKeys = stringMap.keys
)
}
private fun parseJsonStringStrict(rawJson: String): Map<String, String>? {
return try {
val json = JSONObject(rawJson)
parseJsonObjectStrict(json)
} catch (e: Exception) {
Log.e("PayloadAdapter", "JSON स्ट्रिंग पार्सिंग विफल रही", e)
null
}
}
private fun parseJsonObjectStrict(json: JSONObject): Map<String, String>? {
val map = mutableMapOf<String, String>()
for (key in json.keys()) {
val value = json.opt(key)
// फेल-क्लोज्ड: टाइप कोएर्शन एक्सप्लॉइट्स को रोकने के लिए नॉन-स्ट्रिंग प्रकारों को अस्वीकार करें
if (value !is String) {
Log.w("PayloadAdapter", "कुंजी के लिए नॉन-स्ट्रिंग पेलोड मान अस्वीकृत: $key")
null
}
map[key] = value
}
return map
}
private fun parseMapStrict(rawMap: Map<*, *>): Map<String, String>? {
val map = mutableMapOf<String, String>()
for ((key, value) in rawMap) {
if (key !is String || value !is String) {
Log.w("PayloadAdapter", "कच्चे मैप में नॉन-स्ट्रिंग कुंजी या मान अस्वीकृत: $key")
null
}
map[key] = value
}
return map
}
}
object RetargetingRouteValidator {
private val allowedKeys = setOf("scene", "item_id", "promo_code", "token")
private val allowedScenes = setOf("cart", "product_detail", "promo_hub")
fun validate(payload: ValidatedRetargetingRoute): ValidatedRetargetingRoute? {
// चरण 1: सख्त फेल-क्लोज्ड कुंजी सत्यापन (अज्ञात पेलोड कुंजियों को अस्वीकार करें)
if (!allowedKeys.containsAll(payload.rawKeys)) {
null
}
// चरण 2: सख्त अनुमति सूची के विरुद्ध सीन को मान्य करें
if (!allowedScenes.contains(payload.scene)) {
null
}
// चरण 3: लक्ष्य पहचानकर्ता पर अल्फ़ान्यूमेरिक और लंबाई सीमाएं लागू करें
val alphanumericRegex = Regex("^[A-Za-z0-9_-]+$")
if (payload.targetId.isNotEmpty() && (payload.targetId.length > 64 || !payload.targetId.matches(alphanumericRegex))) {
null
}
if (payload.promoCode.isNotEmpty() && (payload.promoCode.length > 32 || !payload.promoCode.matches(alphanumericRegex))) {
null
}
// चरण 4: रूट टोकन प्रारूप को मान्य करें
if (payload.routeToken.isNotEmpty() && (payload.routeToken.length !in 16..128 || !payload.routeToken.matches(alphanumericRegex))) {
null
}
return payload
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// कोल्ड-स्टार्ट रिटारगेटिंग इंटेंट को संसाधित करें
intent?.let { handleRetargetingIntent(it) }
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
// गतिविधि का पुन: उपयोग होने पर वार्म-रिज्यूमे रिटारगेटिंग इंटेंट को संसाधित करें
handleRetargetingIntent(intent)
}
private fun handleRetargetingIntent(intent: Intent) {
OpoInstall.getInstance().getWakeUp(intent, object : AppWakeUpAdapter() {
override fun onWakeUp(appData: AppData?) {
if (appData == null) return
val rawPayload = appData.data
if (rawPayload == null) return
// चरण 1: एडाप्टर के माध्यम से विक्रेता एसडीके पेलोड को सामान्य करें
val canonicalPayload = OpoInstallPayloadAdapter.normalize(rawPayload)
val validatedRoute = canonicalPayload?.let { RetargetingRouteValidator.validate(it) }
if (validatedRoute != null) {
// चरण 2: प्रमाणित ऐप सत्र का उपयोग करके सर्वर ऑथराइजेशन और संसाधन स्थिति को मान्य करें
BackendRouteAuthorizer.verifyRouteAuthorization(validatedRoute.scene, validatedRoute.targetId, validatedRoute.routeToken) { isAuthorized ->
runOnUiThread {
if (isAuthorized) {
executeTargetNavigation(validatedRoute)
} else {
executeLobbyFallback("अनुरोधित रिटारगेटिंग डील या आइटम समाप्त हो गया है।")
}
}
}
} else {
runOnUiThread {
executeLobbyFallback("विकृत या अनधिकृत रिटारगेटिंग पेलोड।")
}
}
}
})
}
private fun executeTargetNavigation(route: ValidatedRetargetingRoute) {
Log.i("AppNavigator", "रिटारगेटिंग सीन पर नेविगेट कर रहे हैं: ${route.scene}")
}
private fun executeLobbyFallback(reason: String) {
Log.w("AppNavigator", "होम लॉबी में सुरक्षित फ़ॉलबैक: $reason")
}
}
// ऐप-विशिष्ट बैकएंड ऑथराइजेशन प्लेसहोल्डर (कोई ओपोइंस्टॉल एसडीके एपीआई नहीं)
object BackendRouteAuthorizer {
fun verifyRouteAuthorization(scene: String, targetId: String, token: String, callback: (Boolean) -> Unit) {
// फेल-क्लोज्ड प्लेसहोल्डर: लाइव बैकएंड ऑथराइजेशन एपीआई से कनेक्ट होना चाहिए।
// उत्पादन बैकएंड सक्रिय यूज़र सत्र, टोकन समाप्ति, कार्ट स्वामित्व और एकल-उपयोग आइडम्पोटेंसी को सत्यापित करता है।
val isAuthorized = false
callback(isAuthorized)
}
}
// आईओएस: SceneDelegate.swift - यूनिवर्सल लिंक प्रसंस्करण और रूट सत्यापन गेट
// प्रतिनिधि एकीकरण पैटर्न। पैकेज नाम, कॉलबैक क्लास, और विधि हस्ताक्षर सत्यापित करें
// अपने वातावरण में तैनात उत्पादन ओपोइंस्टॉल एसडीके रिलीज के विरुद्ध।
import UIKit
import libOpoInstallSDK
struct ValidatedRetargetingRoute {
let scene: String
let targetId: String
let promoCode: String
let routeToken: String
let rawKeys: Set<String>
}
class OpoInstallPayloadAdapter {
/**
* विषम एसडीके डेटा अभ्यावेदन (डिक्शनरी, JSON स्ट्रिंग, या कस्टम ऑब्जेक्ट) को सामान्य करता है
* सख्त फेल-क्लोज्ड टाइप चेकिंग के साथ एक एप्लिकेशन-स्वामित्व वाले कैननिकल मॉडल में।
*/
static func normalize(rawPayload: Any?) -> ValidatedRetargetingRoute? {
guard let payload = rawPayload else { nil }
if let dict = payload as? [String: Any] {
return normalizeDictionaryStrict(dict)
} else if let jsonString = payload as? String, let data = jsonString.data(using: .utf8) {
do {
if let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
return normalizeDictionaryStrict(dict)
}
} catch {
NSLog("[PayloadAdapter] JSON डीसेरिएलाइजेशन विफल रहा: %@", error.localizedDescription)
return nil
}
}
return nil
}
private static func normalizeDictionaryStrict(_ dict: [String: Any]) -> ValidatedRetargetingRoute? {
for (key, value) in dict {
guard value is String else {
NSLog("[PayloadAdapter] कुंजी के लिए नॉन-स्ट्रिंग मान अस्वीकृत: %@", key)
return nil
}
}
guard let scene = dict["scene"] as? String, !scene.isEmpty else {
return nil
}
let targetId = dict["item_id"] as? String ?? ""
let promoCode = dict["promo_code"] as? String ?? ""
let routeToken = dict["token"] as? String ?? ""
let keys = Set(dict.keys)
return ValidatedRetargetingRoute(
scene: scene,
targetId: targetId,
promoCode: promoCode,
routeToken: routeToken,
rawKeys: keys
)
}
}
class RetargetingRouteValidator {
private static let allowedKeys: Set<String> = ["scene", "item_id", "promo_code", "token"]
private static let allowedScenes: Set<String> = ["cart", "product_detail", "promo_hub"]
static func validate(payload: ValidatedRetargetingRoute) -> ValidatedRetargetingRoute? {
// चरण 1: फेल-क्लोज्ड कुंजी सत्यापन (अज्ञात पेलोड कुंजियों को अस्वीकार करें)
guard payload.rawKeys.isSubset(of: allowedKeys) else {
return nil
}
// चरण 2: सख्त अनुमति सूची के विरुद्ध सीन को मान्य करें
guard allowedScenes.contains(payload.scene) else {
return nil
}
// चरण 3: लक्ष्य पहचानकर्ता और प्रोमो कोड पर अल्फ़ान्यूमेरिक और लंबाई सीमाएं लागू करें
let validChars = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-")
if !payload.targetId.isEmpty {
guard payload.targetId.count <= 64, payload.targetId.rangeOfCharacter(from: validChars.inverted) == nil else {
return nil
}
}
if !payload.promoCode.isEmpty {
guard payload.promoCode.count <= 32, payload.promoCode.rangeOfCharacter(from: validChars.inverted) == nil else {
return nil
}
}
// चरण 4: रूट टोकन प्रारूप को मान्य करें
if !payload.routeToken.isEmpty {
guard payload.routeToken.count >= 16 && payload.routeToken.count <= 128,
payload.routeToken.rangeOfCharacter(from: validChars.inverted) == nil else {
return nil
}
}
return payload
}
}
class SceneDelegate: UIResponder, UIWindowSceneDelegate, OpoInstallDelegate {
var window: UIWindow?
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guard let _ = (scene as? UIWindowScene) else { nil }
// ओपोइंस्टॉल एसडीके प्रारंभ करें
OpoInstallSDK.initWith(self)
// यूनिवर्सल लिंक के माध्यम से कोल्ड लॉन्च संभालें
if let userActivity = connectionOptions.userActivities.first(where: { $0.activityType == NSUserActivityTypeBrowsingWeb }) {
OpoInstallSDK.continue(userActivity)
}
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
// यूनिवर्सल लिंक के माध्यम से वार्म रिज्यूमे संभालें
if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
OpoInstallSDK.continue(userActivity)
}
}
// ओपोइंस्टॉल डेलिगेट वेकअप कॉलबैक
func getWakeUpParams(_ appData: OpoInstallData?) {
guard let data = appData, let rawPayload = data.data else {
nil
}
// चरण 1: सख्त टाइप चेकिंग के साथ विक्रेता एसडीके पेलोड अभ्यावेदन को सामान्य करें
guard let canonicalPayload = OpoInstallPayloadAdapter.normalize(rawPayload: rawPayload),
let validatedRoute = RetargetingRouteValidator.validate(payload: canonicalPayload) else {
DispatchQueue.main.async {
self.executeLobbyFallback(reason: "विकृत या अनधिकृत रिटारगेटिंग पेलोड")
}
nil
}
// चरण 2: प्रमाणित ऐप सत्र का उपयोग करके सर्वर ऑथराइजेशन और संसाधन स्थिति को मान्य करें
BackendRouteAuthorizer.shared.verifyRouteAuthorization(scene: validatedRoute.scene, targetId: validatedRoute.targetId, token: validatedRoute.routeToken) { isAuthorized in
DispatchQueue.main.async {
if isAuthorized {
self.executeTargetNavigation(route: validatedRoute)
} else {
self.executeLobbyFallback(reason: "संसाधन समाप्त या अनधिकृत")
}
}
}
}
private func executeTargetNavigation(route: ValidatedRetargetingRoute) {
NSLog("[AppNavigator] रिटारगेटिंग सीन पर नेविगेट कर रहे हैं: %@", route.scene)
}
private func executeLobbyFallback(reason: String) {
NSLog("[AppNavigator] होम लॉबी में सुरक्षित फ़ॉलबैक: %@", reason)
}
}
// ऐप-विशिष्ट बैकएंड ऑथराइजेशन प्लेसहोल्डर (कोई ओपोइंस्टॉल एसडीके एपीआई नहीं)
class BackendRouteAuthorizer {
static let shared = BackendRouteAuthorizer()
func verifyRouteAuthorization(scene: String, targetId: String, token: String, completion: @escaping (Bool) -> Void) {
// फेल-क्लोज्ड प्लेसहोल्डर: लाइव बैकएंड ऑथराइजेशन एपीआई से कनेक्ट होना चाहिए।
// उत्पादन बैकएंड यूज़र सत्र, टोकन समाप्ति, कार्ट स्वामित्व और एकल-उपयोग आइडम्पोटेंसी को सत्यापित करता है।
let isAuthorized = false
completion(isAuthorized)
}
}
थ्रेड-सुरक्षित नेविगेशन निष्पादन: यूआई (UI) थ्रेड सुरक्षा का संरक्षण
सीन कॉलबैक यूआईकिट लाइफसाइकिल पर आते हैं; एसिंक्रोनस ऑथराइजेशन कॉलबैक को थ्रेड सुरक्षा बनाए रखने और विज़ुअल रेंडरिंग ग्लिच को रोकने के लिए यूआई (UI) म्यूटेशन को मुख्य अभिनेता या यूआई (UI) थ्रेड (स्विफ्ट में DispatchQueue.main.async, कोटलिन में runOnUiThread) पर वापस लाना चाहिए।
वेब से ऐप रिटारगेटिंग फनल और प्रदर्शन मापन मैट्रिक्स
वेब-टू-ऐप रिटारगेटिंग के लिए टेलीमेट्री गेट्स
रिटारगेटिंग कैंपेन प्रदर्शन का अनुभवजन्य मूल्यांकन करने के लिए, ग्रोथ टीमें चार प्राथमिक फनल मेट्रिक्स को ट्रैक करती हैं:
- बैनर क्लिक-थ्रू रेट (CTR): मोबाइल वेब पेज विजिटर्स का अनुपात जो डायनामिक स्मार्ट ऐप बैनर पर टैप करते हैं।
- क्लिक-टू-ऐप-ओपन रेट (CAOR): बैनर क्लिक का प्रतिशत जिसके परिणामस्वरूप सत्यापित नेटिव ऐप ओपन होता है।
- सीन बहाली सफलता दर: डीप-लिंक्ड ऐप सत्रों का प्रतिशत जो होम लॉबी पर फ़ॉलबैक किए बिना सफलतापूर्वक लक्ष्य सीन को मान्य और रेंडर करते हैं।
- डाउनस्ट्रीम कन्वर्जन रेट (CVR): रिटारगेट किए गए यूज़र्स का अनुपात जो एक परिभाषित एट्रिब्यूशन विंडो (उदाहरण के लिए, 24 घंटे) के भीतर एक मुख्य क्रिया (जैसे चेकआउट या पंजीकरण) पूरी करते हैं।
रिटेंशन कर्व्स का ऑडिट करना: रिटारगेट किए गए विजिटर्स के लिए नियंत्रित कोहोर्ट प्रयोग

पुन: जुड़ाव प्रभावकारिता का मूल्यांकन नियंत्रित प्रयोग के माध्यम से किया जाना चाहिए जो स्पष्ट रूप से इंटेंट-टू-ट्रीट (ITT) व्यावसायिक लिफ्ट को सशर्त पोस्ट-ओपन रिटेंशन से अलग करता है:
-
इंटेंट-टू-ट्रीट (ITT) एक्टिव-ऐप रेट (
): पोस्ट-ट्रीटमेंट कंडीशनिंग के बिना सभी पात्र वेब विजिटर्स में कारण लिफ्ट (causal lift) का मूल्यांकन करने के लिए, डेटा टीमें कॉन्टेक्स्टुअल बैनर के संपर्क में आने वाले रैंडमाइज्ड विजिटर कोहोर्ट की तुलना सामान्य बैनर या मानक वेब नेविगेशन के संपर्क में आने वाले रैंडमाइज्ड होल्डआउट समूह से करती हैं: -
सशर्त पोस्ट-ओपन रिटेंशन (
): वेब-टू-ऐप हैंडऑफ़ को सफलतापूर्वक पूरा करने वाले यूज़र्स के बीच ऐप स्टिकनेस का विश्लेषण करने के लिए, टीमें शुरुआती ऐप लॉन्च पर वातानुकूलित रिटेंशन की निगरानी करती हैं:
सशर्त रिटेंशन (
उदाहरण वेब-टू-ऐप रिटारगेटिंग चैनल मूल्यांकन मैट्रिक्स
नीचे दी गई तालिका तकनीकी क्षमताओं और परिचालन विशेषताओं के आधार पर प्राथमिक वेब-टू-ऐप बैनर दृष्टिकोणों की तुलना करती है:
| फनल आयाम | स्टेटिक वेब बैनर | नेटिव सफारी बैनर | डायनामिक रिटारगेटिंग बैनर (ओपोइंस्टॉल) |
|---|---|---|---|
| लक्ष्यीकरण परिशुद्धता | सामान्य (सभी यूज़र्स एक ही कॉपी देखते हैं) | फिक्स्ड ऐप स्टोर मेटाडेटा | डायनामिक (SKU, कार्ट, या श्रेणी विशिष्ट) |
| क्रॉस-प्लेटफॉर्म पहुंच | व्यापक वेब-ब्राउज़र रेंडरिंग | केवल समर्थित एप्पल प्लेटफॉर्म पर सफारी | व्यापक क्रॉस-ब्राउज़र (एंड्रॉइड, आईओएस, क्रोम, सफारी) |
| इन-ऐप हैंडऑफ़ लक्ष्य | डिफ़ॉल्ट होम लॉबी | डिफ़ॉल्ट होम या स्टेटिक तर्क | डीप-लिंक्ड लक्ष्य सीन (कार्ट, उत्पाद, प्रोमो) |
| बर्खास्तगी प्रबंधन | अप्रबंधित / बेसिक कुकी | सफारी-नियंत्रित दमन | डेवलपर-कॉन्फ़िगर कूल-डाउन विंडो |
| डाउनस्ट्रीम एंगेजमेंट | अनुभवजन्य (कोहोर्ट/चैनल प्रति मापें) | अनुभवजन्य (कोहोर्ट/चैनल प्रति मापें) | अनुभवजन्य (कोहोर्ट/चैनल प्रति मापें) |
अक्सर पूछे जाने वाले प्रश्न (FAQ)
डायनामिक स्मार्ट ऐप बैनर स्टेटिक स्मार्ट बैनर से कैसे भिन्न हैं?
यदि यूज़र ने ऐप इंस्टॉल नहीं किया है तो वेब-टू-ऐप रिटारगेटिंग संदर्भ को कैसे संरक्षित रखती है?
मैं वेब-टू-ऐप रिटारगेटिंग बैनर को संचयी लेआउट शिफ्ट (CLS) पैदा करने से कैसे रोकूं?
सारांश और निर्णय ढांचा
डायनामिक स्मार्ट ऐप बैनर के माध्यम से मोबाइल वेब विजिटर्स को रिटारगेट करना टॉप-ऑफ-फनल ब्राउजिंग ट्रैफ़िक और संरक्षित संदर्भ के साथ नेटिव ऐप अनुभवों के बीच की खाई को पाटता है। सामान्य होम स्क्रीन प्रॉम्प्ट या स्टेटिक स्टोर लिंक पर भरोसा करना मूल्यवान खरीदारी मंशा को त्याग देता है और अतिरिक्त कन्वर्जन घर्षण पेश कर सकता है जिसे अधिग्रहण दक्षता के मुकाबले मापा जाना चाहिए।
फर्स्ट-पार्टी वेब ब्राउजिंग संकेतों को कैप्चर करके, व्यक्तिगत एचटीएमएल बैनर रेंडर करके, और नेटिव व्यू कंट्रोलर में सत्यापित डीप-लिंक हैंडऑफ़ को निष्पादित करके, इंजीनियरिंग और ग्रोथ टीमें कन्वर्जन घर्षण को कम करती हैं और निरंतर ऐप एंगेजमेंट का समर्थन करती हैं। डाउनस्ट्रीम रिटेंशन लाभ और कैंपेन आरओआई (ROI) को नियंत्रित कोहोर्ट प्रयोगों के माध्यम से अनुभवजन्य रूप से मान्य किया जाना चाहिए।
क्रॉस-प्लेटफॉर्म वेब बैनर एकीकरण और डायनामिक डीप लिंकिंग आर्किटेक्चर का पता लगाने के लिए, एसडीके एकीकरण डॉक्यूमेंटेशन से परामर्श करें।
संबंधित सामग्री
-
अवधारणाएं: ऐप एंगेजमेंट, वेब टू ऐप रीडायरेक्शन, डायनामिक स्मार्ट ऐप बैनर, सीन रेस्टोरेशन, रिटारगेटिंग फनल
-
प्रौद्योगिकियां: यूनिवर्सल लिंक, एंड्रॉइड ऐप लिंक, डिफर्ड डीप लिंकिंग, W3C वेब स्टोरेज
-
मानक: IETF RFC 3986 यूनिफॉर्म रिसोर्स आइडेंटिफायर, एप्पल एसोसिएटेड डोमेन विनिर्देश, एंड्रॉइड डिजिटल एसेट लिंक्स प्रोटोकॉल, ओवासप (OWASP) मोबाइल एप्लिकेशन सिक्योरिटी टेस्टिंग गाइड (MASTG)
-
एपीआई / एकीकरण पैटर्न: वेब-टू-ऐप डीप-लिंकिंग एकीकरण पैटर्न, एंड्रॉइड
getIntent, आईओएसUIWindowSceneDelegate -
आधिकारिक डॉक्यूमेंटेशन और संदर्भ:
Share this article



