टनेल सुरू असताना एका स्क्रीनने वेगळे वागायचे आहे, आणि ते सांगणारा कोणताही कॉल नाही. हीच शिपिंग मर्यादा आहे: macOS वर कोणतेही सार्वजनिक फ्रेमवर्क कोणताही VPN जोडलेला आहे का हे सांगत नाही, आणि iOS वर स्थिती कॉन्फिगरेशन इन्स्टॉल केलेल्या अ‍ॅपची आहे. खालील तपासण्या त्या मर्यादेपासून तुम्ही शिप करू शकता अशा गोष्टीपर्यंत नेतात, आणि त्यातील कोणतीही शोध लवकर संपवू शकते.

तपासणी 1: या प्रश्नाचे उत्तर देणे शक्य आहे का?

सँडबॉक्स कोणत्याही API पेक्षा आधी प्रश्न सोडवतो. तृतीय-पक्ष प्रक्रिया दुसऱ्या विक्रेत्याचे एक्स्टेंशन मोजू शकत नाही, आणि त्या एक्स्टेंशनचे कॉन्फिगरेशनही वाचू शकत नाही, म्हणून विचारण्यासाठी कोणतीही समर्थित वस्तू नाही.

प्रत्येक बायपास एकाच भिंतीवर आदळतो. इंटरफेस याद्या, scutil --nc list आणि थेट सिस्टम-कॉन्फिगरेशन वाचन एकतर सँडबॉक्स रोखत असलेली परवानगी मागतात किंवा Apple ने कधीही वचन न दिलेल्या वर्तनावर अवलंबून असतात. जर योजनेला यापैकी काही हवे असेल, तर समस्या योजनेतच आहे. अप्रमाणित तपशिलावर बांधलेले वैशिष्ट्य म्हणजे डिलिव्हरी तारखेसह सपोर्ट तिकीट.

तपासणी 2: तुमचे अ‍ॅप टनेल स्वतः व्यवस्थापित करते का?

जर करत असेल, तर तुमच्या स्वतःच्या कॉन्फिगरेशनसाठी तुमच्याकडे समर्थित उत्तर आहे. प्राधान्ये लोड करा, त्रुटी हाताळा, नंतर स्थिती वाचा आणि पोलिंगऐवजी बदलांची सदस्यता घ्या:

vpnManager.loadFromPreferences { error in
    // handle a load failure before reading status
}

NotificationCenter.default.addObserver(
    forName: .NEVPNStatusDidChange,
    object: nil,
    queue: nil
) { note in
    let status = (note.object as? NEVPNConnection)?.status
}

हे काय परत करते याबद्दल अचूक रहा: तुम्ही इन्स्टॉल केलेल्या टनेलची स्थिती. दुसरा क्लायंट चालवणारा वापरकर्ता डिस्कनेक्टेड दिसेल, आणि ती तुमच्या कोडमधील बग नाही. उत्तरावर बांधणी करण्यापूर्वी तुमचे वैशिष्ट्य या दोन प्रश्नांपैकी कोणता खरोखर विचारत आहे हे ठरवा.

तपासणी 3: ह्युरिस्टिक खरोखर तुम्हाला काय सांगेल?

मोठ्या प्रमाणात कॉपी केलेला दृष्टिकोन सिस्टम प्रॉक्सी शब्दकोशाला त्याच्या स्कोप्ड नोंदी विचारतो आणि की वाचतो, ज्या योगायोगाने इंटरफेस नावे असतात:

let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []

जी की tap, tun, ppp, ipsec किंवा utun ने सुरू होते, ती टनेल-स्कोप्ड इंटरफेस असल्याचे सूचित करते. पूर्ण नाव जुळवणे लगेच अयशस्वी होते, कारण iOS 12 utun1 आणि utun2 सह आले आणि काही प्रोफाइल ipsec4, ppp0 किंवा utun0 म्हणून दिसतात. त्याऐवजी उपसर्गांची तुलना करा.

तरीही नाव कोणत्याही मालकाची ओळख करत नाही. सिस्टम वैशिष्ट्ये आणि इतर विक्रेत्यांचे एक्स्टेंशनही utun इंटरफेस तयार करतात, आणि तुमच्या रहदारीपैकी काहीही न वाहूनही एक अस्तित्वात असू शकतो. हे जवळपास टनेल-आकाराचे काहीतरी आहे या इशाऱ्यासारखे वाचा, त्यापेक्षा जास्त नाही. येथे खोटा पॉझिटिव्ह स्वस्त आहे जर तुम्ही फक्त एक वैशिष्ट्य गेट करत असाल, आणि महाग आहे जर लॉगिन स्क्रीन गेट करत असाल.

