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

თითოეული სტრიქონი უფრო იაფად საცდელია, ვიდრე მის ქვემოთ არსებული, და თითოეული გამორიცხავს იმავე მოთხოვნის სხვა ფენას. ჩამოდით ცხრილში, სანამ სტრიქონი დაემთხვევა, შემდეგ შეწყვიტეთ ქსელის შეცვლა.

დაკავშირებული სტატიები