सभी लेख
mobiledeep linksiOSAndroid

localhost टनल से मोबाइल डीप लिंक टेस्टिंग

iOS पर Universal Links और Android पर App Links दोनों को आपके डोमेन की जड़ पर HTTPS से सर्व की गई JSON फ़ाइल चाहिए। iOS को /.well-known/apple-app-site-association चाहिए। Android को /.well-known/assetlinks.json चाहिए। localhost इनमें से किसी को भी ऐसे hostname पर सर्व नहीं कर सकता जिसे OS आपके ऐप से जोड़े। इसलिए हम tunnel करते हैं।

हर प्लेटफ़ॉर्म पर असली ज़रूरत

iOS Universal Links

आपका ऐप इंस्टॉल होने पर OS https://your-domain.com/.well-known/apple-app-site-association (या /apple-app-site-association) लाता है। यह सामग्री को आपके ऐप के associated domains entitlement के विरुद्ध जाँचता है। लाना असली HTTPS पर सफल होना चाहिए। iOS इस उद्देश्य के लिए self-signed सर्टिफ़िकेट पर भरोसा नहीं करता, और localhost पर भी नहीं।

Android App Links

Android https://your-domain.com/.well-known/assetlinks.json लाकर App Links सत्यापित करता है। फ़ाइल को आपके ऐप के SHA-256 fingerprint सूचीबद्ध करने चाहिए। सत्यापन इंस्टॉल समय और पहले लॉन्च पर होता है। वही बंधन: असली HTTPS, असली डोमेन।

localhost यह सीधे क्यों नहीं कर सकता

भले ही mkcert आपके लैपटॉप के ब्राउज़र में विश्वसनीय HTTPS दे, मोबाइल OS आपके लोकल CA पर भरोसा नहीं करता। और आपके apple-app-site-association में डोमेन को ऐप entitlement में associated-domain से मेल खाना चाहिए — जो एक असली, DNS-हल-योग्य डोमेन है, localhost नहीं।

कुछ टीमें एक समर्पित staging डोमेन से इसे टालती हैं। यह चलता है, पर पुनरावृत्ति लूप धीमा है। एक localhost टनल एक असली subdomain पर असली HTTPS URL देता है जिस तक मोबाइल डिवाइस बिना शिकायत पहुँचते हैं।

इसे कैसे जोड़ें

  1. अपने लोकल dev सर्वर से /.well-known/ पर apple-app-site-association और assetlinks.json सर्व करें। दोनों फ़ाइलें। दोनों रूट।
  2. npx portpreview 3000 चलाएँ (या जो पोर्ट आपका dev सर्वर उपयोग करता है)।
  3. टनल hostname नोट करें — abc123.portpreview.dev जैसा कुछ।
  4. अपने iOS ऐप के associated domains entitlement में applinks:abc123.portpreview.dev जोड़ें। Android के intent filter में वही host।
  5. असली डिवाइस पर ऐप बनाएँ और इंस्टॉल करें (simulator में Universal Link व्यवहार अजीब होता है)।
  6. URL को किसी और ऐप से खोलें — Notes, Mail, एक QR code — और देखें कि यह ब्राउज़र के बजाय आपके इंस्टॉल किए ऐप तक रूट करता है।

डीप लिंक के लिए tunnel का पेच: आरक्षित subdomain न होने तक टनल hostname सत्रों के बीच बदलता है। हर रोटेशन का मतलब नए associated-domain प्रविष्टि के साथ ऐप फिर से बनाना। यदि आप डीप लिंक व्यवहार पर अक्सर पुनरावृत्ति करते हैं, एक आरक्षित subdomain लें।

apple-app-site-association के लिए content-type मायने रखता है

iOS बिना एक्सटेंशन की फ़ाइल और या तो content-type application/json (नया iOS) या application/pkcs7-mime (पुराना, हस्ताक्षरित प्रारूप) की अपेक्षा करता है। लगभग सभी आधुनिक ऐप सादा JSON वैरिएंट उपयोग करते हैं। सुनिश्चित करें कि आपका dev सर्वर सही content-type लौटाए वरना iOS बिना उपयोगी त्रुटि के चुपचाप फ़ाइल अस्वीकार कर देता है।

