Een interne API aanroepen vanuit een iPhone-app via VPN
Classificeer het mislukte verzoek op zijn NSURLError-code voordat u de tunnel aanraakt en repareer daarna precies de laag die echt kapot is.
De API antwoordt in Safari op dezelfde telefoon, terwijl het verzoek van de app in een time-out loopt. Dat gat is meestal niet de tunnel: een app die een interne dienst aanroept, doet een gewoon HTTPS-verzoek, en de bestaande VPN op het apparaat bepaalt alleen of dat verzoek een route heeft. Een tweede tunnel in de app schrijven is een productbeslissing, geen reparatie voor een time-out. Wat volgt, classificeert de fout op waar die optreedt, met het foutoppervlak dat de app al heeft.
Begin bij de fout, niet bij de tunnel
URLSession meldt transportfouten als NSError waarden in NSURLErrorDomain, en de code is het goedkoopste bewijs dat beschikbaar is. Voordat u een configuratie wijzigt, logt u die code samen met de mislukkende hostnaam en de verstreken tijd van de taak. Een time-out, een naamfout en een vertrouwensfout zien er op het scherm hetzelfde uit en vereisen drie verschillende reparaties. Classificeer eerst en lees dan de sectie voor die klasse.
Taakmetrieken beantwoorden de vervolgvraag of er ooit een verbinding tot stand kwam, wat een verzoek dat nooit een route had scheidt van een verzoek waarop de server te langzaam antwoordde. Niets hiervan vereist een wijziging van de tunnel; het vereist dat de diagnostiek van het verzoek zelf ergens wordt afgedrukt waar u die kunt lezen.
Naamresolutie mislukt voordat iets anders kan
Een korte kantoornaam zoals api.corp.example hangt meestal af van een zoekdomein dat de telefoon niet heeft, dus lost de app een naam op die alleen binnen het gebouw bestaat. NSURLErrorCannotFindHost is de signatuur. De volledige hostnaam moet worden opgelost via welke resolver de VPN ook installeert, en de app zou de volledig gekwalificeerde vorm moeten aanvragen wanneer het zoekdomein niet gegarandeerd is. De naam vervangen door een adres en certificaatcontroles uitschakelen verplaatst de fout in plaats van hem te repareren.
Een privé-DNS-record en een certificaat dat voor precies die naam is uitgegeven, zijn het ondersteunde paar. Al het andere is een omweg die bij gebruikers belandt.
Een time-out is een kwestie van route, niet van naam
NSURLErrorTimedOut betekent dat de naam is opgelost en niets antwoordde, wat wijst op de route, het pakketbeleid of de dienst. Wanneer de tunnel per toepassing wordt toegewezen, zegt een andere app die dezelfde server bereikt niets over uw build, omdat die toewijzing niet wordt gedeeld. Controleer of de bundel die u uitvoert binnen die toewijzing valt, en controleer dan of het dienstpad daarvoor is toegestaan. Een ontwikkelbuild die buiten de toewijzing is geïnstalleerd, kan volledig buiten de tunnel staan en eruitzien als een kapotte API.
Een browservergelijking laat zien dat een of andere app op het apparaat een route heeft. Het bewijst nooit dat uw build er een heeft, en daarom moeten de twee tests apart worden uitgevoerd.
Vertrouwensfouten gaan over de naam op het certificaat
NSURLErrorServerCertificateUntrusted samen met de TLS-fout eronder betekent dat de keten of de identiteitscontrole is mislukt. Een interne CA moet op het apparaat worden vertrouwd, en een certificaat dat voor een andere hostnaam is uitgegeven, blijft onjuist na welke herconfiguratie van het netwerk dan ook. Apples richtlijn voor App Transport Security blijft van toepassing op deze URL-ladende verbindingen, en een tunnel rond een gewone HTTP-dienst maakt die dienst niet end-to-end veilig.
Repareer de identiteit of het vertrouwensanker en houd de uitzonderingenlijst leeg. Een algemene uitzondering voor willekeurig laden verbergt de fout tijdens de ontwikkeling en laat hem daarna voor elke gebruiker staan.
Een HTTP-weigering hoort bij de app, niet bij het netwerk
Een 401 of 403 na een voltooide handshake betekent dat het verzoek aankwam en de dienst het weigerde, dus de resterende vraag is een account, een tokenpubliek, een bereik of een sleutel. Log de statuscode en de hostnaam, nooit het bearer-token of de responsbody. Op dat punt doet de tunnel zijn werk en verdere netwerkwijzigingen vertragen alleen de echte oplossing.
De tabel is de classificatie die u naast de terminal houdt: één rij per fout die de app echt kan melden. Druk de code af voordat u hem leest, want de rij die u kiest, bepaalt welke sectie u doorwerkt.
| 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 |
Elke rij is goedkoper te testen dan de rij eronder, en elke sluit een andere laag van hetzelfde verzoek uit. Werk de tabel naar beneden door tot een rij past, en stop dan met het wijzigen van het netwerk.