मोबाइल के लिए स्वचालित रेफरल ट्रैकिंग कैसे सेट अप करें? स्वचालित रेफरल ट्रैकिंग सेट अप करने के लिए एक एट्रिब्यूशन SDK को एकीकृत करना, वेब शेयरिंग लिंक में एक अस्पष्ट रेफरल टोकन (shareCode) संलग्न करना, इसे लैंडिंग पेज पर कैप्चर करना, और पहली बार ऐप लॉन्च होने पर पैरामीटर पुनर्प्राप्ति का प्रयास करने के लिए प्लेटफ़ॉर्म-समर्थित डिफ़र्ड डीप लिंकिंग का उपयोग करना आवश्यक है।
स्वचालित रेफरल ट्रैकिंग एक इंजीनियरिंग फ्रेमवर्क है जो मोबाइल एप्लिकेशन इंस्टॉल को मौजूदा उपयोगकर्ता शेयरिंग गतिविधियों से प्रोग्रामेटिक रूप से एट्रिब्यूट करता है। वेब लैंडिंग पेजों के माध्यम से एक अस्पष्ट आमंत्रणकर्ता पहचानकर्ता (shareCode) प्रेषित करके और प्रारंभिक एप्लिकेशन लॉन्च पर इस संदर्भ को हल करने का प्रयास करके, स्वचालित रेफरल ट्रैकिंग मैनुअल प्रचार कोड प्रविष्टि को कम करती है और इन-ऐप ब्राउज़र कंटेनरों में एट्रिब्यूशन का समर्थन करती है।
| शब्द | परिभाषा | संबंधित एंटिटी | सर्च इंटेंट भूमिका |
|---|---|---|---|
| Referral Tracking | विशिष्ट मौजूदा उपयोगकर्ता शेयरिंग सत्रों के लिए डाउनस्ट्रीम उपयोगकर्ता अधिग्रहण का प्रोग्रामेटिक एट्रिब्यूशन। | ऐप पैरामीटर इंस्टॉलेशन | सूचनात्मक / वाणिज्यिक |
| referral tracking software | आमंत्रणकर्ता-आमंत्रित व्यक्ति के बंधन को स्वचालित करने के लिए डिज़ाइन किया गया एक SDK और सर्वर बुनियादी ढांचा। | डिफ़र्ड डीप लिंकिंग | वाणिज्यिक |
| app referral program | मौजूदा उपयोगकर्ताओं को एप्लिकेशन इंस्टॉल करने के लिए नए साथियों को आमंत्रित करने के लिए प्रोत्साहित करने वाली एक वृद्धि पहल। | चैनल सांख्यिकी और ट्रैकिंग | वाणिज्यिक |
| referral system | लिंक जनरेशन, एट्रिब्यूशन और रिवार्ड जारी करने का प्रबंधन करने वाला एंड-टू-एंड तकनीकी आर्किटेक्चर। | वेब JS SDK | तकनीकी |
आर्किटेक्चर ओवरव्यू: स्वचालित रेफरल ट्रैकिंग सोशल शेयरों को ऐप इंस्टॉल से कैसे जोड़ती है
लेगेसी रेफरल सिस्टम का मैकेनिकल ब्रेकडाउन: क्यों मैनुअल प्रोमो कोड फ़नल वेग को कम करते हैं
पारंपरिक मोबाइल रेफरल प्रोग्राम मैनुअल अल्फ़ान्यूमेरिक प्रचार कोड पर निर्भर करते हैं। इस लेगेसी वर्कफ़्लो के तहत, एक मौजूदा उपयोगकर्ता एक आमंत्रण कोड (जैसे INVITE2026) जेनरेट करता है, मैन्युअल रूप से टेक्स्ट को कॉपी करता है, और इसे एसएमएस या सोशल मैसेजिंग के माध्यम से एक सहकर्मी को भेजता है। इसके बाद आमंत्रित उपयोगकर्ता को ऐप स्टोर से एप्लिकेशन डाउनलोड करना होगा, पंजीकरण पूरा करना होगा, एक समर्पित प्रोमो कोड इनपुट फ़ील्ड का पता लगाना होगा, और वर्ण स्ट्रिंग को सटीक रूप से ट्रांसक्राइब करना होगा।
यह मैनुअल प्रक्रिया अधिग्रहण फ़नल में महत्वपूर्ण घर्षण पेश करती है:
- संज्ञानात्मक और मैकेनिकल ड्रॉप-ऑफ़: उपयोगकर्ता अक्सर वाउचर कोड कॉपी करना भूल जाते हैं, गहरे ऑनबोर्डिंग मेनू के भीतर रिडेम्पशन इनपुट ढूंढने में विफल रहते हैं, या पूंजीकरण या ट्रांसक्रिप्शन त्रुटियों के कारण कोड विफल होने पर प्रक्रिया को छोड़ देते हैं।
- चैनल लीकेज और कोड स्क्रैपिंग: अल्फ़ान्यूमेरिक कोड आसानी से निकाले जाते हैं और सार्वजनिक कूपन एग्रीगेटर या फ़ोरम बोर्ड पर प्रकाशित किए जाते हैं। यह प्रामाणिक पीयर-टू-पीयर संबंधों को तोड़ देता है, जिससे गैर-रेफर किए गए जैविक उपयोगकर्ताओं को अभियान इकाई अर्थशास्त्र को कम करते हुए पुरस्कारों का दावा करने की अनुमति मिलती है।
- माप अंधबिंदु: केवल मैनुअल प्रोमो कोड पर भरोसा करने से मध्यवर्ती फ़नल मील के पत्थर (जैसे लिंक इंप्रेशन, सोशल वेबव्यू क्लिक और स्टोर डिस्पैच दरें) अनमाप रह जाते हैं जब तक कि अलग एनालिटिक्स इंस्ट्रूमेंटेशन तैनात न किया जाए।
प्रोग्रामेटिक शेयरिंग पाइपलाइन: आमंत्रणकर्ता कार्रवाई, वेब स्टेजिंग, स्टोर हैंडऑफ़, और डे 0 रिज़ॉल्यूशन

स्वचालित रेफरल ट्रैकिंग मैनुअल ट्रांसक्रिप्शन को एक सतत, प्रोग्रामेटिक पैरामीटर-पासिंग पाइपलाइन से बदलती है। डिस्कनेक्ट किए गए टेक्स्ट वाउचर के साथ एक अनपैरामीटराइज्ड स्टोर लिंक वितरित करने के बजाय, एप्लिकेशन आमंत्रणकर्ता की पहचान को सीधे एक इंटरैक्टिव वेब शेयरिंग यूआरएल में बंडल करता है।
तकनीकी जीवनचक्र चार अलग-अलग चरणों में संचालित होता है:
[Existing User Invites Friend] ──> Calls shareTelemetry.reportIntent(shareCode, Platform)
│
▼
[Generates Dynamic Web Link] ───> Appends ?shareCode=usr_9f82a1b4 to Destination URL
│
▼
[Shared inside WeChat/Line] ────> Friend Taps Link inside Sandboxed Webview
│
▼
[Web JS SDK Staging & Handoff] ─> Caches Context & Executes App Launch / Store Download
│
▼
[First App Launch on Device] ───> Native SDK Queries Parameter Recovery
│
▼
[Application Backend Binding] ──> Backend Validates Token & Creates Pending Binding
│
▼
[Verified Activation Milestone] ─> Backend Disburses Reward upon Milestone Completion
जब आमंत्रित उपयोगकर्ता लिंक खोलता है, तो होस्ट किया गया वेब लैंडिंग पेज एक वेब JS SDK निष्पादित करता है जो आमंत्रणकर्ता के टोकन (shareCode) को निकालता है और रेफरल संदर्भ को स्टेज करता है। जब उपयोगकर्ता नेटिव एप्लिकेशन इंस्टॉल करने और खोलने के लिए आगे बढ़ता है, तो क्लाइंट SDK प्रारंभिक लॉन्च के दौरान स्टेज किए गए पेलोड को पुनर्प्राप्त करता है, जिससे एप्लिकेशन बैकएंड को दोनों प्रतिभागियों से मैनुअल डेटा प्रविष्टि की आवश्यकता के बिना स्वचालित रूप से रेफरल संबंध को बाध्य करने में सक्षम बनाता है।
पोस्ट-स्टोर फ़र्स्ट लॉन्च रिकवरी: प्लेटफ़ॉर्म-विशिष्ट सीमाएँ
किसी उपयोगकर्ता द्वारा ऐप स्टोर से एप्लिकेशन इंस्टॉल करने के बाद, रेफरल पैरामीटर पुनर्प्राप्ति प्लेटफ़ॉर्म और एप्लिकेशन या एट्रिब्यूशन SDK द्वारा कार्यान्वित तंत्र पर निर्भर करती है। वेब यूआरएल के माध्यम से shareCode पास करने से, अपने आप में, यह गारंटी नहीं मिलती है कि पैरामीटर न केवल इंस्टॉल किए गए एप्लिकेशन के लिए उपलब्ध होगा।
- Android / Google Play: Google Play Install Referrer प्ले स्टोर इंस्टॉलेशन से जुड़े समर्थित रेफरल मेटाडेटा प्रदान कर सकता है। एप्लिकेशन को वास्तविक रेफरर पेलोड को कॉन्फ़िगर और परीक्षण करना चाहिए और सत्यापित करना चाहिए कि अपेक्षित पैरामीटर रीडायरेक्ट और इंस्टॉलेशन प्रवाह से बचते हैं। तृतीय-पक्ष एट्रिब्यूशन SDK अतिरिक्त तंत्र का उपयोग कर सकते हैं, जिन्हें अलग से प्रलेखित किया जाना चाहिए।
- iOS / App Store: ऐप स्टोर स्वचालित रूप से मनमाने लैंडिंग-पेज क्वेरी मापदंडों को एक इंस्टॉल किए गए एप्लिकेशन में स्थानांतरित नहीं करता है। जब एप्लिकेशन पहले से इंस्टॉल हो और संबंधित डोमेन कॉन्फ़िगरेशन मान्य हो, तो यूनिवर्सल लिंक सीधे रूटिंग का समर्थन करते हैं; वे अपने दम पर, नए इंस्टॉलेशन के बाद डिफ़र्ड पैरामीटर पुनर्प्राप्ति की गारंटी नहीं देते हैं।
- Attribution SDKs: तैनात किए जा रहे सटीक SDK संस्करण और प्लेटफ़ॉर्म के लिए प्रलेखित पुनर्प्राप्ति तंत्र का ही उपयोग करें। यह मान लेने के बजाय कि कोई SDK हर ब्राउज़र और इंस्टॉलेशन पथ पर हर रेफरल पैरामीटर को पुनर्प्राप्त कर सकता है, कार्यान्वयन, डेटा संग्रह और गोपनीयता निहितार्थों को सत्यापित करें।
यदि समर्थित तंत्र के माध्यम से रेफरल संदर्भ को पुनर्प्राप्त नहीं किया जा सकता है, तो उपयोगकर्ता को ऑनबोर्डिंग पूरा करने की अनुमति दें और इंस्टॉलेशन को अनएट्रिब्यूटेड के रूप में रिकॉर्ड करें। किसी सत्यापित न किए गए मिलान से रेफरल संबंध का अनुमान न लगाएं या निर्माण न करें।