तपासणी 4: त्याऐवजी गंतव्याची चाचणी करू शकता का?

जर अ‍ॅपला फक्त अंतर्गत सेवा पोहोचण्यायोग्य आहे का हे जाणून घ्यायचे असेल, तर ती सेवा तपासा. टाइमआउटसह एक छोटी प्रोब वैशिष्ट्य खरोखर ज्यावर अवलंबून आहे त्या प्रश्नाचे उत्तर देते, आणि वापरकर्ता क्लायंट बदलला किंवा टनेलचा आकार बदलला तरीही ती काम करत राहते.

पोहोचण्यायोग्यता हे तुमच्या मार्गाबद्दलचे निरीक्षण आहे. इंटरफेसचे नाव हे तुमच्या मार्गाला लागून असलेल्या गोष्टीबद्दलचे अनुमान आहे, म्हणूनच ह्युरिस्टिक बग अहवालांमध्ये वाद निर्माण करते आणि प्रोब पुरावे. जर वापरकर्ता VPN सुरू आहे असे आग्रह धरत असताना प्रोब अयशस्वी झाली, तर आता डीबग करण्यासाठी तुमच्याकडे ठोस मार्ग आहे: नाव-निराकरण, मार्ग किंवा सेवा परवानगी.

तपासणी 5: प्लॅटफॉर्म तुम्हाला आवश्यक ते लागू करू शकतो का?

जेव्हा आवश्यकता ही टनेलमधून काहीही सुटणार नाही अशी हमी असते, तेव्हा प्रोफाइल हे त्याचे स्थान आहे, डिटेक्टर नाही. includeAllNetworks ला iOS 14 किंवा नंतरच्या आवृत्तीत पूर्ण-टनेल कॉन्फिगरेशनमध्ये सुरू केल्याने तुमच्या अ‍ॅपला अनुमान करायला सांगण्याऐवजी प्लॅटफॉर्मचे वर्तन बदलते. हा फ्लॅग NEVPNProtocol संदर्भात प्रमाणित आहे.

हे वेगळ्या प्रकारचे उत्तर आहे: निरीक्षणाऐवजी अंमलबजावणी. हे केवळ तुम्ही नियंत्रित करता त्या प्रोफाइलनाच लागू होते, त्यामुळे दुसऱ्याचे टनेल पाहत असलेल्या ग्राहक अ‍ॅपला ते मदत करत नाही.

तपासणी 6: अयशस्वीता सुरक्षित आणि निरीक्षणयोग्य करा

फक्त टनेल आवश्यक असलेली क्षमता बंद करा आणि अ‍ॅपचा उर्वरित भाग वापरण्यायोग्य ठेवा. जो डिटेक्टर खात्री नसल्यास संपूर्ण इंटरफेस लपवतो, तो तुम्ही कधीही अपेक्षा न केलेले नाव वापरणाऱ्या प्रत्येकाच्या टनेलसाठी व्यत्यय निर्माण करतो. त्याऐवजी पुराणमतवादी वर्तनाकडे परत जा: स्थानिक वैशिष्ट्ये काम करत राहतात आणि फक्त खरोखर टनेल आवश्यक असलेला दूरस्थ कॉल अक्षम होतो. ही निवड उत्पादन-निर्णय आहे, आणि ती ह्युरिस्टिकच्या शेजारी लिहिली जाण्यास पात्र आहे.

तुम्ही काय निरीक्षण केले ते लॉग करा: इंटरफेस नावे, प्लॅटफॉर्म आवृत्ती आणि एका प्रोबचा निकाल. यामुळे पुढील अहवाल वादातून तपासणीत बदलतो. नंतर जिथे समर्थित घोषणा असेल तिथे तिला प्राधान्य द्या, कारण व्यवस्थापित कॉन्फिगरेशन हेतू स्पष्टपणे वाहू शकते आणि नावे तपासण्याचे बहुतेक कारण दूर करू शकते.

जर 1 ते 5 पर्यंतच्या तपासण्यांनी तुम्हाला समर्थित उत्तराशिवाय सोडले, तर प्रोब शिप करा आणि निकाल प्रामाणिकपणे लेबल करा. प्रमाणित सर्वोत्तम-प्रयत्न संकेत पुढील आवृत्तीत तुटणाऱ्या खाजगी API पेक्षा चांगला उत्पादन-निर्णय आहे.

संबंधित लेख