पहले डेस्कटॉप ब्राउज़र से टेस्ट करें: https://your-tunnel.portpreview.dev/.well-known/apple-app-site-association खोलें और पुष्टि करें कि JSON रेंडर होता है और dev tools में content-type हेडर सही है। ग़लत हो तो simulator में Universal Link बग का पीछा करने से पहले ठीक करें।

अन्य डीप लिंक डीबगिंग जाल

ऐप entitlement बेमेल

यदि आपका associated-domains entitlement कहता है applinks:abc.portpreview.dev पर apple-app-site-association def.portpreview.dev सूचीबद्ध करता है, iOS नहीं लाता। hostname सुसंगत होना चाहिए।

Safari के भीतर से Universal Link

Safari के भीतर (वही ऐप जिसमें टैब है) Universal Link टैप करना कभी-कभी ऐप के बजाय Safari में खुलता है। यह डिज़ाइन से है — iOS "जब भी यूज़र लिंक क्लिक करे ऐप खोलो" चाल को रोकता है। इसके बजाय Notes या Mail से टेस्ट करें।

Android App Links और digital asset links

Android custom URL scheme (yourapp://path) भी समर्थन करता है, जिन्हें HTTPS या assetlinks.json की ज़रूरत नहीं। ये टेस्ट करना आसान पर कम सुरक्षित — कोई भी ऐप वही scheme रजिस्टर कर सकता है। प्रोडक्शन-गुणवत्ता डीप लिंकिंग के लिए App Links जवाब है।

हमारा मोबाइल टेस्टिंग flow

डीप लिंक के साथ iOS और Android दोनों शिप करने वाले प्रोजेक्ट के लिए:

  1. .well-known फ़ाइलें सर्व करने वाला backend शुरू करें।
  2. npx portpreview 3000 से इसे tunnel करें।
  3. एक बार सत्र के लिए टनल URL स्थिर हो (या आरक्षित subdomain उपयोग करें), ऐप की associated-domain प्रविष्टियाँ अपडेट करें और build करें।
  4. भौतिक डिवाइस पर QA — fresh install और update दोनों।
  5. OAuth-और-डीप-लिंक संयोजन के लिए (साइन-इन प्रदाता जो ऐप में वापस redirect करते हैं) इसे OAuth callback टेस्टिंग के साथ जोड़ें।

सेटअप पहली बार झुंझलाहट भरा है। उसके बाद, टनल URL बस Xcode और Gradle scheme में एक और env var है।

व्यापक मोबाइल टेस्टिंग पैटर्न के लिए देखें localhost टनल से मोबाइल टेस्टिंगPortPreview वेटलिस्ट में शामिल हों

अक्सर पूछे जाने वाले प्रश्न

क्या मैं localhost पर iOS Universal Links टेस्ट कर सकता हूँ?
सीधे नहीं। Universal Links के लिए iOS को असली डोमेन से असली HTTPS पर apple-app-site-association लाना ज़रूरी है। localhost योग्य नहीं। एक टनल आपको टनल subdomain पर HTTPS URL देता है जिसे iOS आपके ऐप से जोड़ेगा जब आप इसे associated-domains entitlement में सूचीबद्ध करें।
apple-app-site-association को कौन-सा content-type उपयोग करना चाहिए?
आधुनिक iOS application/json की अपेक्षा करता है। पुराने संस्करण हस्ताक्षरित फ़ाइलों के लिए application/pkcs7-mime भी स्वीकारते थे। आज अधिकांश ऐप सादा JSON वैरिएंट उपयोग करते हैं। यदि iOS आपकी फ़ाइल नहीं उठाता, पहले डेस्कटॉप ब्राउज़र से content-type हेडर जाँचें।
क्या Android App Links को लोकल टेस्टिंग के लिए tunnel चाहिए?
हाँ यदि आप पूर्ण App Link सत्यापन चाहते हैं (custom URL scheme नहीं)। Android आपके intent filter में डोमेन से असली HTTPS पर assetlinks.json लाता है। एक tunnel एक ऐसे डोमेन पर असली HTTPS URL देता है जिसे डिवाइस सत्यापित कर सके। custom scheme को इसकी ज़रूरत नहीं पर वे कम सुरक्षित हैं।