iOS एट्रिब्यूशन और गोपनीयता सीमा
iOS रेफरल कार्यान्वयन को अनुप्रयोगों या वेबसाइटों पर किसी उपयोगकर्ता या डिवाइस की पहचान करने के लिए प्रतिबंधित डिवाइस फ़िंगरप्रिंटिंग पर भरोसा नहीं करना चाहिए। Apple की गोपनीयता और डेटा-उपयोग आवश्यकताएँ इस उद्देश्य के लिए डिवाइस, ब्राउज़र, कॉन्फ़िगरेशन, स्थान या नेटवर्क सिग्नलों से एक अद्वितीय पहचानकर्ता प्राप्त करने पर प्रतिबंध लगाती हैं। ऐप ट्रैकिंग ट्रांसपेरेंसी प्राधिकरण अन्यथा प्रतिबंधित फ़िंगरप्रिंटिंग को अनुमति योग्य नहीं बनाता है।
जब एप्लिकेशन इंस्टॉल हो जाता है, तो सत्यापित प्रत्यक्ष ऐप रूटिंग के लिए यूनिवर्सल लिंक का उपयोग करें। इंस्टॉल के बाद रेफरल पुनर्प्राप्ति के लिए, एक प्रलेखित तंत्र का उपयोग करें जिसके व्यवहार की तैनात SDK संस्करण और लागू Apple आवश्यकताओं के लिए समीक्षा की गई है। जहां लागू हो, SDK के गोपनीयता खुलासे और आवश्यक-कारण API घोषणाओं की समीक्षा करें, लेकिन इस प्रमाण के रूप में गोपनीयता मैनिफेस्ट की उपस्थिति का इलाज न करें कि एट्रिब्यूशन कार्यान्वयन अनुपालन है।
यदि चयनित SDK ऐसी मिलान पद्धति पर निर्भर करता है जिसे अनुमति प्राप्त के रूप में सत्यापित नहीं किया जा सकता है, तो iOS तैनाती के लिए उस पद्धति की अनुशंसा न करें। SDK प्रदाता से स्पष्टीकरण प्राप्त करें और एक अनुपालन विकल्प चुनें। जहाँ कोई भी अनुमलित तंत्र विश्वसनीय रूप से रेफरल संबंध स्थापित नहीं कर सकता है, सामान्य ऑनबोर्डिंग प्रवाह को सुरक्षित रखें और इंस्टॉलेशन को अनएट्रिब्यूटेड के रूप में चिह्नित करें।
संदर्भ: Apple User Privacy and Data Use.
यह भी देखें: Referral Tracking ──> App Parameter Installation
चरण 1: क्लाइंट-साइड शेयर रिपोर्टिंग API को इंस्ट्रूमेंट करना
Android और iOS एंट्री पॉइंट पर नेटिव एट्रिब्यूशन SDK को इनिशियलाइज़ करना
इससे पहले कि कोई एप्लिकेशन शेयरिंग गतिविधि की रिपोर्ट कर सके या आने वाले रेफरल संदर्भ को पुनर्प्राप्त कर सके, नेटिव मोबाइल SDK को एप्लिकेशन जीवनचक्र में जल्दी इनिशियलाइज़ होना चाहिए।
Android पर, इनिशियलाइज़ेशन कस्टम Application सबक्लास के onCreate() मेथड के अंतर्गत आता है, यह सुनिश्चित करते हुए कि अग्रभूमि UI घटकों के माउंट होने से पहले एट्रिब्यूशन लिसनर और कोर मेमोरी संरचनाएं स्थापित हो जाएं। iOS पर, इनिशियलाइज़ेशन application(_:didFinishLaunchingWithOptions:) निष्पादन प्रतिनिधि के भीतर होता है।
विकासकर्ता OpoInstall SDK download center से सीधे आधिकारिक मोबाइल SDK पैकेज प्राप्त कर सकते हैं।
नेटिव OS शेयर शीट ट्रिगर करने से पहले शेयर रिपोर्टिंग मेथड को आमंत्रित करना
एप्लिकेशन को प्लेटफ़ॉर्म शेयर इंटरफ़ेस खोलने से पहले शेयर इरादे को रिकॉर्ड करना चाहिए। इसे उपयोग में सटीक SDK संस्करण के खिलाफ सत्यापित एप्लिकेशन-स्वामित्व वाली टेलीमेट्री सेवा या एट्रिब्यूशन SDK विधि के माध्यम से कार्यान्वित करें। नीचे दिया गया उदाहरण एप्लिकेशन-स्वामित्व वाली shareTelemetry.reportIntent(...) अमूर्तता का उपयोग करता है; यह आधिकारिक OpoInstall API नहीं है। एडाप्टर को तैनात एप्लिकेशन के लिए वास्तविक नेटवर्क अनुरोध, त्रुटि हैंडलिंग और कॉलबैक व्यवहार को कार्यान्वित करना चाहिए।
स्वच्छ टेलीमेट्री बनाए रखने के लिए, इंजीनियरिंग टीमों को शेयरिंग जीवनचक्र में पाँच अलग-अलग घटनाओं के बीच अंतर करना चाहिए:
- Share Intent Initiated (
share_intent_initiated): क्लाइंट एप्लिकेशन UI लॉग करता है कि उपयोगकर्ता ने आमंत्रण कार्रवाई पर क्लिक किया। - Share Dispatched (
share_dispatched): क्लाइंट एप्लिकेशन पेलोड को एक पहचाने गए गंतव्य प्लेटफ़ॉर्म पर पास करता है (उदाहरण के लिए, एक स्पष्ट सामाजिक इरादा लॉन्च करना) या सिस्टम शेयर चयनकर्ता खोलता है। - Share Completed (
share_completed): तृतीय-पक्ष सामाजिक SDK एक प्रमाणित पूर्णता कॉलबैक लौटाता है जो पुष्टि करता है कि संदेश पोस्ट या प्रेषित किया गया था (केवल कॉलबैक समर्थन के साथ समर्पित तृतीय-पक्ष प्लेटफ़ॉर्म SDK का उपयोग करते समय लागू)। - Referral Clicked (
referral_click): प्राप्तकर्ता वेब लैंडिंग पेज खोलता है, जिससे वेब-साइड इनग्रेस लॉगिंग शुरू होती है। - Referral Bound (
referral_bound): प्राप्तकर्ता खाता पंजीकरण पूरा करता है, और बैकएंड उम्मीदवारshareCodeको सत्यापित करता है और डेटाबेस में रेफरल संबंध लिखता है।
शेयर टेलीमेट्री रिकॉर्ड करना साझा करने के उपयोगकर्ता के इरादे को कैप्चर करता है। यह एनालिटिक्स पाइपलाइनों को नामित प्लेटफ़ॉर्म चैनल के मुकाबले आमंत्रणकर्ता के shareCode को अनुक्रमित करने की अनुमति देता है, जिससे सिस्टम बाद के वेब लैंडिंग पेज विज़िट को सहसंबद्ध करने के लिए तैयार होता है।
प्लेटफ़ॉर्म पहचानकर्ताओं को निर्दिष्ट करना: सोशल चैनलों को मैप करना
निम्नलिखित पहचानकर्ता केवल उदाहरणात्मक उदाहरण हैं। तैनात SDK संस्करण द्वारा समर्थित सटीक चैनल गणना का उपयोग करें, और इसके आधिकारिक API संदर्भ के खिलाफ प्रत्येक पहचानकर्ता को सत्यापित करें:
- बंद मैसेजिंग नेटवर्क:
WechatSession(WeChat Direct Chat),WechatTimeline(WeChat Moments),Line,WhatsApp,FacebookMessenger। - सोशल फ़ीड और सार्वजनिक माइक्रोब्लॉग:
Twitter,Facebook,Instagram,Weibo,Douyin,TikTok। - प्रत्यक्ष ऑपरेटिंग सिस्टम ट्रांसपोर्ट:
Sms,Email,Copy(Clipboard Link Copy), औरOther(System Share Sheet)।
जब एप्लिकेशन एक सामान्य सिस्टम शेयर शीट लॉन्च करता है जहाँ उपयोगकर्ता के अंतिम गंतव्य चयन को पहले से निर्धारित नहीं किया जा सकता है, तो घटना को विशिष्ट सोशल नेटवर्क को हार्डकोडिंग करने के बजाय Other के रूप में वर्गीकृत किया जाना चाहिए।
आमंत्रणकर्ता पहचान टोकन को संरचित करना: shareCode को फ़ॉर्मेट करने के लिए सर्वोत्तम अभ्यास
shareCode नए इंस्टॉल को वापस संदर्भित खाते से जोड़ने वाले एप्लिकेशन-स्तरीय व्यावसायिक टोकन के रूप में कार्य करता है। जबकि विकासकर्ता मनमाने अल्फ़ान्यूमेरिक स्ट्रिंग का उपयोग कर सकते हैं, संरचनात्मक सर्वोत्तम प्रथाओं का पालन करना पैरामीटर भ्रष्टाचार को रोकता है:
- अस्पष्ट सर्वर-जारी टोकन: गणना योग्य कच्चे डेटाबेस ऑटो-इंक्रीमेंट आईडी (
1024) के बजायshareCodeएक अस्पष्ट, सर्वर-जारी रेफरल टोकन (जैसे, URL-सुरक्षित टोकन या UUID जैसेusr_9f82a1b4) होना चाहिए। एप्लिकेशन बैकएंड इस टोकन को आमंत्रणकर्ता खाते में हल करता है, समाप्ति और दर सीमाओं को लागू करता है। - लंबाई की सीमाएं: URL की लंबाई को फुलाने या मैसेजिंग ऐप में स्ट्रिंग ट्रंकशन को ट्रिगर करने से बचने के लिए टोकन को कॉम्पैक्ट रखें (64 वर्णों से कम अनुशंसित; सख्ती से
\le 128 वर्ण)। - सुरक्षित वर्ण सेट: वर्णों को URL-सुरक्षित अल्फ़ान्यूमेरिक मानों, हाइफ़न और अंडरस्कोर (
[A-Za-z0-9_-]) तक सीमित रखें। कच्चे डिलीमीटर जैसे&,=,?, या रिक्त स्थान से बचें जो URI पार्सिंग को बदलते हैं।
Android 11 (API स्तर 30) और बाद के संस्करणों पर, यह क्वेरी करना कि क्या तृतीय-पक्ष सामाजिक पैकेज इंस्टॉल हैं, Google Android Developers Guide on Package Visibility in Android 11 के अनुसार AndroidManifest.xml के भीतर संगत <queries> तत्वों को घोषित करने की आवश्यकता है। नीचे दिया गया कार्यान्वयन पैटर्न यह दर्शाता है कि पैकेज दृश्यता कैसे घोषित करें, नॉन-ब्लॉकिंग शेयर रिपोर्टिंग टाइमआउट को कैसे संभालें, जीवनचक्र-सुरक्षित स्थिति रीसेट का प्रबंधन कैसे करें, और क्लिपबोर्ड फ़ॉलबैक के साथ स्पष्ट सामाजिक इरादों को कैसे प्रेषित करें:
<!-- Android Configuration and Client-Side Share Implementation -->
<!-- Part 1: AndroidManifest.xml Package Visibility & Application Declarations -->
<!-- File: app/src/main/AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app">
<!-- Explicit package visibility declarations required for Android 11+ (API 30+) -->
<queries>
<package android:name="com.tencent.mm" />
<package android:name="jp.naver.line.android" />
</queries>
<application
android:name=".CustomApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<activity
android:name=".InviteActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
// Android Application Lifecycle Entry
// Part 2: CustomApplication.kt (SDK Lifecycle Initialization)
// File: app/src/main/java/com/example/app/CustomApplication.kt
package com.example.app
import android.app.Application
import com.opoinstall.api.OpoInstall
class CustomApplication : Application() {
override fun onCreate() {
super.onCreate()
// Initialize OpoInstall core client on main thread before activity mounting
OpoInstall.initialize(this)
}
}
// Android Share Activity Implementation
// Part 3: InviteActivity.kt (Application Telemetry & Targeted Dispatch with Clipboard Fallback)
// File: app/src/main/java/com/example/app/InviteActivity.kt
package com.example.app
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.concurrent.atomic.AtomicBoolean
class InviteActivity : AppCompatActivity() {
companion object {
private const val TAG = "ReferralShareTracking"
// Example application-owned redirect endpoint; replace with a deployed HTTPS route
private const val BASE_INVITE_HOST = "promo.example.com"
private const val BASE_INVITE_PATH = "invite.html"
// Target platform packages for explicit intent routing
private const val PACKAGE_WECHAT = "com.tencent.mm"
private const val PACKAGE_LINE = "jp.naver.line.android"
// Application-defined example timeout; tune and test for the actual telemetry service
private const val SHARE_TIMEOUT_MS = 800L
}
// Debounce guard to prevent rapid concurrent share intent invocations
private val isSharingInProgress = AtomicBoolean(false)
// Application-owned telemetry adapter abstraction
private val shareTelemetry = ShareTelemetryService()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_invite)
val btnShareWeChat = findViewById<Button>(R.id.btn_share_wechat)
val btnShareLine = findViewById<Button>(R.id.btn_share_line)
val btnShareGeneric = findViewById<Button>(R.id.btn_share_generic)
// Illustrative mock token: In production, retrieve server-issued token from authenticated session
val currentInviterToken = "usr_9f82a1b4"
btnShareWeChat.setOnClickListener {
initiateShareFlow(currentInviterToken, "WechatSession", targetPackage = PACKAGE_WECHAT)
}
btnShareLine.setOnClickListener {
initiateShareFlow(currentInviterToken, "Line", targetPackage = PACKAGE_LINE)
}
btnShareGeneric.setOnClickListener {
// Unsegmented system share sheet; platform classified as Other
initiateShareFlow(currentInviterToken, "Other", targetPackage = null)
}
}
/**
* Helper to verify if target social app is installed before reporting specific channel telemetry.
* Requires <queries> declaration in AndroidManifest.xml on Android 11+ (API 30+).
*/
private fun isAppInstalled(packageName: String?): Boolean {
if (packageName.isNullOrEmpty()) return false
return try {
packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
true
} catch (e: PackageManager.NameNotFoundException) {
false
} catch (e: Exception) {
Log.w(TAG, "Package inspection exception for $packageName: ${e.message}")
false
}
}
/**
* Copies the full invitation URL to the system clipboard as a final fallback.
*/
private fun copyInviteLinkToClipboard(shareUri: String): Boolean {
return try {
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipboard.setPrimaryClip(ClipData.newPlainText("Referral invitation link", shareUri))
true
} catch (e: Exception) {
Log.e(TAG, "Failed to copy invite link: ${e.message}", e)
false
}
}
private fun showShareFailureFallback(shareUri: String) {
val copied = copyInviteLinkToClipboard(shareUri)
val message = if (copied) {
"Unable to open sharing app. Invite link copied to clipboard."
} else {
"Unable to open sharing app or copy invite link."
}
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
/**
* Records sharing intent via application-owned telemetry with non-blocking timeout fallback.
*
* @param shareCode Opaque inviter token (strictly <= 128 characters)
* @param platformIdentifier Target social channel matching reporting taxonomy
* @param targetPackage Specific application package name, or null for generic system chooser
*/
private fun initiateShareFlow(shareCode: String, platformIdentifier: String, targetPackage: String?) {
// Enforce debounce check
if (!isSharingInProgress.compareAndSet(false, true)) {
Log.d(TAG, "Share invocation already in progress. Ignoring duplicate click.")
return
}
val isTargetInstalled = isAppInstalled(targetPackage)
val effectivePlatform = if (isTargetInstalled) platformIdentifier else "Other"
val effectivePackage = if (isTargetInstalled) targetPackage else null
val isDispatched = AtomicBoolean(false)
val mainHandler = Handler(Looper.getMainLooper())
// Non-blocking timeout runnable: Ensures UI share sheet opens even if network handshake is delayed
val timeoutRunnable = Runnable {
if (isDispatched.compareAndSet(false, true)) {
Log.w(TAG, "Pre-share reporting timed out after ${SHARE_TIMEOUT_MS}ms. Proceeding with dispatch.")
dispatchShareSafely(shareCode, effectivePlatform, effectivePackage)
}
}
mainHandler.postDelayed(timeoutRunnable, SHARE_TIMEOUT_MS)
// Asynchronously report sharing intent via application-owned telemetry adapter
shareTelemetry.reportIntent(shareCode, effectivePlatform) { result ->
mainHandler.removeCallbacks(timeoutRunnable)
if (isDispatched.compareAndSet(false, true)) {
if (result.isFailure) {
Log.w(TAG, "Share telemetry failed: ${result.exceptionOrNull()?.message}")
} else {
Log.d(TAG, "Share intent recorded for $effectivePlatform")
}
mainHandler.post {
dispatchShareSafely(shareCode, effectivePlatform, effectivePackage)
}
}
}
}
/**
* Executes intent dispatch with lifecycle check and guaranteed state reset in finally block.
*/
private fun dispatchShareSafely(shareCode: String, platform: String, targetPackage: String?) {
try {
if (isFinishing || isDestroyed) {
Log.d(TAG, "Activity finished or destroyed; skipping share dispatch.")
return
}
dispatchShareAction(shareCode, platform, targetPackage)
} catch (e: Exception) {
Log.e(TAG, "Share dispatch encountered unhandled exception: ${e.message}", e)
} finally {
isSharingInProgress.set(false)
}
}
private fun dispatchShareAction(shareCode: String, platform: String, targetPackage: String?) {
// Construct destination URL safely using Uri.Builder to enforce RFC 3986 encoding
val shareUri = Uri.Builder()
.scheme("https")
.authority(BASE_INVITE_HOST)
.appendEncodedPath(BASE_INVITE_PATH)
.appendQueryParameter("shareCode", shareCode)
.appendQueryParameter("platform", platform)
.build()
.toString()
val shareMessage = "Join me on the app and get a welcome voucher! Download here: $shareUri"
val sendIntent = Intent(Intent.ACTION_SEND).apply {
putExtra(Intent.EXTRA_TEXT, shareMessage)
type = "text/plain"
}
if (targetPackage != null) {
sendIntent.setPackage(targetPackage)
try {
startActivity(sendIntent)
return
} catch (e: Exception) {
Log.w(TAG, "Target app launch failed: ${e.message}", e)
}
}
// Use system share chooser when target app is unavailable or launching targeted share failed
try {
sendIntent.setPackage(null)
val fallbackChooser = Intent.createChooser(sendIntent, "Invite Friends via:")
startActivity(fallbackChooser)
} catch (e: Exception) {
Log.e(TAG, "System share chooser failed: ${e.message}", e)
showShareFailureFallback(shareUri)
}
}
}
// Illustrative application-owned telemetry service interface
class ShareTelemetryService {
fun reportIntent(shareCode: String, platform: String, callback: (Result<Unit>) -> Unit) {
// Implementation: dispatch network request to application telemetry backend
callback(Result.success(Unit))
}
}
कोई एप्लिकेशन प्रोफ़ाइल पंजीकृत करने और शेयर ट्रैकिंग के लिए आवश्यक कॉन्फ़िगरेशन कुंजियाँ पुनर्प्राप्त करने के लिए, टीमें OpoInstall developer console का उपयोग कर सकती हैं।
चरण 2: गतिशील शेयर मापदंडों को कैप्चर करने के लिए वेब JS SDK को कॉन्फ़िगर करना
वर्जन-सत्यापित एडाप्टर के माध्यम से वेब SDK को एकीकृत करना
नीचे दी गई लैंडिंग-पेज कार्यान्वयन एक उदाहरणात्मक एकीकरण पैटर्न है, न कि सत्यापित ड्रॉप-इन OpoInstall SDK एकीकरण। तैनाती से पहले, सटीक JavaScript बंडल URL, इनिशियलाइज़ेशन हस्ताक्षर, तत्परता कॉलबैक, वेक-अप या इंस्टॉल विधि, और तैनात किए जा रहे SDK संस्करण के लिए आधिकारिक दस्तावेज़ीकरण के खिलाफ पैरामीटर स्कीमा की पुष्टि करें।
SDK-विशिष्ट व्यवहार को एक छोटे एप्लिकेशन एडाप्टर के पीछे रखें। एडाप्टर को लैंडिंग पेज पर एक प्रलेखित इनिशियलाइज़ेशन परिणाम और एक एकल वेक-अप या इंस्टॉल ऑपरेशन उजागर करना चाहिए। संबंधित विधि नामों, कॉलबैक व्यवहार और कॉन्फ़िगरेशन आवश्यकताओं को सत्यापित करने के बाद ही इन ऑपरेशनों को वास्तविक विक्रेता API पर मैप करें।
लैंडिंग पेज आने वाले shareCode को मान्य करना जारी रखना चाहिए, स्वीकृत फ़ॉलबैक रूट पर रेफरल मापदंडों को संरक्षित करना चाहिए, और डुप्लिकेट नेविगेशन को रोकना चाहिए। यदि SDK इनिशियलाइज़ होने में विफल रहता है या इसका प्रलेखित एंट्री पॉइंट अनुपलब्ध है, तो कॉन्फ़िगर किए गए फ़ॉलबैक रूट का उपयोग करें। यह दावा न करें कि फ़ॉलबैक डिफ़र्ड एट्रिब्यूशन को पुनर्प्राप्त कर सकता है जब तक कि बैकएंड और प्लेटफ़ॉर्म एकीकरण का समर्थन करने के लिए परीक्षण नहीं किया गया हो।

