Як выклікаць унутраную 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 працягвае дзейнічаць для гэтых злучэнняў, што загружаюць 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 |
Кожны радок танней праверыць, чым той, што ніжэй, і кожны выключае іншы пласт таго ж запыту. Праходзьце табліцу ўніз, пакуль радок не супадзе, затым спыніцеся змяняць сетку.