Kiel voki internan API el iPhone-a aplikaĵo tra VPN
Klasifiku la malsukcesan peton laŭ ĝia NSURLError-kodo antaŭ ol tuŝi la tunelon, poste riparu ĝuste tiun tavolon, kiu rompiĝis.
La API respondas en Safari sur la sama telefono, dum la peto de la aplikaĵo finiĝas per tempolimo. Tiu interspaco kutime ne estas la tunelo: aplikaĵo, kiu vokas internan servon, faras ordinaran HTTPS-peton, kaj la ekzistanta VPN de la aparato nur decidas, ĉu tiu peto havas vojon. Skribi duan tunelon en la aplikaĵon estas produkta decido, ne riparo por tempolimo. La sekvo klasifikas la malsukceson laŭ tio, kie ĝi okazas, uzante la eraran surfacon, kiun la aplikaĵo jam havas.
Komencu per la eraro, ne per la tunelo
URLSession raportas transportajn malsukcesojn kiel NSError valorojn en NSURLErrorDomain, kaj la kodo estas la plej malmultekosta disponebla pruvo. Antaŭ ol ŝanĝi ajnan agordon, registru tiun kodon kune kun la malsukcesa gastigantnomo kaj la pasinta tempo de la tasko. Tempolimo, nommalsukceso kaj fidmalsukceso aspektas same sur la ekrano kaj postulas tri malsamajn riparojn. Unue klasifiku, poste legu la sekcion por tiu klaso.
Taskaj metrikoj respondas la sekvan demandon, ĉu konekto iam estis establita, kio apartigas peton, kiu neniam havis itineron, de unu, al kiu la servilo tro longe respondis. Nenio el tio bezonas ŝanĝon de la tunelo; ĝi bezonas, ke la propraj diagnostikoj de la peto estu presitaj ie, kie vi povas legi ilin.
Nomresolvo malsukcesas antaŭ ol io ajn alia povas
Mallonga ofica nomo kiel api.corp.example kutime dependas de serĉdomajno, kiun la telefono ne portas, do la aplikaĵo solvas nomon, kiu ekzistas nur ene de la konstruaĵo. NSURLErrorCannotFindHost estas la signo. La plena gastigantnomo devas solviĝi per kiu ajn solvilo la VPN instalas, kaj la aplikaĵo devus peti la plene kvalifikitan formon ĉiam, kiam la serĉdomajno ne estas garantiita. Anstataŭigi la nomon per adreso kaj malŝalti certifikajn kontrolojn movas la malsukceson anstataŭ ripari ĝin.
Privata DNS-rikordo kaj certifikato eldonita por ĝuste tiu nomo estas la subtenata paro. Ĉio alia estas provizora solvo, kiu sendiĝas al uzantoj.
Tempolimo estas demando pri vojo, ne pri nomo
NSURLErrorTimedOut signifas, ke la nomo solviĝis kaj nenio respondis, kio montras al la itinero, la paketa politiko aŭ la servo. Kiam la tunelo estas atribuata po aplikaĵo, alia aplikaĵo, kiu atingas la saman servilon, diras nenion pri via konstruaĵo, ĉar tiu mapado ne estas kunhavigita. Kontrolu, ke la pakaĵo, kiun vi rulas, estas ene de tiu atribuo, poste kontrolu, ke la serva vojo estas permesita por ĝi. Evolua konstruaĵo instalita ekster la atribuo povas stari tute ekster la tunelo kaj aspekti kiel rompita API.
Retumila komparo montras, ke iu aplikaĵo en la aparato havas vojon. Ĝi neniam pruvas, ke via konstruaĵo havas ĝin, kaj tial la du testoj devas esti farataj aparte.
Fidmalsukcesoj rilatas al la nomo sur la certifikato
NSURLErrorServerCertificateUntrusted kune kun la TLS-eraro sub ĝi signifas, ke la ĉeno aŭ la identeckontrolo malsukcesis. Interna CA devas esti fidata sur la aparato, kaj certifikato eldonita por alia gastigantnomo restas malĝusta post ajna kvanto da reta reagordado. La gvidilo pri App Transport Security de Apple daŭre aplikiĝas al ĉi tiuj URL-ŝargantaj konektoj, kaj tunelo ĉirkaŭ ordinara HTTP-servo ne igas tiun servon sekura de fino al fino.
Riparu la identecon aŭ la fidan ankron kaj tenu la esceptliston malplena. Ĝenerala escepto por arbitra ŝargado kaŝas la malsukceson dum evoluo kaj lasas ĝin surloke por ĉiu uzanto poste.
HTTP-malakcepto apartenas al la aplikaĵo, ne al la reto
401 aŭ 403 post kompletigita manpremo signifas, ke la peto alvenis kaj la servo malakceptis ĝin, do la restanta demando estas konto, tokena celgrupo, amplekso aŭ ŝlosilo. Registru la statuskodon kaj la gastigantnomon, neniam la portan tokenon aŭ la respondan korpon. Je tiu punkto la tunelo faras sian laboron, kaj pliaj retaj ŝanĝoj nur prokrastas la veran riparon.
La tabelo estas la klasifiko, kiun teni apud la terminalo: unu vico por ĉiu malsukceso, kiun la aplikaĵo vere povas raporti. Presu la kodon antaŭ ol legi ĝin, ĉar la vico, kiun vi elektas, decidas, kiun sekcion vi prilaboros.
| 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 |
Ĉiu vico estas pli malmultekosta por testi ol tiu sub ĝi, kaj ĉiu ekskludas malsaman tavolon de la sama peto. Iru malsupren la tabelon ĝis vico kongruas, poste ĉesu ŝanĝi la reton.