API odpovídá v Safari na stejném telefonu, ale požadavek aplikace vyprší. Tato mezera obvykle není tunel: aplikace, která volá interní službu, posílá běžný požadavek HTTPS a stávající VPN na zařízení rozhoduje jen o tom, zda má tento požadavek cestu. Napsat do aplikace druhý tunel je produktové rozhodnutí, ne oprava vypršení. Následující text klasifikuje selhání podle toho, kde nastává, a využívá chybovou plochu, kterou aplikace už má.

Začněte chybou, ne tunelem

URLSession hlásí přenosová selhání jako NSError hodnoty v NSURLErrorDomain, a kód je nejlevnější dostupný důkaz. Než změníte jakoukoli konfiguraci, zaznamenejte tento kód spolu s neúspěšným názvem hostitele a uplynulým časem úlohy. Vypršení, selhání názvu a selhání důvěry vypadají na obrazovce stejně a vyžadují tři různé opravy. Nejprve klasifikujte, potom čtěte sekci pro tuto třídu.

Metriky úlohy odpovídají na následující otázku, zda bylo vůbec navázáno spojení, což odděluje požadavek, který nikdy neměl trasu, od toho, na který server odpovídal příliš dlouho. Nic z toho nevyžaduje změnu tunelu; vyžaduje to vytisknout vlastní diagnostiku požadavku někam, kde ji můžete číst.

Překlad názvů selhává dřív než cokoli jiného

Krátký kancelářský název jako api.corp.example obvykle závisí na vyhledávací doméně, kterou telefon nenosí, takže aplikace přeloží název, který existuje jen uvnitř budovy. NSURLErrorCannotFindHost je podpis. Úplný název hostitele se musí přeložit přes jakýkoli resolver, který VPN nainstaluje, a aplikace by měla žádat plně kvalifikovanou formu, kdykoli není vyhledávací doména garantována. Nahrazení názvu adresou a vypnutí kontrol certifikátů selhání přesouvá, místo aby ho opravilo.

Soukromý záznam DNS a certifikát vydaný pro přesně tento název jsou podporovaná dvojice. Všechno ostatní je objížďka, která se dostane k uživatelům.

Vypršení je otázka cesty, ne názvu

NSURLErrorTimedOut znamená, že se název přeložil a nic neodpovědělo, což ukazuje na trasu, politiku paketů nebo službu. Když je tunel přiřazen pro každou aplikaci, jiná aplikace, která dosáhne stejného serveru, o vašem sestavení nic neříká, protože toto mapování není sdílené. Zkontrolujte, zda je svazek, který spouštíte, uvnitř tohoto přiřazení, a potom zkontrolujte, zda je pro něj cesta služby povolena. Vývojové sestavení nainstalované mimo přiřazení může stát úplně mimo tunel a vypadat jako rozbité API.

Srovnání v prohlížeči ukazuje, že nějaká aplikace v zařízení má cestu. Nikdy to nedokazuje o vašem sestavení, a proto se oba testy musí provádět odděleně.

Selhání důvěry se týkají názvu na certifikátu

NSURLErrorServerCertificateUntrusted spolu s chybou TLS pod ním znamená, že řetězec nebo kontrola identity selhaly. Interní CA musí být v zařízení důvěryhodná a certifikát vydaný pro jiný název hostitele zůstává špatný po jakékoli rekonfiguraci sítě. pokyny App Transport Security se nadále vztahují na tato připojení načítající URL a tunel kolem obyčejné služby HTTP tuto službu nezabezpečí od konce ke konci.

Opravte identitu nebo kotvu důvěry a seznam výjimek nechte prázdný. Plošná výjimka pro libovolné načítání skrývá selhání během vývoje a potom ho nechává na místě pro každého uživatele.

Odmítnutí HTTP patří aplikaci, ne síti

401 nebo 403 po dokončeném handshake znamená, že požadavek dorazil a služba ho odmítla, takže zbývá otázka účtu, publika tokenu, rozsahu nebo klíče. Zaznamenejte stavový kód a název hostitele, nikdy nosný token ani tělo odpovědi. V tu chvíli tunel dělá svou práci a další síťové změny jen odkládají skutečnou opravu.

Tabulka je klasifikace, kterou si nechte vedle terminálu: jeden řádek pro každé selhání, které aplikace skutečně může hlásit. Vytiskněte kód dřív, než ho přečtete, protože řádek, který vyberete, rozhoduje o tom, kterou sekci projdete.

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

Každý řádek se testuje levněji než ten pod ním a každý vylučuje jinou vrstvu stejného požadavku. Postupujte tabulkou dolů, dokud řádek nesedí, a pak přestaňte měnit síť.

Související články