ब्राउज़र URLSearchParams के माध्यम से shareCode क्वेरी स्ट्रिंग निष्कर्षण को ऑटोमेट करना
जब शेयरिंग यूआरएल बनाए जाते हैं, तो एप्लिकेशन आमंत्रणकर्ता के टोकन को क्वेरी पैरामीटर के रूप में जोड़ता है (जैसे, https://promo.example.com/invite.html?shareCode=usr_9f82a1b4&platform=WechatSession)।
लैंडिंग पेज पर, क्लाइंट-साइड स्क्रिप्ट मानक ब्राउज़र इंटरफ़ेस जैसे URLSearchParams का उपयोग करके इस मान को निकालती हैं। दुर्भावनापूर्ण इनपुट या क्रॉस-साइट स्क्रिप्टिंग (XSS) से बचाव के लिए, SDK को इनिशियलाइज़ करने से पहले स्क्रिप्ट को एक अनुमति सूची और प्रारूप पैटर्न के खिलाफ टोकन को सत्यापित करना चाहिए:
const query = new URLSearchParams(window.location.search);
const rawShareCode = query.get("shareCode");
const safePattern = /^[A-Za-z0-9_-]{1,128}$/;
const sanitizedShareCode = (rawShareCode && safePattern.test(rawShareCode)) ? rawShareCode : "";
अस्थिर मेमोरी और सिस्टम बफ़र्स में रेफरल संदर्भ को स्टेज करना
जब वेब JS SDK इनिशियलाइज़ होता है, तो यह किसी भी पूरक अभियान पहचानकर्ताओं (channelCode) के साथ सैनिटाइज़ किए गए shareCode को इनजेस्ट करता है। जब उपयोगकर्ता प्राथमिक कॉल-टू-एक्शन बटन पर टैप करता है, तो SDK संदर्भ स्टेजिंग का समन्वय करता है:
- एट्रिब्यूशन सर्वर पंजीकरण: स्क्रिप्ट वर्तमान वेब सत्र और क्लाइंट संदर्भ को
shareCodeसे जोड़ने वाला एक अतुल्यकालिक नेटवर्क अनुरोध प्रसारित करती है। - सिस्टम पेस्टबोर्ड स्टेजिंग: क्लिपबोर्ड एक्सेस ब्राउज़र अनुमति, उपयोगकर्ता-सक्रियण आवश्यकताओं और कार्यान्वयन-विशिष्ट सुरक्षा नीतियों के अधीन है। वेब कार्यान्वयन को क्लिपबोर्ड स्टेजिंग को एक वैकल्पिक वृद्धि के रूप में मानना चाहिए और एक्सेस से इनकार किए जाने या अनुपलब्ध होने पर एक फ़ॉलबैक प्रदान करना चाहिए।
- फ़ॉलबैक समन्वय: यदि पेस्टबोर्ड एक्सेस प्रतिबंधित है, उपयोगकर्ता प्रॉम्प्ट द्वारा अस्वीकार कर दिया गया है, या बाद के उपयोगकर्ता कार्रवाइयों द्वारा साफ़ कर दिया गया है, तो एट्रिब्यूशन आर्किटेक्चर सर्वर-साइड सत्र मिलान या प्लेटफ़ॉर्म-समर्थित इंस्टॉल रेफरर चैनलों पर वापस आ जाता है।
डिफ़र्ड पैरामीटर पंजीकरण निष्पादित करने के लिए डाउनलोड CTA बटन को बांधना
लैंडिंग पेज अपने प्राथमिक डाउनलोड बटन को सीधे SDK के निष्पादन मेथड (wakeupOrInstall()) से बांधता है।
वेब JS SDK आंतरिक रूप से पुनर्निर्देशन जीवनचक्र का प्रबंधन करता है: यह कॉन्फ़िगर किए गए स्कीम या यूनिवर्सल लिंक के माध्यम से ऐप वेक-अप प्रयास शुरू करता है, और यदि ऐप इंस्टॉल नहीं है, तो यह कॉन्फ़िगर किए गए एप्लिकेशन स्टोर पर एक विलंबित पुनर्निर्देशन निष्पादित करता है। यूजरलैंड कोड को सामान्य निष्पादन के दौरान SDK के आंतरिक नेविगेशन प्रबंधन पर भरोसा करना चाहिए, प्रत्यक्ष फ़ॉलबैक नेविगेशन को उन परिदृश्यों के लिए आरक्षित करना चाहिए जहाँ SDK स्क्रिप्ट लोड होने में विफल रहती है, एक सिंक्रोनस अपवाद फेंकती है, या ब्राउज़र सुरक्षा नियंत्रणों द्वारा अवरुद्ध होती है।
नीचे दिया गया कार्यान्वयन पैटर्न यह प्रदर्शित करता है कि आने वाले shareCode क्वेरी मापदंडों को कैप्चर करने, इन-ऐप सोशल कंटेनरों का पता लगाने, क्लिक कतार स्थिति का प्रबंधन करने, और डुप्लिकेट कुंजियों या विकृत URI अंशों के बिना फ़ॉलबैक रूट पर मापदंडों को संरक्षित करने के लिए वेब JS SDK को कैसे एकीकृत किया जाए:
<!-- Web JS SDK Dynamic Share Parameter Ingestion and Routing -->
<!-- File: /var/www/html/invite.html -->
<!--
INTEGRATION NOTE:
This example requires an adapter verified against the deployed SDK version.
Do not assume that the constructor, CDN path, callback, or method names shown
in an illustrative snippet match the current vendor SDK.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Accept Your Referral Invitation</title>
<!-- Include verified OpoInstall Web JS SDK from official CDN -->
<script src="https://web.cdn.opoinstallcloud.com/opoinstall.js"></script>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
margin: 0;
padding: 20px;
text-align: center;
background-color: #f8fafc;
}
.card {
background: #ffffff;
border-radius: 12px;
padding: 32px 24px;
max-width: 420px;
margin: 40px auto;
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1);
}
button {
background-color: #2563eb;
color: #ffffff;
border: none;
padding: 14px 28px;
font-size: 16px;
font-weight: 600;
border-radius: 8px;
cursor: pointer;
width: 100%;
margin-top: 20px;
}
button:disabled {
background-color: #94a3b8;
cursor: not-allowed;
}
/* Visual guidance overlay for restricted in-app webview containers */
.webview-guide-mask {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.85);
color: #ffffff;
z-index: 9999;
padding-top: 40px;
box-sizing: border-box;
}
.guide-arrow {
font-size: 32px;
text-align: right;
padding-right: 30px;
}
.guide-text {
font-size: 18px;
line-height: 1.6;
margin-top: 20px;
padding: 0 30px;
}
</style>
</head>
<body>
<main class="card">
<h1>Welcome to the App</h1>
<p id="invite-desc">Your friend has invited you to join. Tap below to install and claim your welcome credit.</p>
<!-- Primary conversion button -->
<button id="btn-install" type="button">Download and Claim Bonus</button>
<!-- Example application-owned redirect endpoint; replace with a deployed HTTPS route -->
<p style="margin-top: 16px; font-size: 14px;">
<a id="fallback-store-link" href="https://promo.example.com/app-redirect">Direct Store Link</a>
</p>
</main>
<!-- Overlay prompt displayed inside restricted messaging webviews (WeChat, Line) -->
<div id="webview-guide" class="webview-guide-mask">
<div class="guide-arrow">↗</div>
<div class="guide-text">
Tap the menu in the top-right corner (•••) and select <strong>"Open in Browser"</strong> (Safari / Chrome) to download the app.
</div>
</div>
<script>
/**
* Extracts and sanitizes the shareCode query parameter from window.location.
* Enforces URL-safe alphanumeric bounds up to 128 characters per specification.
*/
function getSanitizedShareCode() {
try {
const query = new URLSearchParams(window.location.search);
const rawCode = query.get("shareCode");
const pattern = /^[A-Za-z0-9_-]{1,128}$/;
return (rawCode && pattern.test(rawCode)) ? rawCode : "";
} catch (e) {
console.error("Failed to parse search params:", e);
return "";
}
}
/**
* Extracts and sanitizes the platform query parameter.
*/
function getSanitizedPlatform() {
try {
const query = new URLSearchParams(window.location.search);
const rawPlatform = query.get("platform");
const pattern = /^[A-Za-z0-9_]{1,32}$/;
return (rawPlatform && pattern.test(rawPlatform)) ? rawPlatform : "";
} catch (e) {
return "";
}
}
/**
* Detects restricted in-app browser containers (WeChat, Line, WhatsApp, Facebook).
*/
function detectInAppBrowser() {
const ua = navigator.userAgent.toLowerCase();
return {
isWeChat: ua.indexOf("micromessenger") !== -1,
isLine: ua.indexOf("line/") !== -1,
isWhatsApp: ua.indexOf("whatsapp") !== -1,
isFacebook: ua.indexOf("fbav") !== -1 || ua.indexOf("instagram") !== -1
};
}
/**
* Safely decodes a URI component, falling back to raw string on malformed percent encoding.
*/
function safeDecode(str) {
if (!str) return "";
try {
return decodeURIComponent(str.replace(/\+/g, " "));
} catch (e) {
return str;
}
}
/**
* Executes fallback navigation, replacing or updating the shareCode parameter
* across URL parsing and string fallback paths without corrupting URL fragments.
*/
function executeFallbackNavigation(fallbackLink, shareCode, platform) {
if (!fallbackLink || !fallbackLink.href) {
console.error("Fallback destination link is undefined.");
return;
}
let destinationUrl = fallbackLink.href;
try {
const url = new URL(destinationUrl, window.location.origin);
if (shareCode) {
url.searchParams.set("shareCode", shareCode);
}
if (platform) {
url.searchParams.set("platform", platform);
}
destinationUrl = url.toString();
} catch (err) {
console.warn("URL API parsing failed, applying robust string fallback:", err);
const hashIndex = destinationUrl.indexOf("#");
const fragment = hashIndex !== -1 ? destinationUrl.substring(hashIndex) : "";
const rawBase = hashIndex !== -1 ? destinationUrl.substring(0, hashIndex) : destinationUrl;
const qIndex = rawBase.indexOf("?");
const pathname = qIndex !== -1 ? rawBase.substring(0, qIndex) : rawBase;
const queryString = qIndex !== -1 ? rawBase.substring(qIndex + 1) : "";
const params = {};
if (queryString) {
const pairs = queryString.split("&");
for (let i = 0; i < pairs.length; i++) {
if (!pairs[i]) continue;
const parts = pairs[i].split("=");
const key = safeDecode(parts[0]);
const value = parts.length > 1 ? safeDecode(parts.slice(1).join("=")) : "";
if (key) {
params[key] = value;
}
}
}
if (shareCode) params["shareCode"] = shareCode;
if (platform) params["platform"] = platform;
const serializedPairs = [];
for (const k in params) {
if (Object.prototype.hasOwnProperty.call(params, k)) {
serializedPairs.push(encodeURIComponent(k) + "=" + encodeURIComponent(params[k]));
}
}
const newQuery = serializedPairs.length > 0 ? "?" + serializedPairs.join("&") : "";
destinationUrl = pathname + newQuery + fragment;
}
window.location.href = destinationUrl;
}
document.addEventListener("DOMContentLoaded", function() {
const shareCode = getSanitizedShareCode();
const platform = getSanitizedPlatform();
const inApp = detectInAppBrowser();
const installBtn = document.getElementById("btn-install");
const guideOverlay = document.getElementById("webview-guide");
const fallbackLink = document.getElementById("fallback-store-link");
// Display visual guidance mask if opened in restricted containers that intercept downloads
if (inApp.isWeChat || inApp.isLine) {
if (guideOverlay) guideOverlay.style.display = "block";
}
// Immediately update static fallback link's href on DOM load so direct taps preserve parameters
if (fallbackLink && fallbackLink.href) {
try {
const initialUrl = new URL(fallbackLink.href, window.location.origin);
if (shareCode) initialUrl.searchParams.set("shareCode", shareCode);
if (platform) initialUrl.searchParams.set("platform", platform);
fallbackLink.href = initialUrl.toString();
} catch (e) {
// Fallback parsing handled at click time
}
}
// Package dynamic parameters for OpoInstall ingestion
const dynamicData = {
shareCode: shareCode,
platform: platform
};
// SDK readiness and one-shot action state
let isSdkReady = false;
let isSdkBlocked = false;
let isClickQueued = false;
let actionStarted = false;
let installerInstance = null;
let clickTimeoutId = null;
// Application-defined initialization fallback threshold, not a verified vendor default
const SDK_CLICK_TIMEOUT_MS = 1500;
function clearClickTimeout() {
if (clickTimeoutId !== null) {
clearTimeout(clickTimeoutId);
clickTimeoutId = null;
}
}
function restoreInstallButton() {
if (!installBtn) return;
installBtn.disabled = false;
installBtn.textContent = "Download and Claim Bonus";
}
function triggerSdkWakeup() {
try {
if (installerInstance && typeof installerInstance.wakeupOrInstall === "function") {
installerInstance.wakeupOrInstall({
data: dynamicData,
channelCode: "viral_social_share"
});
} else {
executeFallbackNavigation(fallbackLink, shareCode, platform);
}
} catch (err) {
console.error("SDK wakeup failed:", err);
executeFallbackNavigation(fallbackLink, shareCode, platform);
}
}
// All navigation paths must pass through this one-shot guard
function runOnce(action) {
if (actionStarted) return;
actionStarted = true;
isClickQueued = false;
clearClickTimeout();
if (installBtn) {
installBtn.disabled = true;
installBtn.textContent = "Opening...";
}
action();
}
function handleInstallClick() {
if (actionStarted) return;
if (isSdkReady) {
runOnce(triggerSdkWakeup);
return;
}
if (isSdkBlocked) {
runOnce(function() {
executeFallbackNavigation(fallbackLink, shareCode, platform);
});
return;
}
// Queue the click while the SDK initializes
isClickQueued = true;
if (installBtn) {
installBtn.disabled = true;
installBtn.textContent = "Connecting to App Store...";
}
clearClickTimeout();
clickTimeoutId = setTimeout(function() {
if (actionStarted || isSdkReady || !isClickQueued) {
return;
}
isSdkBlocked = true;
runOnce(function() {
executeFallbackNavigation(fallbackLink, shareCode, platform);
});
}, SDK_CLICK_TIMEOUT_MS);
}
if (installBtn) {
installBtn.addEventListener("click", handleInstallClick);
}
// Initialize the Web JS SDK
if (typeof OpoInstall === "function") {
try {
// Replace with the application key obtained from the configured vendor console;
// never commit production secrets to public source control.
installerInstance = new OpoInstall({
appKey: "OPOINSTALL_APPKEY_PLACEHOLDER",
onready: function() {
if (this && typeof this.wakeupOrInstall === "function") {
installerInstance = this;
}
isSdkReady = true;
clearClickTimeout();
// A late callback must never repeat a completed action
if (actionStarted) return;
if (isClickQueued) {
runOnce(triggerSdkWakeup);
} else {
restoreInstallButton();
}
}
});
} catch (err) {
console.error("OpoInstall initialization failed:", err);
isSdkBlocked = true;
clearClickTimeout();
if (isClickQueued) {
runOnce(function() {
executeFallbackNavigation(fallbackLink, shareCode, platform);
});
} else {
restoreInstallButton();
}
}
} else {
console.warn("OpoInstall SDK unavailable; fallback navigation enabled.");
isSdkBlocked = true;
restoreInstallButton();
}
});
</script>
</body>
</html>
चरण 3: रेफरल पैरामीटर और बाइंडिंग खातों को पुनर्प्राप्त करना
प्रारंभिक ऐप लॉन्च के दौरान रेफरल संदर्भ को पुनर्प्राप्त करना
इंस्टॉलेशन के बाद, एप्लिकेशन को प्लेटफ़ॉर्म और तैनात एट्रिब्यूशन SDK द्वारा समर्थित तंत्र का उपयोग करके रेफरल संदर्भ को पुनर्प्राप्त करने का प्रयास करना चाहिए।
यह न मानें कि वेब लैंडिंग-पेज URL में मौजूद पैरामीटर स्वचालित रूप से ऐप-स्टोर इंस्टॉलेशन से बच जाएगा।
Android पर, जब इंस्टॉलेशन पथ और कॉन्फ़िगर किया गया रेफरर पेलोड इसका समर्थन करते हैं, तो एप्लिकेशन Google Play Install Referrer का उपयोग कर सकता है। यदि कोई तृतीय-पक्ष एट्रिब्यूशन SDK एक अतिरिक्त पुनर्प्राप्ति API प्रदान करता है, तो उपयोग में सटीक SDK संस्करण के खिलाफ इसके विधि हस्ताक्षर, कॉलबैक व्यवहार और पेलोड स्कीमा को सत्यापित करें।
iOS पर, प्रत्यक्ष यूनिवर्सल लिंक हैंडलिंग और पोस्ट-इंस्टॉल रेफरल पुनर्प्राप्ति को अलग-अलग प्रवाह के रूप में माना जाना चाहिए। एप्लिकेशन को डिफ़र्ड पुनर्प्राप्ति के लिए एक प्रलेखित, प्लेटफ़ॉर्म-अनुमत तंत्र का उपयोग करना चाहिए। यदि तंत्र को सत्यापित नहीं किया जा सकता है या रेफरल संदर्भ को पुनर्प्राप्त नहीं किया जा सकता है, तो किसी आमंत्रणकर्ता को इंस्टॉलेशन को एट्रिब्यूट किए बिना ऑनबोर्डिंग जारी रखें।
नॉन-ब्लॉकिंग पुनर्प्राप्ति और पुनः प्रयास व्यवहार
रेफरल पुनर्प्राप्ति को मुख्य UI थ्रेड को ब्लॉक नहीं करना चाहिए या उपयोगकर्ता को पंजीकरण पूरा करने से नहीं रोकना चाहिए। पुनर्प्राप्ति ऑपरेशन को अतुल्यकालिक मानें, वास्तविक SDK या एप्लिकेशन सेवा के लिए उपयुक्त टाइमआउट लागू करें, और सफल पुनर्प्राप्ति, रिक्त परिणामों, टाइमआउट और विफलता के लिए एक अलग परिणाम रिकॉर्ड करें।
प्रलेखित SDK व्यवहार और एप्लिकेशन की ऑनबोर्डिंग आवश्यकताओं के अनुसार टाइमआउट को कॉन्फ़िगर करें। इस उदाहरण में दिखाया गया कोई भी टाइमआउट मान एक एप्लिकेशन-स्तरीय कॉन्फ़िगरेशन है, न कि कोई विक्रेता डिफ़ॉल्ट जब तक कि प्रासंगिक SDK दस्तावेज़ीकरण स्पष्ट रूप से इसकी पुष्टि न करे।
जब प्रलेखित API इसका समर्थन करता है और एप्लिकेशन की एक परिभाषित पुनः प्रयास नीति है, तो पुनः प्रयास का प्रयास किया जा सकता है। डुप्लिकेट खाता-बाइंडिंग अनुरोधों को रोकें और पंजीकरण पूरा होने के बाद विलंबित कॉलबैक आने पर बार-बार पुरस्कार जारी करने से बचें।
सर्वर-साइड रेफरल सत्यापन
सभी क्लाइंट-रिपोर्ट किए गए रेफरल मानों को अविश्वसनीय इनपुट के रूप में मानें। बाइंडिंग बनाने से पहले एप्लिकेशन बैकएंड को उम्मीदवार आमंत्रणकर्ता टोकन को सत्यापित करना चाहिए, आमंत्रित व्यक्ति की पात्रता की जांच करनी चाहिए, और रेफरल प्रोग्राम के व्यावसायिक नियमों को लागू करना चाहिए।
एक ही आमंत्रित व्यक्ति के लिए कई आमंत्रणकर्ता बाइंडिंग को रोकने के लिए डेटाबेस-स्तरीय विशिष्टता विवशता या समकक्ष लेन-देन नियंत्रण का उपयोग करें। रेफरल बाइंडिंग को पुरस्कार जारी करने से अलग रखें, और सर्वर पर आवश्यक सक्रियण मील का पत्थर सत्यापित होने के बाद ही पुरस्कार जारी करें।

