Kako pozvati interni API iz iPhone aplikacije preko VPN-a
Klasificirajte neuspjeli zahtjev prema njegovom NSURLError kodu prije nego dirnete tunel, a zatim popravite tačno onaj sloj koji se pokvario.
API odgovara u Safariju na istom telefonu, a zahtjev aplikacije istekne. Taj jaz obično nije tunel: aplikacija koja poziva internu uslugu šalje običan HTTPS zahtjev, a postojeći VPN na uređaju samo odlučuje ima li taj zahtjev put. Upisivanje drugog tunela u aplikaciju je produktna odluka, a ne popravka za istek. Ono što slijedi klasificira kvar prema tome gdje se događa, koristeći površinu grešaka koju aplikacija već ima.
Pođite od greške, a ne od tunela
URLSession prijavljuje transportne kvarove kao NSError vrijednosti u NSURLErrorDomain, a kod je najjeftiniji dostupni dokaz. Prije nego promijenite bilo koju konfiguraciju, zapišite taj kod zajedno s imenom hosta koji ne uspijeva i proteklim vremenom zadatka. Istek, kvar imena i kvar povjerenja izgledaju isto na ekranu i traže tri različite popravke. Prvo klasificirajte, zatim pročitajte odjeljak za tu klasu.
Metrike zadatka odgovaraju na sljedeće pitanje, je li veza ikada uspostavljena, što razdvaja zahtjev koji nikada nije imao rutu od onog na koji je server predugo odgovarao. Ništa od ovoga ne traži promjenu tunela; traži da se dijagnostika samog zahtjeva ispiše negdje gdje je možete pročitati.
Razrješavanje imena pada prije svega ostalog
Kratko uredsko ime poput api.corp.example obično zavisi od domene pretrage koju telefon ne nosi, pa aplikacija razrješava ime koje postoji samo unutar zgrade. NSURLErrorCannotFindHost je potpis. Puno ime hosta mora se razriješiti kroz koji god resolver VPN instalira, a aplikacija treba tražiti potpuno kvalificirani oblik kad god domena pretrage nije zagarantovana. Zamjena imena adresom i isključivanje provjera certifikata pomjera kvar umjesto da ga popravi.
Privatni DNS zapis i certifikat izdat za to tačno ime su podržani par. Sve ostalo je zaobilazno rješenje koje stiže do korisnika.
Istek je pitanje puta, a ne imena
NSURLErrorTimedOut znači da je ime razriješeno i da ništa nije odgovorilo, što upućuje na rutu, politiku paketa ili uslugu. Kad se tunel dodjeljuje po aplikaciji, druga aplikacija koja dosegne isti server ne govori ništa o vašem buildu, jer to mapiranje nije dijeljeno. Provjerite je li paket koji pokrećete unutar te dodjele, zatim provjerite je li put usluge za njega dozvoljen. Razvojni build instaliran izvan dodjele može stajati potpuno izvan tunela i izgledati kao pokvaren API.
Poređenje u pregledniku pokazuje da neka aplikacija na uređaju ima put. Ono nikada ne dokazuje da ga vaš build ima, zato se dva testa moraju izvesti odvojeno.
Kvarovi povjerenja tiču se imena na certifikatu
NSURLErrorServerCertificateUntrusted zajedno s TLS greškom ispod njega znači da je lanac ili provjera identiteta pala. Interni CA mora biti pouzdan na uređaju, a certifikat izdat za drugo ime hosta ostaje pogrešan nakon bilo kakvog preuređenja mreže. Appleov vodič za App Transport Security nastavlja se primjenjivati na ove veze koje učitavaju URL, a tunel oko obične HTTP usluge ne čini tu uslugu sigurnom od kraja do kraja.
Popravite identitet ili sidro povjerenja i držite listu izuzetaka praznom. Sveobuhvatni izuzetak za proizvoljno učitavanje skriva kvar tokom razvoja i ostavlja ga na mjestu za svakog korisnika poslije.
HTTP odbijanje pripada aplikaciji, ne mreži
401 ili 403 nakon završenog rukovanja znači da je zahtjev stigao i da ga je usluga odbila, pa je preostalo pitanje račun, publika tokena, opseg ili ključ. Zabilježite statusni kod i ime hosta, nikada nosivi token ni tijelo odgovora. U tom trenutku tunel radi svoj posao, a dalje mrežne promjene samo odgađaju pravu popravku.
Tabela je klasifikacija koju držite uz terminal: jedan red za svaki kvar koji aplikacija zaista može prijaviti. Ispišite kod prije nego ga pročitate, jer red koji odaberete odlučuje koji ćete odjeljak obraditi.
| 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 |
Svaki red je jeftiniji za testiranje od onog ispod njega, i svaki isključuje drugi sloj istog zahtjeva. Idite niz tabelu dok se red ne poklopi, zatim prestanite mijenjati mrežu.