sandbox చేసిన Mac యాప్లో యాక్టివ్ VPNని గుర్తించడం
ఈ ప్రశ్నకు పబ్లిక్ API లేదు, ఇంటర్ఫేస్ పేరు ఉపాయం ఒక హ్యూరిస్టిక్ మాత్రమే. మీ యాప్ నిజంగా దేనిపై ఆధారపడాలో నిర్ణయించడానికి ఆరు తనిఖీలు.
టన్నెల్ నడుస్తున్నప్పుడు భిన్నంగా ప్రవర్తించే ఒక స్క్రీన్ కావాలి, అది చెప్పే కాల్ ఏదీ లేదు. ఇదే షిప్పింగ్ పరిమితి: macOSలో ఏ పబ్లిక్ ఫ్రేమ్వర్క్ కూడా ఏదైనా VPN కనెక్ట్ అయిందా అని నివేదించదు, iOSలో స్థితి కాన్ఫిగరేషన్ను ఇన్స్టాల్ చేసిన యాప్కు చెందుతుంది. క్రింది తనిఖీలు ఆ పరిమితి నుండి మీరు షిప్ చేయగలిగే దానికి తీసుకువెళతాయి, వాటిలో ఏదైనా అన్వేషణను ముందుగానే ముగించగలదు.
తనిఖీ 1: ఈ ప్రశ్నకు సమాధానం చెప్పడం సాధ్యమేనా?
sandbox ఏ API కంటే ముందే ప్రశ్నను పరిష్కరిస్తుంది. మూడవ పక్ష ప్రక్రియ మరొక విక్రేత పొడిగింపును లెక్కించలేదు, ఆ పొడిగింపు కాన్ఫిగరేషన్ను కూడా చదవలేదు, కాబట్టి అడగడానికి మద్దతు ఉన్న వస్తువు లేదు.
ప్రతి బైపాస్ అదే గోడను ఢీకొంటుంది. ఇంటర్ఫేస్ జాబితాలు, scutil --nc list మరియు నేరుగా సిస్టమ్ కాన్ఫిగరేషన్ చదవడం sandbox నిలిపివేసే అనుమతులను అడుగుతాయి లేదా 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 కంటే మంచి ఉత్పత్తి నిర్ణయం.