VPN арқылы iPhone қолданбасынан ішкі API-ге қалай қоңырау шалуға болады
Туннельге тиіспес бұрын сәтсіз сұранысты оның NSURLError коды бойынша жіктеңіз, содан кейін нақты сынған қабатты жөндеңіз.
API сол телефондағы Safari-де жауап береді, ал қолданбаның сұранысы уақыт шегінен асады. Бұл айырма әдетте туннель емес: ішкі қызметті шақыратын қолданба кәдімгі HTTPS сұранысын жібереді, ал құрылғыдағы бар VPN сол сұраныстың жолы бар-жоғын ғана шешеді. Қолданбаға екінші туннель жазу — өнімдік шешім, уақыт шегі үшін жөндеу емес. Төмендегілер сәтсіздікті оның қай жерде болатынына қарай жіктейді, қолданбада бұрыннан бар қате бетін пайдаланады.
Туннельден емес, қатеден бастаңыз
URLSession тасымалдау ақауларын NSError мәндері ретінде NSURLErrorDomain ішінде хабарлайды, ал код — қолжетімді ең арзан дәлел. Кез келген конфигурацияны өзгертуден бұрын сол кодты сәтсіз хост атауымен және тапсырманың өткен уақытымен бірге журналға жазыңыз. Уақыт шегі, атау ақауы және сенім ақауы экранда бірдей көрінеді және үш түрлі жөндеуді қажет етеді. Алдымен жіктеңіз, содан кейін сол сынып бөлімін оқыңыз.
Тапсырма көрсеткіштері келесі сұраққа жауап береді: қосылым мүлдем орнатылды ма, бұл жолы болмаған сұранысты сервер тым ұзақ жауап берген сұраныстан ажыратады. Мұның ешқайсысы туннельді өзгертуді талап етпейді; сұраныстың өз диагностикасын оқи алатын жерде басып шығаруды талап етеді.
Атау шешімі кез келген нәрседен бұрын сәтсіз болады
Мысалы, api.corp.example сияқты қысқа кеңсе атауы әдетте телефонда жоқ іздеу доменіне тәуелді, сондықтан қолданба тек ғимарат ішінде бар атауды шешеді. NSURLErrorCannotFindHost — бұл қолтаңба. Толық хост атауы VPN орнатқан кез келген шешуші арқылы шешілуі керек, ал іздеу домені кепілдендірілмеген кезде қолданба толық квалификацияланған пішінді сұрауы керек. Атауды мекенжайға ауыстыру және сертификат тексерулерін өшіру ақауды жөндеудің орнына жылжытады.
Жеке DNS жазбасы және дәл сол атауға берілген сертификат — қолдау көрсетілетін жұп. Қалғанының бәрі пайдаланушыларға жететін айналып өту жолы.
Уақыт шегі — бұл атау емес, жол мәселесі
NSURLErrorTimedOut атаудың шешілгенін және ешнәрсенің жауап бермегенін білдіреді, бұл маршрутқа, пакет саясатына немесе қызметке нұсқайды. Туннель әр қолданбаға тағайындалғанда, сол серверге жететін басқа қолданба сіздің құрастырмаңыз туралы ештеңе айтпайды, өйткені бұл салыстыру ортақ емес. Іске қосып отырған бумаңыздың сол тағайындау ішінде екенін тексеріңіз, содан кейін қызмет жолының оған рұқсат етілгенін тексеріңіз. Тағайындаудан тыс орнатылған әзірлеу құрастырмасы туннельден толығымен тыс қалып, бүлінген API сияқты көрінуі мүмкін.
Браузердегі салыстыру құрылғыдағы қандай да бір қолданбаның жолы бар екенін көрсетеді. Ол сіздің құрастырмаңызда бар екенін ешқашан дәлелдемейді, сондықтан екі тест бөлек жүргізілуі керек.
Сенім ақаулары сертификаттағы атауға қатысты
NSURLErrorServerCertificateUntrusted оның астындағы TLS қатесімен бірге тізбектің немесе жеке басын тексерудің сәтсіз болғанын білдіреді. Ішкі CA құрылғыда сенімді болуы керек, ал басқа хост атауына берілген сертификат кез келген желілік қайта конфигурациялаудан кейін де қате болып қалады. Apple компаниясының App Transport Security нұсқаулығы осы URL жүктейтін қосылымдарға әлі де қолданылады, ал қарапайым HTTP қызметінің айналасындағы туннель сол қызметті ұшынан ұшына қауіпсіз етпейді.
Сәйкестікті немесе сенім тірегін түзетіңіз және ерекшеліктер тізімін бос ұстаңыз. Ерікті жүктеуге арналған жалпы ерекшелік әзірлеу кезінде ақауды жасырады және кейін оны әр пайдаланушы үшін орнында қалдырады.
HTTP бас тартуы қолданбаға жатады, желіге емес
Аяқталған қол алысудан кейінгі 401 немесе 403 сұраныстың жеткенін және қызметтің одан бас тартқанын білдіреді, сондықтан қалған сұрақ — тіркелгі, токен аудиториясы, ауқым немесе кілт. Күй кодын және хост атауын жазыңыз, ешқашан тасымалдаушы токенді немесе жауап денесін жазбаңыз. Сол сәтте туннель өз жұмысын істеп тұр, ал одан әрі желілік өзгерістер нақты түзетуді ғана кідіртеді.
Кесте — терминалдың қасында ұстайтын жіктеу: қолданба шынымен хабарлай алатын әрбір ақау үшін бір жол. Кодты оқымас бұрын басып шығарыңыз, өйткені таңдаған жолыңыз қай бөлімді пысықтайтыныңызды шешеді.
| Where it fails | What the app sees | First check |
|---|---|---|
| name resolution | NSURLErrorCannotFindHost (-1003) | resolve the fully qualified name from the device itself |
| no path, or no answer | NSURLErrorTimedOut (-1001) | is this bundle inside the per-app mapping, and is the service path allowed |
| TLS trust | NSURLErrorServerCertificateUntrusted (-1202) | does the certificate name match the host, and is the internal CA trusted |
| service refusal | HTTP 401 or 403 after a completed handshake | account, token audience, scope or key |
Әр жол оның астындағыдан арзанырақ тексеріледі, және әрқайсысы сол сұраныстың басқа қабатын жоққа шығарады. Кестемен төмен түсіңіз, жол сәйкес келгенше, содан кейін желіні өзгертуді тоқтатыңыз.