API-ul răspunde în Safari pe același telefon, în timp ce cererea aplicației expiră. Acest decalaj nu este de obicei tunelul: o aplicație care apelează un serviciu intern face o cerere HTTPS obișnuită, iar VPN-ul deja prezent pe dispozitiv decide doar dacă cererea are o rută. Să scrii un al doilea tunel în aplicație este o decizie de produs, nu o reparație pentru un timeout. Ce urmează clasifică eșecul după locul unde apare, folosind suprafața de erori pe care aplicația o are deja.

Începe cu eroarea, nu cu tunelul

URLSession raportează erorile de transport ca NSError valori în NSURLErrorDomain, iar codul este cea mai ieftină dovadă disponibilă. Înainte de a schimba orice configurație, înregistrează acel cod împreună cu numele de host care eșuează și timpul scurs al sarcinii. Un timeout, o eroare de nume și o eroare de încredere arată la fel pe ecran și necesită trei reparații diferite. Clasifică mai întâi, apoi citește secțiunea pentru acea clasă.

Metricile sarcinii răspund la întrebarea următoare, dacă s-a stabilit vreodată o conexiune, ceea ce separă o cerere care nu a avut niciodată o rută de una la care serverul a răspuns prea încet. Nimic din toate acestea nu cere schimbarea tunelului; cere ca diagnosticele cererii înseși să fie tipărite undeva unde le poți citi.

Rezolvarea numelor eșuează înainte de orice altceva

Un nume scurt de birou precum api.corp.example depinde de obicei de un domeniu de căutare pe care telefonul nu îl are, așa că aplicația rezolvă un nume care există doar în interiorul clădirii. NSURLErrorCannotFindHost este semnătura. Numele complet de host trebuie rezolvat prin orice resolver instalează VPN-ul, iar aplicația ar trebui să ceară forma complet calificată ori de câte ori domeniul de căutare nu este garantat. Înlocuirea numelui cu o adresă și dezactivarea verificărilor de certificat mută eșecul în loc să îl repare.

O înregistrare DNS privată și un certificat emis pentru exact acel nume sunt perechea acceptată. Orice altceva este o ocolire care ajunge la utilizatori.

Un timeout este o chestiune de rută, nu de nume

NSURLErrorTimedOut înseamnă că numele a fost rezolvat și nimic nu a răspuns, ceea ce indică ruta, politica de pachete sau serviciul. Când tunelul este atribuit pe aplicație, o altă aplicație care ajunge la același server nu spune nimic despre build-ul tău, pentru că acea mapare nu este partajată. Verifică dacă pachetul pe care îl rulezi se află în acea atribuire, apoi verifică dacă calea serviciului este permisă pentru acel pachet. Un build de dezvoltare instalat în afara atribuirii poate sta complet în afara tunelului și poate arăta ca un API defect.

O comparație în browser arată că vreo aplicație de pe dispozitiv are o rută. Nu demonstrează niciodată că build-ul tău are una, de aceea cele două teste trebuie rulate separat.

Eșecurile de încredere privesc numele de pe certificat

NSURLErrorServerCertificateUntrusted împreună cu eroarea TLS de sub el înseamnă că lanțul sau verificarea identității a eșuat. Un CA intern trebuie să fie de încredere pe dispozitiv, iar un certificat emis pentru un alt nume de host rămâne greșit după orice reconfigurare de rețea. Ghidul App Transport Security al Apple se aplică în continuare acestor conexiuni care încarcă URL, iar un tunel în jurul unui serviciu HTTP simplu nu face acel serviciu sigur de la un capăt la altul.

Repară identitatea sau ancora de încredere și păstrează lista de excepții goală. O excepție generală pentru încărcare arbitrară ascunde eșecul în timpul dezvoltării și îl lasă pe loc pentru fiecare utilizator după aceea.

O respingere HTTP aparține aplicației, nu rețelei

Un 401 sau 403 după un handshake finalizat înseamnă că cererea a ajuns și serviciul a refuzat-o, așa că întrebarea rămasă este un cont, un public de token, un domeniu sau o cheie. Înregistrează codul de stare și numele de host, niciodată tokenul purtător sau corpul răspunsului. În acel moment tunelul își face treaba, iar alte modificări de rețea doar întârzie reparația reală.

Tabelul este clasificarea de păstrat lângă terminal: un rând pentru fiecare eșec pe care aplicația îl poate raporta cu adevărat. Tipărește codul înainte de a-l citi, pentru că rândul pe care îl alegi decide prin ce secțiune lucrezi.

Where it failsWhat the app seesFirst check
name resolutionNSURLErrorCannotFindHost (-1003)resolve the fully qualified name from the device itself
no path, or no answerNSURLErrorTimedOut (-1001)is this bundle inside the per-app mapping, and is the service path allowed
TLS trustNSURLErrorServerCertificateUntrusted (-1202)does the certificate name match the host, and is the internal CA trusted
service refusalHTTP 401 or 403 after a completed handshakeaccount, token audience, scope or key

Fiecare rând este mai ieftin de testat decât cel de dedesubt, iar fiecare exclude un alt strat al aceleiași cereri. Coborâți tabelul până când un rând se potrivește, apoi opriți schimbarea rețelei.

Articole similare