একই ফোনে Safari-তে API উত্তর দেয়, আর অ্যাপের অনুরোধ সময় শেষ হয়ে যায়। এই ব্যবধান সাধারণত টানেল নয়: একটি অভ্যন্তরীণ সেবা ডাকা অ্যাপ একটি সাধারণ 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 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

প্রতিটি সারি নিচের সারির চেয়ে সস্তায় পরীক্ষা করা যায়, আর প্রতিটি একই অনুরোধের ভিন্ন স্তর বাদ দেয়। টেবিল ধরে নিচে নামুন যতক্ষণ একটি সারি মেলে, তারপর নেটওয়ার্ক বদলানো বন্ধ করুন।

সম্পর্কিত নিবন্ধ