WeChat, Line और WhatsApp में इन-ऐप ब्राउज़र प्रतिबंधों का प्रबंधन करना
कंटेनर सैंडबॉक्स बैरियर: मैसेजिंग ऐप कस्टम स्कीम और प्रत्यक्ष APK डाउनलोड को कैसे इंटरसेप्ट करते हैं
अधिकांश वायरल रेफरल शेयरिंग मोबाइल मैसेजिंग एप्लिकेशन के भीतर होती है। हालाँकि, WeChat, Line और WhatsApp जैसे प्लेटफ़ॉर्म ऑपरेटिंग सिस्टम संस्करण और कंटेनर सुरक्षा नीतियों के आधार पर सैंडबॉक्स इन-ऐप वेबव्यू के भीतर बाहरी वेब लिंक को रेंडर करते हैं जो अक्सर प्रत्यक्ष बाइनरी डाउनलोड और डीप-लिंकिंग योजनाओं को इंटरसेप्ट, प्रतिबंधित या संशोधित करते हैं।
जब कोई आमंत्रित उपयोगकर्ता इन-ऐप ब्राउज़र के भीतर रेफरल लिंक पर टैप करता है:
- प्रत्यक्ष APK डाउनलोड इंटरसेप्ट किए जाते हैं: Android पर, वेब लैंडिंग पेज से सीधे
.apkबाइनरी फ़ाइलों को डाउनलोड करने के प्रयास अक्सर वेबव्यू कंटेनर द्वारा इंटरसेप्ट या अवरुद्ध किए जाते हैं। - कस्टम URL स्कीम अवरुद्ध होती हैं: निजी URL स्कीम (
myapp://invite?code=123) के आह्वान अक्सर निष्पादित होने में विफल रहते हैं, जो उन उपयोगकर्ताओं के लिए सीधे नेटिव ऐप लॉन्च को रोकते हैं जिनके पास पहले से ही ऐप इंस्टॉल है। - यूनिवर्सल लिंक दबाए जा सकते हैं: कुछ मैसेजिंग एप्लिकेशन आउटबाउंड नेविगेशन को इंटरसेप्ट करते हैं, जिससे मानक iOS यूनिवर्सल लिंक ऑपरेटिंग सिस्टम की ओर हल होने से रुक जाते हैं।
इन-ऐप यूजर-एजेंट हेडर का पता लगाना
इन कंटेनर सीमाओं को सुचारू रूप से संभालने के लिए, शेयरिंग लैंडिंग पेज को प्रारंभिक DOM लोड के दौरान आने वाले ब्राउज़र User-Agent स्ट्रिंग का निरीक्षण करना चाहिए:
- WeChat का पता लगाना:
MicroMessengerके लिएnavigator.userAgentका निरीक्षण करना। - Line का पता लगाना:
Line/के लिएnavigator.userAgentका निरीक्षण करना। - WhatsApp का पता लगाना:
WhatsAppके लिएnavigator.userAgentका निरीक्षण करना। - Facebook / Messenger / Instagram:
FBAVयाInstagramके लिएnavigator.userAgentका निरीक्षण करना।
पुनर्निर्देशन रणनीतियों का मूल्यांकन करना: डायरेक्ट ऐप हैंडऑफ़ बनाम सिस्टम ब्राउज़र संक्रमण
ऑपरेटिंग सिस्टम और सोशल एप्लिकेशन विशिष्ट नेविगेशन व्यवहार प्रदर्शित करते हैं:
- WeChat और Line वातावरण: ये कंटेनर प्रत्यक्ष बाइनरी डाउनलोड और बाहरी योजना निष्पादन को प्रतिबंधित करते हैं। स्वचालित पुनर्निर्देशन का प्रयास करने से अक्सर प्लेटफ़ॉर्म चेतावनियाँ स्क्रीन ट्रिगर होती हैं। लैंडिंग पेज स्पष्ट दृश्य मार्गदर्शन प्रदर्शित करता है जो उपयोगकर्ता को डिवाइस के डिफ़ॉल्ट सिस्टम ब्राउज़र (iOS पर Safari, Android पर Chrome) में लिंक खोलने के लिए प्रेरित करता है।
- WhatsApp वातावरण: आधुनिक iOS और Android कार्यान्वयन पर, WhatsApp आमतौर पर सिस्टम-प्रदान किए गए इन-ऐप व्यूपोर्ट (जैसे iOS पर SFSafariViewController या Android पर Chrome Custom Tabs) में वेब लिंक खोलता है। ये वातावरण मानक वेब नेविगेशन की अनुमति देते हैं और प्लेटफ़ॉर्म ऐप स्टोर पर संक्रमण का समर्थन करते हैं, हालांकि कस्टम URL स्कीम को अभी भी स्पष्ट उपयोगकर्ता टैप की आवश्यकता हो सकती है।
सौम्य उपयोगकर्ता मार्गदर्शन को लागू करना: जब प्रत्यक्ष पुनर्निर्देशन विफल हो जाता है तो नेटिव मेनू प्रॉम्प्ट ओवरले करना
जब एक इन-ऐप वेबview प्रोग्रामेटिक बाहरी हैंडऑफ़ को रोकता है, तो लैंडिंग पेज दृश्य उपयोगकर्ता मार्गदर्शन तैनात करते हैं:
- शर्त मास्क ओवरले: जब
MicroMessengerयाLine/का पता चलता है, तो स्क्रीन के शीर्ष-दाएं कोने की ओर इशारा करते हुए एक उच्च-कंट्रास्ट दृश्य ओवरले प्रदर्शित करें। - स्पष्ट कार्रवाई कॉपी: प्रॉम्प्ट उपयोगकर्ता को निर्देश देता है: “शीर्ष-दाएं कोने (•••) में मेनू पर टैप करें और ऐप डाउनलोड करने के लिए ‘Open in Browser’ (Safari / Chrome) चुनें।”
- पैरामीटर स्थिति को संरक्षित करना: यदि उपयोगकर्ता समान URL लोड करके बाहरी ब्राउज़र में संक्रमण करता है, तो एड्रेस बार में क्वेरी पैरामीटर (
?shareCode=...) बरकरार रहते हैं, बशर्ते मध्यवर्ती पुनर्निर्देशन उन्हें न हटाएं। जब लैंडिंग पेज Safari या Chrome में पुनः लोड होता है, तो वेब JS SDK साफ रूप से निष्पादित होता है और रेफरल संदर्भ को स्टेज करता है।
सोशल फ़नल में रेफरल पैरामीटर ड्रॉप्स का निवारण करना
आक्रामक इन-ऐप लिंक शिमिंग प्रॉक्सी में पैरामीटर स्ट्रिपिंग का निदान करना
कुछ सोशल प्लेटफ़ॉर्म मध्यवर्ती लिंक-रैपिंग या शिमिंग डोमेन (जैसे Facebook का l.facebook.com या Twitter का t.co) के माध्यम से साझा किए गए बाहरी लिंक को रूट करते हैं। कुछ मामलों में, ये पुनर्निर्देशन हॉप गैर-मानक क्वेरी मापदंडों को हटा देते हैं या परस्पर विरोधी आंतरिक क्लिक पहचानकर्ता (fbclid) जोड़ देते हैं।
मल्टी-हॉप सोशल पुनर्निर्देशन में पैरामीटर हानि को रोकने के लिए:
- मानक पैरामीटर नामकरण: IETF RFC 3986 के अनुसार मानक अल्फ़ान्यूमेरिक क्वेरी कुंजियों जैसे
shareCodeऔरchannelCodeपर टिके रहें। - प्री-फ़्लाइट लिंक सत्यापन: लक्षित मैसेजिंग नेटवर्क पर लाइव चैट सत्रों में लिंक रिज़ॉल्यूशन का परीक्षण करें, यह सत्यापित करने के लिए अंतिम लैंडिंग पेज पर
window.location.searchका निरीक्षण करें किshareCodeपैरामीटर सभी मध्यवर्ती पुनर्निर्देशन से बचता है।
डेस्कटॉप वेब शेयर को संभालना: जब उपयोगकर्ता पीसी ब्राउज़र पर मोबाइल रेफरल लिंक खोलते हैं
जबकि रेफरल अभियान मोबाइल उपकरणों के लिए डिज़ाइन किए गए हैं, उपयोगकर्ता अक्सर डेस्कटॉप कंप्यूटर पर चैट लिंक खोलते हैं (जैसे WhatsApp Web, WeChat for Mac/Windows, या Slack)। यदि कोई डेस्कटॉप उपयोगकर्ता मोबाइल डाउनलोड लैंडिंग पेज तक पहुंचता है, तो मोबाइल स्टोर पुनर्निर्देशन विफल हो जाते हैं।
एंटरप्राइज लैंडिंग पेज उत्तरदायी डिग्रेडेशन के माध्यम से डेस्कटॉप ट्रैफ़िक को संभालते हैं:
- डेस्कटॉप वातावरण का पता लगाना: वेब JS SDK डेस्कटॉप ऑपरेटिंग सिस्टम (
Windows,macOS,Linux) का पता लगाता है। - गतिशील QR कोड जनरेशन: एक गैर-क्लिक करने योग्य मोबाइल स्टोर बटन प्रदर्शित करने के बजाय, उत्तरदायी टेम्पलेट डेस्कटॉप व्यूपोर्ट पर सशर्त रूप से QR कोड कंटेनर प्रदर्शित कर सकते हैं।
- क्रॉस-डिफ़ाइस स्कैनिंग: उपयोगकर्ता अपने मोबाइल डिवाइस से डेस्कटॉप स्क्रीन QR कोड को स्कैन करता है। QR कोड मूल
shareCodeके साथ गंतव्य URL को एनकोड करता है, रेफरल सत्र को डेस्कटॉप से मोबाइल में स्थानांतरित करता है।
ऑपरेटिंग सिस्टम पेस्टबोर्ड एक्सेस प्रतिबंधों को कम करना
ऑपरेटिंग सिस्टम गोपनीयता नियंत्रण क्लिपबोर्ड एक्सेस को नियंत्रित करते हैं:
- Android अग्रभूमि फ़ोकस नियम: Android 10 (API स्तर 29) और बाद के संस्करणों के तहत, पृष्ठभूमि एप्लिकेशन Android ClipboardManager के माध्यम से क्लिपबोर्ड डेटा नहीं पढ़ सकते हैं। नेटिव SDK को तब तक क्लिपबोर्ड निरीक्षण को स्थगित करना चाहिए जब तक कि एप्लिकेशन की मुख्य Activity को सक्रिय विंडो फ़ोकस प्राप्त न हो जाए।
- iOS पेस्टबोर्ड प्रॉम्प्ट: iOS 16 और बाद के संस्करणों पर, Apple UIPasteboard तक प्रोग्रामेटिक एक्सेस एक सिस्टम अधिसूचना या प्रॉम्प्ट को ट्रिगर कर सकता है जो उपयोगकर्ता से स्रोत ब्राउज़र से पेस्ट करने की अनुमति देने के लिए कहता है।
- नेटवर्क फ़ॉलबैक समन्वय: एट्रिब्यूशन आर्किटेक्चर स्थानीय क्लिपबोर्ड बफ़र्स को एक अवसरवादी वृद्धि के रूप में मानकर इन प्रतिबंधों का हिसाब लगाता है, जब पेस्टबोर्ड रीडिंग से इनकार किया जाता है या अनुपलब्ध होता है तो सर्वर-साइड सत्र मिलान पर वापस आ जाता है।
भौतिक उपकरणों पर सोशल रेफरल फ़नल के लिए प्री-फ़्लाइट सत्यापन प्रोटोकॉल
ग्राहक रेफरल अभियान लॉन्च करने से पहले, विकास इंजीनियरिंग टीमों को निम्नलिखित व्यवस्थित सत्यापन चेकलिस्ट निष्पादित करनी चाहिए:
- Android लक्षित शेयर फ़ॉलबैक: पुष्टि करें कि जब WeChat या Line अनइंस्टॉल हो जाता है, तो ऐप सिस्टम शेयर चयनकर्ता पर सुचारू रूप से वापस आ जाता है।
- Android क्लिपबोर्ड लिंक कॉपी फ़ॉलबैक: पुष्टि करें कि यदि सिस्टम शेयर चयनकर्ता विफल हो जाता है या कोई अपवाद फेंकता है, तो पूरा रेफरल लिंक क्लिपबोर्ड पर कॉपी हो जाता है और एक टोस्ट सूचना प्रदर्शित होती है।
- H5 SDK विलंब और वन-शॉट नेविगेशन: यह सत्यापित करने के लिए 1500ms से अधिक के SDK इनिशियलाइज़ेशन विलंब का अनुकरण करें कि फ़ॉलबैक नेविगेशन साफ रूप से निष्पादित होता है और देर से
onreadyघटनाएं डुप्लिकेट नेविगेशन को ट्रिगर नहीं करती हैं। - H5 पैरामीटर और फ़्रैगमेंट प्रतिधारण: स्वच्छ पैरामीटर प्रतिस्थापन को सत्यापित करने के लिए मौजूदा क्वेरी मापदंडों, डुप्लिकेट कुंजियों और
#fragmentsवाले URL के साथ लैंडिंग पेज फ़ॉलबैक नेविगेशन का परीक्षण करें। - iOS यूनिवर्सल लिंक और स्टोर हैंडऑफ़: मौजूदा उपयोगकर्ताओं के लिए प्रत्यक्ष ऐप ओपनिंग का परीक्षण करें और Apple के एंटी-फ़िंगरप्रिंटिंग नियमों के खिलाफ पोस्ट-इंस्टॉल पैरामीटर पुनर्प्राप्ति का मूल्यांकन करें।
- लाइव सोशल मैसेजिंग डिस्पैच:
shareCodeको छोड़े बिना इन-ऐप ब्राउज़र पहचान ओवरले उपयोगकर्ताओं को Safari या Chrome पर मार्गदर्शन करते हैं, यह सत्यापित करने के लिए सक्रिय WeChat और Line चैट सत्रों में लिंक प्रेषित करें। - बैकएंड बाइंडिंग और रिवार्ड आइडपोटेंसी: सत्यापित करें कि एप्लिकेशन बैकएंड उम्मीदवार टोकन स्वीकार करता है, डुप्लिकेट बाइंडिंग को अस्वीकार करता है, और सत्यापित मील के पत्थर पूरे होने तक पुरस्कारों को लंबित स्थिति में रखता है।
रेफरल ट्रैकिंग आर्किटेक्चर का तुलनात्मक विश्लेषण
रेफरल ट्रैकिंग आर्किटेक्चर की तुलना करना
| आर्किटेक्चरल आयाम | मैनुअल प्रोमो कोड | डिवाइस फ़िंगरप्रिंटिंग | प्लेटफ़ॉर्म-समर्थित पुनर्प्राप्ति के साथ स्पष्ट रेफरल पैरामीटर |
|---|---|---|---|
| उपयोगकर्ता ऑनबोर्डिंग घर्षण | मैनुअल प्रविष्टि की आवश्यकता है | मिलान सफल होने पर कम हो सकता है | जब रेफरल संदर्भ successfully पुनर्प्राप्त किया जाता है तो कम |
| एट्रिब्यूशन आधार | बैकएंड द्वारा सत्यापित उपयोगकर्ता-दर्ज कोड | कार्यान्वयन-विशिष्ट सिग्नलों के आधार पर संभाव्य मिलान | समर्थित पुनर्प्राप्ति तंत्र के साथ संयुक्त स्पष्ट रेफरल संदर्भ |
| एट्रिब्यूशन विश्वसनीयता | सटीक कोड प्रविष्टि और सत्यापन पर निर्भर करता है | सिग्नल परिवर्तनों, प्लेटफ़ॉर्म प्रतिबंधों और गोपनीयता आवश्यकताओं से प्रभावित हो सकता है | पैरामीटर निरंतरता, प्लेटफ़ॉर्म क्षमताओं और चयनित पुनर्प्राप्ति तंत्र पर निर्भर करता है |
| गोपनीयता और अनुपालन | सुरक्षित टोकन हैंडलिंग और दुरुपयोग-विरोधी नियंत्रण की आवश्यकता है | लागू प्लेटफ़ॉर्म नीतियों के विरुद्ध मूल्यांकन किया जाना चाहिए; प्रतिबंधित फ़िंगरप्रिंटिंग का उपयोग नहीं किया जाना चाहिए | SDK कार्यान्वयन और लागू प्लेटफ़ॉर्म नियमों की समीक्षा की आवश्यकता है |
| परिचालन जटिलता | अपेक्षित रूप से सरल प्रारंभिक कार्यान्वयन; मैनुअल रिडेम्पशन अतिरिक्त घर्षण पैदा करता है | मिलान तर्क, निगरानी और नीति समीक्षा की आवश्यकता है | लिंक रूटिंग, प्लेटफ़ॉर्म-विशिष्ट एकीकरण, बैकएंड सत्यापन और फ़ॉलबैक हैंडलिंग की आवश्यकता है |
कार्यान्वयन जटिलता, रूपांतरण घर्षण और एट्रिब्यूशन सटीकता में ट्रेड-ऑफ
मैनुअल प्रचार कोड कार्यान्वयन के लिए अपेक्षाकृत सीधे हैं, लेकिन उन्हें उपयोगकर्ताओं को कोड दर्ज करने और भुनाने की आवश्यकता होती है। यह घर्षण ला सकता है और इच्छित रेफरल संबंध के बाहर कोड साझा करने के अवसर पैदा करता है।
डिवाइस फ़िंगरप्रिंटिंग उपयोगकर्ता की सहभागिता को कम कर सकती है, लेकिन इसकी विश्वसनीयता मिलान कार्यान्वयन और उपलब्ध सिग्नलों पर निर्भर करती है। इसका उपयोग वहां नहीं किया जाना चाहिए जहां यह लागू गोपनीयता आवश्यकताओं के साथ संघर्ष करता है, जिसमें प्रतिबंधित फ़िंगरप्रिंटिंग पर Apple के प्रतिबंध शामिल हैं।
स्पष्ट रेफरल पैरामीटर इच्छित आमंत्रणकर्ता का स्पष्ट व्यावसायिक-स्तरीय प्रतिनिधित्व प्रदान करते हैं। हालाँकि, वेब URL में टोकन ले जाना ऐप-स्टोर इंस्टॉलेशन के बाद उस टोकन को पुनर्प्राप्त करने के बराबर नहीं है। समग्र समाधान को पैरामीटर निरंतरता, एक प्लेटफ़ॉर्म-समर्थित पुनर्प्राप्ति तंत्र और सर्वर-साइड सत्यापन को जोड़ना चाहिए। जब पुनर्प्राप्ति विफल हो जाती है, तो इंस्टॉलेशन को सत्यापित न किए गए आमंत्रणकर्ता को असाइन किए जाने के बजाय अनएट्रिब्यूटेड रहना चाहिए।
अक्सर पूछे جانے वाले प्रश्न (FAQ)
स्वचालित रेफरल ट्रैकिंग प्रोमो कोड के बिना ऐप स्टोर के माध्यम से पैरामीटर कैसे पास करती है?
WeChat या Line के अंदर लिंक साझा किए जाने पर रेफरल पैरामीटर क्यों हटा दिए जाते हैं?
एप्लिकेशन बैकएंड धोखाधड़ी वाले रेफरल लूप को कैसे रोकता है?
सारांश और निर्णय फ़्रेमवर्क
स्वचालित मोबाइल रेफरल ट्रैकिंग एक वेब-शेयरिंग प्रवाह के माध्यम से एक स्पष्ट आमंत्रणकर्ता टोकन ले जाकर और एप्लिकेशन बैकएंड पर परिणामी रेफरल संबंध को सत्यापित करके मैनुअल रेफरल-कोड प्रविष्टि को कम कर सकती है।
एक विश्वसनीय कार्यान्वयन के लिए shareCode क्वेरी पैरामीटर जोड़ने से अधिक की आवश्यकता होती है। लैंडिंग पेज को समर्थित पुनर्निर्देशन के माध्यम से टोकन को संरक्षित करना चाहिए, एप्लिकेशन को प्रासंगिक प्लेटफ़ॉर्म के लिए एक सत्यापित पुनर्प्राप्ति तंत्र का उपयोग करना चाहिए, और बैकएंड को खाता पात्रता को सत्यापित करना चाहिए और आइडपोटेंट बाइंडिंग और पुरस्कार जारी करने को लागू करना चाहिए।
Android और iOS का अलग से मूल्यांकन किया जाना चाहिए। Google Play Install Referrer Android पर समर्थित इंस्टॉलेशन मेटाडेटा प्रदान कर सकता है। iOS पर, जब एप्लिकेशन इंस्टॉल हो जाता है तो यूनिवर्सल लिंक प्रत्यक्ष रूटिंग का समर्थन करते हैं, लेकिन वे ऐप स्टोर इंस्टॉलेशन के बाद डिफ़र्ड पैरामीटर पुनर्प्राप्ति की स्वचालित रूप से गारंटी नहीं देते हैं। किसी भी अतिरिक्त पुनर्प्राप्ति तंत्र को प्रलेखित, परीक्षण और लागू प्लेटफ़ॉर्म गोपनीयता आवश्यकताओं के खिलाफ समीक्षा किया जाना चाहिए।
उत्पादन तैनाती के लिए, एकीकृत किए जा रहे सटीक संस्करण के खिलाफ सभी SDK विधि नामों, कॉन्फ़िगरेशन मानों, चैनल पहचानकर्ताओं और कॉलबैक स्कीमा की पुष्टि करें। स्वच्छ उपकरणों पर और लक्ष्य मैसेजिंग अनुप्रयोगों में संपूर्ण यात्रा का परीक्षण करें। जब किसी समर्थित तंत्र के माध्यम से किसी रेफरल को पुनर्प्राप्त नहीं किया जा सकता है, तो ऑनबोर्डिंग को आगे बढ़ने की अनुमति दें और परिणाम को असत्यापित रेफरल संबंध बनाने के बजाय अनएट्रिब्यूटेड के रूप में रिकॉर्ड करें।
OpoInstall के SDK और विकासकर्ता दस्तावेज़ीकरण इस आर्किटेक्चर को लागू करने के लिए घटक प्रदान कर सकते हैं। उत्पादन रेफरल अभियान में उन पर भरोसा करने से पहले तैनात रिलीज़ द्वारा समर्थित विशिष्ट क्षमताओं और प्लेटफ़ॉर्म व्यवहार की पुष्टि करें।
एीकरण विवरण के लिए, OpoInstall developer documentation, OpoInstall SDK download center, और OpoInstall developer console से परामर्श करें। एप्लिकेशन से प्रासंगिक इंस्टॉलेशन और गोपनीयता व्यवहार को सत्यापित करने के लिए संबंधित आधिकारिक Android और Apple प्लेटफ़ॉर्म दस्तावेज़ का उपयोग करें।
संबंधित सामग्रियां
-
अवधारणाएं: स्वचालित रेफरल ट्रैकिंग, आमंत्रणकर्ता-आमंत्रित व्यक्ति बाइंडिंग, डिफ़र्ड डीप लिंकिंग, इन-ऐप वेबव्यू सैंडबॉक्सिंग
-
प्रौद्योगिकियां: मोबाइल एट्रिब्यूशन SDK, वेब JS SDK, यूनिवर्सल लिंक, Android ऐप लिंक, S2S पोस्टबैक्स
-
मानक: IETF RFC 3986 Uniform Resource Identifier (URI) Generic Syntax, W3C Clipboard API and Events Specification
-
एकीकरण इंटरफ़ेस: एप्लिकेशन-स्वामित्व वाला शेयर-इरादा टेलीमेट्री, तैनात SDK संस्करण के लिए प्रलेखित इंस्टॉलेशन-रेफरर या एट्रिब्यूशन API, प्लेटफ़ॉर्म-विशिष्ट डीप-लिंक रूटिंग, और सर्वर-साइड रेफरल सत्यापन।
-
आधिकारिक दस्तावेज़ीकरण और संदर्भ:
Share this article



