Како да повикате внатрешен API од iPhone апликација преку VPN
Класифицирајте го неуспешното барање според неговиот NSURLError код пред да го допрете тунелот, потоа поправете го точно тој слој што навистина се скрши.
API одговара во Safari на истиот телефон, а барањето на апликацијата истекува. Оваа разлика обично не е тунелот: апликација што повикува внатрешна услуга прави обично HTTPS барање, а постоечкиот VPN на уредот само одлучува дали тоа барање има пат. Пишувањето втор тунел во апликацијата е продуктна одлука, а не поправка за истекување. Следново го класифицира неуспехот според тоа каде се случува, користејќи ја површината за грешки што апликацијата веќе ја има.
Започнете од грешката, не од тунелот
URLSession ги пријавува транспортните неуспеси како NSError вредности во NSURLErrorDomain, а кодот е најевтиниот достапен доказ. Пред да смените која било конфигурација, запишете го тој код заедно со името на домаќинот што не успева и изминатото време на задачата. Истекувањето, неуспехот на име и неуспехот на доверба изгледаат исто на екранот и бараат три различни поправки. Прво класифицирајте, потоа прочитајте го делот за таа класа.
Метриките на задачата одговараат на следното прашање дали врската воопшто е воспоставена, што го одделува барањето што никогаш немал пат од она на кое серверот одговорил премногу доцна. Ништо од ова не бара менување на тунелот; бара дијагностиката на самото барање да се испечати некаде каде што можете да ја прочитате.
Разрешувањето на имиња не успева пред сѐ друго
Кратко канцелариско име како api.corp.example обично зависи од домен за пребарување што телефонот не го носи, па апликацијата разрешува име што постои само внатре во зградата. NSURLErrorCannotFindHost е потписот. Целото име на домаќинот мора да се разреши преку кој било резолвер што го инсталира VPN, а апликацијата треба да ја побара целосно квалификуваната форма кога доменот за пребарување не е загарантиран. Заменувањето на името со адреса и исклучувањето на проверките на сертификатот го поместува неуспехот наместо да го поправи.
Приватен DNS запис и сертификат издаден точно за тоа име се поддржаниот пар. Сѐ друго е заобиколно решение што стигнува до корисниците.
Истекувањето е прашање на пат, не на име
NSURLErrorTimedOut значи дека името е разрешено и ништо не одговорило, што упатува на маршрутата, политиката на пакети или услугата. Кога тунелот се доделува по апликација, друга апликација што стигнува до истиот сервер не кажува ништо за вашата изградба, бидејќи тоа мапирање не се дели. Проверете дали пакетот што го извршувате е внатре во таа доделба, потоа проверете дали патеката на услугата е дозволена за него. Развојна изградба инсталирана надвор од доделбата може да стои целосно надвор од тунелот и да изгледа како расипан API.
Споредба во пребарувач покажува дека некоја апликација на уредот има пат. Таа никогаш не докажува дека вашата изградба го има, затоа двата теста мора да се изведат одделно.
Неуспесите на доверба се однесуваат на името на сертификатот
NSURLErrorServerCertificateUntrusted заедно со TLS грешката под него значи дека синџирот или проверката на идентитетот не успеале. Внатрешен CA мора да биде доверлив на уредот, а сертификат издаден за друго име на домаќин останува погрешен по какво било преконфигурирање на мрежата. упатството за App Transport Security на Apple продолжува да важи за овие врски што вчитуваат URL, а тунел околу обична HTTP услуга не ја прави таа услуга безбедна од крај до крај.
Поправете го идентитетот или сидрото на доверба и држете ја листата со исклучоци празна. Општ исклучок за произволно вчитување го крие неуспехот за време на развојот и го остава на место за секој корисник потоа.
HTTP одбивањето и припаѓа на апликацијата, не на мрежата
401 или 403 по завршено ракување значи дека барањето пристигнало и услугата го одбила, па останува прашањето за сметка, публика на токен, опсег или клуч. Запишете го кодот на состојбата и името на домаќинот, никогаш носивиот токен или телото на одговорот. Во тој момент тунелот ја врши својата работа, а понатамошните мрежни промени само го одложуваат вистинското поправање.
Табелата е класификацијата што треба да се држи до терминалот: еден ред за секој неуспех за кој апликацијата навистина може да пријави. Испечатете го кодот пред да го прочитате, бидејќи редот што ќе го изберете одлучува кој дел ќе го обработите.
| 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 |
Секој ред е поевтин за тестирање од оној под него, и секој исклучува различен слој од истото барање. Одете надолу по табелата додека не се совпадне ред, потоа престанете да ја менувате мрежата.