API:et svarar i Safari på samma telefon, medan appens begäran får tidsgräns. Den luckan är oftast inte tunneln: en app som anropar en intern tjänst skickar en vanlig HTTPS-begäran, och den befintliga VPN:en på enheten avgör bara om begäran har en väg. Att skriva in en andra tunnel i appen är ett produktbeslut, inte en reparation för en tidsgräns. Det som följer klassificerar felet efter var det inträffar, med hjälp av den felyta som appen redan har.

Börja med felet, inte tunneln

URLSession rapporterar transportfel som NSError värden i NSURLErrorDomain, och koden är det billigaste bevis som finns. Innan du ändrar någon konfiguration loggar du koden tillsammans med det värdnamn som misslyckas och uppgiftens förflutna tid. En tidsgräns, ett namnfel och ett tillitsfel ser likadana ut på skärmen och kräver tre olika reparationer. Klassificera först och läs sedan avsnittet för den klassen.

Uppgiftsmätvärden svarar på följdfrågan om en anslutning någonsin upprättades, vilket skiljer en begäran som aldrig hade en väg från en som servern tog för lång tid att svara på. Inget av detta kräver att tunneln ändras; det kräver att begärans egen diagnostik skrivs ut någonstans där du kan läsa den.

Namnupplösning misslyckas innan något annat kan

Ett kort kontorsnamn som api.corp.example beror oftast på en sökdomän som telefonen inte har, så appen löser ett namn som bara finns inne i byggnaden. NSURLErrorCannotFindHost är signaturen. Det fullständiga värdnamnet måste lösas genom vilken resolver VPN:en än installerar, och appen bör begära den fullt kvalificerade formen när sökdomänen inte är garanterad. Att byta namn mot en adress och stänga av certifikatkontroller flyttar felet i stället för att reparera det.

En privat DNS-post och ett certifikat utfärdat för exakt det namnet är det par som stöds. Allt annat är en kringgång som når användarna.

En tidsgräns är en fråga om väg, inte om namn

NSURLErrorTimedOut betyder att namnet löstes och inget svarade, vilket pekar på rutten, paketpolicyn eller tjänsten. När tunneln tilldelas per applikation säger en annan app som når samma server inget om din build, eftersom den mappningen inte delas. Kontrollera att paketet du kör ligger inom den tilldelningen och kontrollera sedan att tjänstens väg är tillåten för det. En utvecklingsbuild installerad utanför tilldelningen kan ligga helt utanför tunneln och se ut som ett trasigt API.

En webbläsarjämförelse visar att någon app på enheten har en väg. Den bevisar aldrig att din build har det, och därför måste de två testerna köras separat.

Tillitsfel handlar om namnet på certifikatet

NSURLErrorServerCertificateUntrusted tillsammans med TLS-felet under betyder att kedjan eller identitetskontrollen misslyckades. En intern CA måste vara betrodd på enheten, och ett certifikat utfärdat för ett annat värdnamn är fortfarande fel efter varje omkonfigurering av nätverket. Apples vägledning för App Transport Security gäller fortfarande för dessa URL-laddande anslutningar, och en tunnel runt en vanlig HTTP-tjänst gör inte den tjänsten säker från ände till ände.

Reparera identiteten eller tillitsankaret och håll undantagslistan tom. Ett generellt undantag för godtycklig laddning döljer felet under utvecklingen och lämnar det på plats för varje användare efteråt.

En HTTP-avvisning hör till appen, inte till nätverket

En 401 eller 403 på ett slutfört handskakning betyder att begäran kom fram och att tjänsten avvisade den, så den återstående frågan är ett konto, en tokenpublik, en omfattning eller en nyckel. Logga statuskoden och värdnamnet, aldrig bärartokenen eller svarets brödtext. Vid den punkten gör tunneln sitt jobb och ytterligare nätverksändringar fördröjer bara den riktiga reparationen.

Tabellen är den klassificering du bör ha vid terminalen: en rad per fel som appen faktiskt kan rapportera. Skriv ut koden innan du läser den, eftersom raden du väljer avgör vilket avsnitt du arbetar igenom.

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

Varje rad är billigare att testa än den under, och varje utesluter ett annat lager av samma begäran. Gå nedåt i tabellen tills en rad passar och sluta sedan ändra nätverket.

Relaterade artiklar