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 failsWhat the app seesFirst check
name resolutionNSURLErrorCannotFindHost (-1003)resolve the fully qualified name from the device itself
no path, or no answerNSURLErrorTimedOut (-1001)is this bundle inside the per-app mapping, and is the service path allowed
TLS trustNSURLErrorServerCertificateUntrusted (-1202)does the certificate name match the host, and is the internal CA trusted
service refusalHTTP 401 or 403 after a completed handshakeaccount, token audience, scope or key

Յուրաքանչյուր տող ավելի էժան է ստուգել, քան դրա տակինը, և յուրաքանչյուրը բացառում է նույն հարցման մեկ այլ շերտ։ Իջեք աղյուսակով ներքև, մինչև տողը համընկնի, ապա դադարեցրեք ցանցը փոխելը։

Առնչվող հոդվածներ