Com cridar una API interna des d'una app de iPhone per VPN
Classifiqueu la sol·licitud que falla pel seu codi NSURLError abans de tocar el túnel i, després, repareu exactament la capa que s'ha trencat.
L'API respon al Safari del mateix telèfon, però la sol·licitud de l'aplicació acaba en temps d'espera. Aquest buit normalment no és el túnel: una aplicació que crida un servei intern fa una sol·licitud HTTPS corrent, i el VPN que ja té el dispositiu només decideix si aquesta sol·licitud té camí. Escriure un segon túnel dins de l'aplicació és una decisió de producte, no una reparació per a un temps d'espera. El que segueix classifica la fallada segons on passa, fent servir la superfície d'error que l'aplicació ja té.
Comenceu per l'error, no pel túnel
URLSession informa de fallades de transport com a NSError valors dins de NSURLErrorDomain, i el codi és l'evidència més barata de què disposeu. Abans de canviar cap configuració, registreu aquest codi amb el nom d'amfitrió que falla i el temps transcorregut de la tasca. Un temps d'espera, una fallada de nom i una fallada de confiança es veuen igual a la pantalla i requereixen tres reparacions diferents. Classifiqueu primer, després llegiu la secció d'aquesta classe.
Les mètriques de la tasca responen la pregunta següent, si mai s'ha establert una connexió, cosa que separa una sol·licitud que no ha tingut mai ruta d'una que el servidor ha trigat massa a respondre. Res d'això no necessita canviar el túnel; necessita que els diagnòstics de la mateixa sol·licitud s'imprimeixin en algun lloc que pugueu llegir.
La resolució de noms falla abans que res més pugui
Un nom d'oficina curt com ara api.corp.example normalment depèn d'un domini de cerca que el telèfon no porta, així que l'aplicació resol un nom que només existeix dins de l'edifici. NSURLErrorCannotFindHost és la signatura. El nom d'amfitrió complet ha de resoldre's a través del resolutor que instal·li el VPN, i l'aplicació hauria de demanar la forma completament qualificada sempre que el domini de cerca no estigui garantit. Canviar el nom per una adreça i desactivar les comprovacions de certificats mou la fallada en lloc de reparar-la.
Un registre DNS privat i un certificat emès per a aquest nom exacte són la parella admesa. Tota la resta és una solució temporal que arriba als usuaris.
Un temps d'espera és una qüestió de camí, no de nom
NSURLErrorTimedOut vol dir que el nom s'ha resolt i que res no ha respost, cosa que apunta a la ruta, la política de paquets o el servei. Quan el túnel s'assigna per aplicació, una altra aplicació que arribi al mateix servidor no diu res sobre la vostra compilació, perquè aquest mapatge no es comparteix. Comproveu que el paquet que executeu sigui dins d'aquesta assignació i, després, que el camí del servei hi estigui permès. Una compilació de desenvolupament instal·lada fora de l'assignació pot quedar completament fora del túnel i semblar una API trencada.
Una comparació amb el navegador mostra que alguna aplicació del dispositiu té camí. Mai no demostra que la vostra compilació en tingui, i per això les dues proves s'han de fer per separat.
Les fallades de confiança van del nom al certificat
NSURLErrorServerCertificateUntrusted juntament amb l'error TLS que hi ha a sota, vol dir que la cadena o la comprovació d'identitat ha fallat. Una CA interna ha de ser de confiança al dispositiu, i un certificat emès per a un altre nom d'amfitrió continua sent incorrecte després de qualsevol reconfiguració de xarxa. la guia d'App Transport Security continua aplicant-se a aquestes connexions que carreguen URL, i un túnel al voltant d'un servei HTTP simple no fa que aquest servei sigui segur d'extrem a extrem.
Repareu la identitat o l'àncora de confiança i manteniu la llista d'excepcions buida. Una excepció general per a càrrega arbitrària amaga la fallada durant el desenvolupament i la deixa al seu lloc per a cada usuari després.
Un rebuig HTTP pertany a l'aplicació, no a la xarxa
Un 401 o 403 després d'un handshake complet significa que la sol·licitud ha arribat i el servei l'ha rebutjada, així que la pregunta que queda és un compte, una audiència de testimoni, un àmbit o una clau. Registreu el codi d'estat i el nom d'amfitrió, mai el testimoni de portador ni el cos de la resposta. En aquest punt el túnel fa la seva feina i més canvis de xarxa només endarrereixen la reparació real.
La taula és la classificació que cal tenir al costat del terminal: una fila per cada fallada que l'aplicació pot informar realment. Imprimiu el codi abans de llegir-lo, perquè la fila que trieu decideix quina secció treballeu.
| 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 |
Cada fila és més barata de provar que la de sota, i cada una descarta una capa diferent de la mateixa sol·licitud. Baixeu per la taula fins que una fila coincideixi i, després, deixeu de canviar la xarxa.