Ինչպես զանգահարել ներքին API-ին iPhone հավելվածից VPN-ի միջոցով
Դասակարգեք ձախողված հարցումը ըստ դրա NSURLError կոդի նախքան թունելին դիպչելը, ապա վերանորոգեք հենց այն շերտը, որն իսկապես կոտրվել է։
API-ն պատասխանում է Safari-ում նույն հեռախոսում, մինչդեռ հավելվածի հարցումը լրանում է ժամկետով։ Այս բացը սովորաբար թունելը չէ: ներքին ծառայություն կանչող հավելվածը սովորական HTTPS հարցում է անում, և սարքում արդեն գոյություն ունեցող VPN-ը միայն որոշում է՝ այդ հարցումն ունի՞ ուղի, թե ոչ։ Հավելվածի մեջ երկրորդ թունել գրելը արտադրանքի որոշում է, ոչ թե ժամկետի լրանալու վերանորոգում։ Հետևյալը դասակարգում է ձախողումը ըստ այն բանի, թե որտեղ է այն տեղի ունենում՝ օգտագործելով այն սխալի մակերեսը, որն արդեն ունի հավելվածը։
Սկսեք սխալից, ոչ թե թունելից
URLSession փոխադրման ձախողումները հաղորդում է որպես NSError արժեքներ NSURLErrorDomain-ում, և կոդը ամենաէժան հասանելի ապացույցն է։ Ցանկացած կոնֆիգուրացիա փոխելուց առաջ գրանցեք այդ կոդը ձախողվող հոսթանվան և առաջադրանքի անցած ժամանակի հետ միասին։ Ժամկետի լրանալը, անվան ձախողումը և վստահության ձախողումը էկրանին նույն տեսքն ունեն և պահանջում են երեք տարբեր վերանորոգում։ Նախ դասակարգեք, հետո կարդացեք այդ դասի բաժինը։
Առաջադրանքի չափիչները պատասխանում են հաջորդ հարցին՝ արդյոք ընդհանրապես կապ է հաստատվել, ինչը առանձնացնում է երբեք ուղի չունեցած հարցումը նրանից, որին սերվերը չափազանց ուշ պատասխանեց։ Այս ամենից ոչինչ թունելը փոխելու կարիք չունի; պետք է, որ հարցման սեփական ախտորոշումը տպվի մի տեղ, որտեղ կարող եք կարդալ այն։
Անվան լուծումը ձախողվում է ամեն ինչից առաջ
Կարճ գրասենյակային անուն, օրինակ՝ api.corp.example սովորաբար կախված է որոնման դոմենից, որը հեռախոսը չի կրում, ուստի հավելվածը լուծում է անուն, որը գոյություն ունի միայն շենքի ներսում։ NSURLErrorCannotFindHost այդ ստորագրությունն է։ Ամբողջական հոսթանվան պետք է լուծվի ցանկացած լուծիչի միջոցով, որը տեղադրում է VPN-ը, և հավելվածը պետք է պահանջի ամբողջությամբ որակավորված ձևը, երբ որոնման դոմենը երաշխավորված չէ։ Անունը հասցեով փոխարինելը և վկայագրի ստուգումներն անջատելը տեղափոխում է ձախողումը՝ փոխանակ այն շտկելու։
Մասնավոր DNS գրառումը և հենց այդ անվան համար թողարկված վկայագիրը աջակցվող զույգն են։ Մնացած ամեն ինչ շրջանցում է, որը հասնում է օգտատերերին։
Ժամկետի լրանալը ուղու հարց է, ոչ անվան
NSURLErrorTimedOut նշանակում է, որ անունը լուծվել է, և ոչինչ չի պատասխանել, ինչը մատնանշում է երթուղին, փաթեթի քաղաքականությունը կամ ծառայությունը։ Երբ թունելը հատկացվում է յուրաքանչյուր հավելվածի, նույն սերվերին հասնող մեկ այլ հավելված ոչինչ չի ասում ձեր կառուցվածքի մասին, քանի որ այդ քարտեզագրումը համատեղ չէ։ Ստուգեք, որ ձեր գործարկած փաթեթը գտնվում է այդ հատկացման մեջ, ապա ստուգեք, որ ծառայության ուղին թույլատրված է դրա համար։ Հատկացումից դուրս տեղադրված մշակման կառուցվածքը կարող է ամբողջությամբ դուրս մնալ թունելից և թվալ որպես կոտրված API։
Զննարկիչի համեմատությունը ցույց է տալիս, որ սարքի ինչ-որ հավելված ուղի ունի։ Այն երբեք չի ապացուցում, որ ձեր կառուցվածքն ունի այն, դրա համար էլ երկու փորձարկումները պետք է անցկացվեն առանձին։
Վստահության ձախողումները վերաբերում են վկայագրի վրա եղած անվանը
NSURLErrorServerCertificateUntrusted՝ դրա տակ գտնվող TLS սխալի հետ միասին, նշանակում է, որ շղթան կամ ինքնության ստուգումը ձախողվել է։ Ներքին CA-ն պետք է վստահելի լինի սարքում, և այլ հոսթանվան համար թողարկված վկայագիրը մնում է սխալ ցանկացած ցանցային վերակազմավորումից հետո։ Apple-ի 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 |
Յուրաքանչյուր տող ավելի էժան է ստուգել, քան դրա տակինը, և յուրաքանչյուրը բացառում է նույն հարցման մեկ այլ շերտ։ Իջեք աղյուսակով ներքև, մինչև տողը համընկնի, ապա դադարեցրեք ցանցը փոխելը։