Näin kutsut sisäistä APIa iPhone-sovelluksesta VPN:n kautta
Luokittele epäonnistuva pyyntö sen NSURLError-koodin mukaan ennen kuin kosket tunneliin ja korjaa sitten juuri se kerros, joka todella hajosi.
API vastaa Safarissa samassa puhelimessa, mutta sovelluksen pyyntö aikakatkaistaan. Tämä ero ei yleensä ole tunneli: sisäistä palvelua kutsuva sovellus tekee tavallisen HTTPS-pyynnön, ja laitteessa jo oleva VPN päättää vain, onko pyynnöllä reitti. Toisen tunnelin kirjoittaminen sovellukseen on tuotepäätös, ei aikakatkaisun korjaus. Seuraava luokittelee vian sen mukaan, missä se tapahtuu, käyttäen virhepintaa, joka sovelluksella jo on.
Aloita virheestä, älä tunnelista
URLSession raportoi siirtoviat NSError arvoina NSURLErrorDomain:ssa, ja koodi on halvin saatavilla oleva todiste. Ennen kuin muutat mitään asetusta, kirjaa koodi epäonnistuvan isäntänimen ja tehtävän kuluneen ajan kanssa. Aikakatkaisu, nimivika ja luottamusvika näyttävät ruudulla samalta ja vaativat kolme eri korjausta. Luokittele ensin ja lue sitten kyseisen luokan osio.
Tehtävän mittarit vastaavat seuraavaan kysymykseen, muodostettiinko yhteyttä koskaan, mikä erottaa pyynnön, jolla ei koskaan ollut reittiä, pyynnöstä, johon palvelin vastasi liian hitaasti. Mikään tästä ei vaadi tunnelin muuttamista; se vaatii pyynnön omien diagnostiikkojen tulostamista jonnekin, missä voit lukea ne.
Nimien selvitys epäonnistuu ennen kuin mikään muu voi
Lyhyt toimistonimi kuten api.corp.example riippuu yleensä hakutoimialueesta, jota puhelimessa ei ole, joten sovellus selvittää nimen, joka on olemassa vain rakennuksen sisällä. NSURLErrorCannotFindHost on allekirjoitus. Koko isäntänimi on selvitettävä minkä tahansa VPN:n asentaman selvittäjän kautta, ja sovelluksen pitäisi pyytää täysin kelvollista muotoa aina, kun hakutoimialue ei ole taattu. Nimen vaihtaminen osoitteeseen ja varmennevarmenteiden tarkistusten poistaminen käytöstä siirtää vikaa sen korjaamisen sijaan.
Yksityinen DNS-tietue ja juuri sille nimelle myönnetty varmenne ovat tuettu pari. Kaikki muu on kiertotie, joka toimitetaan käyttäjille.
Aikakatkaisu on reittikysymys, ei nimikysymys
NSURLErrorTimedOut tarkoittaa, että nimi selvitettiin eikä mikään vastannut, mikä viittaa reittiin, pakettikäytäntöön tai palveluun. Kun tunneli osoitetaan sovelluskohtaisesti, toinen sovellus, joka tavoittaa saman palvelimen, ei kerro mitään omasta buildistasi, koska sitä mappausta ei jaeta. Tarkista, että käyttämäsi paketti on kyseisen osoituksen sisällä, ja tarkista sitten, että palvelun reitti on sille sallittu. Osoituksen ulkopuolelle asennettu kehitysbuildi voi olla kokonaan tunnelin ulkopuolella ja näyttää rikkinäiseltä API:lta.
Selainvertailu osoittaa, että jollakin laitteen sovelluksella on reitti. Se ei koskaan todista, että omalla buildillasi on, minkä vuoksi kaksi testiä on tehtävä erikseen.
Luottamusviat koskevat varmenteessa olevaa nimeä
NSURLErrorServerCertificateUntrusted yhdessä sen alla olevan TLS-virheen kanssa tarkoittaa, että ketju tai identiteettitarkistus epäonnistui. Sisäinen CA on voitava luottaa laitteessa, ja eri isäntänimelle myönnetty varmenne on edelleen väärä minkä tahansa verkon uudelleenkonfiguroinnin jälkeen. Applen App Transport Security -ohje koskee edelleen näitä URL:aa lataavia yhteyksiä, eikä tavallisen HTTP-palvelun ympärillä oleva tunneli tee siitä palvelusta päästä päähän turvallista.
Korjaa identiteetti tai luottamusankkuri ja pidä poikkeusluettelo tyhjänä. Yleinen poikkeus mielivaltaiselle lataukselle piilottaa vian kehityksen aikana ja jättää sen paikalleen jokaiselle käyttäjälle jälkeenpäin.
HTTP-hylkäys kuuluu sovellukselle, ei verkolle
401 tai 403 täydennetyn kättelyn jälkeen tarkoittaa, että pyyntö saapui ja palvelu hylkäsi sen, joten jäljellä oleva kysymys on tili, tokenin yleisö, laajuus tai avain. Kirjaa tilakoodi ja isäntänimi, älä koskaan bearer-tokenia tai vastauksen runkoa. Siinä vaiheessa tunneli tekee työnsä, ja lisää verkkomuutokset vain viivästyttävät varsinaista korjausta.
Taulukko on luokittelu, joka kannattaa pitää päätteen vieressä: yksi rivi jokaista vikaa kohden, jonka sovellus voi todella raportoida. Tulosta koodi ennen kuin luet sen, koska valitsemasi rivi päättää, minkä osion käyt läpi.
| 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 |
Jokainen rivi on halvempi testata kuin sen alla oleva, ja jokainen sulkee pois saman pyynnön eri kerroksen. Mene taulukkoa alaspäin, kunnes rivi osuu, ja lopeta sitten verkon muuttaminen.