পছন্দসমূহ লোড না হওয়া পর্যন্ত NEVPNManager স্ট্যাটাস অবৈধ
loadFromPreferences শেষ হওয়ার আগে স্ট্যাটাস পড়া বা সেভ করা পুরনো বা ব্যর্থ ফল দেয়। লোডের ক্রম, কীচেইন রেফারেন্স ও অ্যাক্সেস গ্রুপ এটাই নির্ধারণ করে।
অ্যাপটি আবার চালু করুন, ম্যানেজারের কাছে সংযোগের স্ট্যাটাস জিজ্ঞাসা করুন—সে বলবে সংযোগ বিচ্ছিন্ন, অথচ সিস্টেম মেনু স্পষ্টভাবে একটি সক্রিয় টানেল দেখাচ্ছে। অথবা একটি সেভ কল এমন ত্রুটি ফেরত দেয় যা কিছুই ব্যাখ্যা করে না, অথবা একটি শেয়ার্ড সিক্রেট নির্ধারণের কয়েক সেকেন্ড পরই সেটি অনুপস্থিত ঘোষণা করা হয়। তিনটি উপসর্গ, একটি কার্যপ্রণালী: ম্যানেজার হলো সিস্টেম স্টোরের উপর একটি ভিউ, আর ভিউ কেউ লোড না করা পর্যন্ত খালি পড়া যায়।
এর কোনোটির ডিবাগ শুরু করার আগে ঠিক করুন আপনি কোন API ব্যবহার করবেন। সিস্টেমের IPsec বা IKEv2 টানেল বিল্ট-ইন ম্যানেজারের জন্য উপযুক্ত; সিস্টেম যে প্রোটোকল বাস্তবায়ন করে না তার জন্য নিজের প্যাকেট হ্যান্ডলিংসহ টানেল প্রোভাইডার দরকার, এবং ফিল্ডের কোনো সমন্বয়ই তা বদলায় না।
ম্যানেজার হলো একটি স্টোরের উপর ভিউ
ম্যানেজার তৈরি করুন বা আনুন, তাকে তার পছন্দসমূহ লোড করতে বলুন, এবং স্ট্যাটাস পড়া বা প্রোটোকল সেটিংস বদলানোর আগে কমপ্লিশন হ্যান্ডলার শেষ হতে দিন। কাজটি সংরক্ষিত কনফিগারেশন গণনা হলে সব-ভ্যারিয়েন্ট কল ব্যবহার করুন, একটি ইনস্ট্যান্স দুটি কাজে পুনর্ব্যবহার করবেন না। লোড পৌঁছানোর আগে স্ট্যাটাস সাধারণত অবৈধ থাকে, আর অবৈধকে বন্ধ হিসেবে ধরে নেওয়াই সেই বাগ যা অ্যাপকে কেবল রিলঞ্চের পরেই ভুল দেখায়।
লেখাও একই ক্রম অনুসরণ করে। যে ম্যানেজার কখনো কিছু লোড করেনি তার উপর সেভের চেষ্টা উপযোগী বার্তা ছাড়াই ব্যর্থ হতে পারে, কারণ পরিবর্তন প্রযোজ্যের জন্য কোনো সংরক্ষিত পরিচয় নেই। লোড করুন, বদলান, সেভ করুন, তারপর আবার স্ট্যাটাস পড়ুন। সিস্টেম যে অবজেক্টে সংযোগ করে সেটি সংরক্ষিত প্রোফাইল, মেমরিতে আপনি যা সম্পাদনা করছিলেন তা নয়।
স্ট্যাটাস বদল আসে কেবল আপনি তাকিয়ে থাকলে
পছন্দসমূহ লোড হওয়ার পর স্ট্যাটাস সংযোগ বিচ্ছিন্ন, সংযোগ হচ্ছে, সংযুক্ত, পুনঃনিশ্চিতকরণ ও সংযোগ বিচ্ছিন্নের মধ্য দিয়ে যায়। একটি পাঠ থেকে ইন্টারফেস শুরু করুন, তারপর টাইমারে পোলিং না করে পরিবর্তনের নোটিফিকেশন শুনুন। পোলিং ফোরগ্রাউন্ডে কাজ করে আর ব্যাকগ্রাউন্ডে মিথ্যা বলে, এভাবেই অ্যাপে এমন স্পিনার থেকে যায় যা কখনো মেটে না।
নোটিফিকেশন আসে কেবল যখন অ্যাপ ফোরগ্রাউন্ডে থাকে। ব্যাকগ্রাউন্ডে অবস্থা রাখে এমন কিছুই রিলঞ্চের পর পুরনো দেখাবে, তাই চালু হওয়ার সময় এবং অ্যাপ আবার ফোরগ্রাউন্ডে ফেরার সময় রিফ্রেশ করুন। যদি কোনো প্রোভাইডার টানেলের মালিক হয়, তবে সংশ্লিষ্ট সেশন অবজেক্ট দিয়ে তা চালান; সাধারণ সংযোগ প্রপার্টি প্রোভাইডারের জীবনচক্র মডেল করে না।
সিক্রেট হলো রেফারেন্স, স্ট্রিং নয়
শেয়ার্ড সিক্রেট অনুপস্থিত বলে জানানো খুব কমই বোঝায় কেউ সেটি নির্ধারণ করেনি। প্রোটোকল অবজেক্ট একটি রেফারেন্স চায়: একটি ব্যবহারকারীর পাসওয়ার্ডের জন্য, একটি IPsec প্রি-শেয়ার্ড কী-এর জন্য। nil পাঠানো, বা ভুল কীচেইন এন্ট্রি থেকে পাওয়া রেফারেন্স পাঠানো, খালি স্লটের মতোই একই অভিযোগ দেয়। ত্রুটিটি উপসর্গের নাম বলে কারণ লুকায়, তাই মানুষ একই সিক্রেট কয়েকবার আবার লেখে।
আগে সিক্রেটটি সাধারণ পাসওয়ার্ড আইটেম হিসেবে লিখুন, তারপর তার দিকে একটি স্থায়ী রেফারেন্স ফিরে পড়ুন। স্থায়ী রেফারেন্স মেমরির পয়েন্টারের মতো নয়, রিলঞ্চেও টিকে থাকে, আর প্রোফাইল সেটাই সিরিয়ালাইজ করে। এমন অ্যাক্সেসিবিলিটি ক্লাস বাছুন যা ডিভাইস আনলক হওয়ার পরও অ্যাক্সেস দেয়, নইলে লক স্ক্রিনে পুনঃসংযোগ করতে হওয়া টানেল পুরোপুরি বৈধ সিক্রেট নিয়েও প্রমাণীকরণে ব্যর্থ হবে।
এক্সটেনশনের নিজস্ব কীচেইন ভিউ আছে
নেটওয়ার্ক এক্সটেনশন আলাদা প্রসেস, তাই অ্যাপের ডিফল্ট কীচেইন অ্যাক্সেস সেখানে পৌঁছায় না। দুটি টার্গেটকে তাদের এনটাইটেলমেন্টে একই কীচেইন অ্যাক্সেস গ্রুপ দিন, আইটেমটি একবার সেই গ্রুপের ভিতরে সংরক্ষণ করুন এবং প্রতিটি প্রসেসকে তা পড়তে দিন। গ্রুপ ছাড়া এক্সটেনশন কিছুই পায় না এবং এমন ক্রেডেনশিয়াল ব্যর্থতা জানায় যা অ্যাপ পুনরুৎপাদন করতে পারে না।
প্রোভাইডার যদি তার প্রোভাইডার কনফিগারেশন অবজেক্ট দিয়ে কনফিগার হয়, তবে সিক্রেটটি অ্যাপের ভিতরেও এমবেড করবেন না। দুটি কপি আলাদা হয়ে যায়, আর সেই বিচ্যুতি ডুপ্লিকেশন নয়, খারাপ ক্রেডেনশিয়াল হিসেবে দেখা দেয়। ভিন্ন অবস্থা জানানো একটি উইজেট বা দ্বিতীয় প্রসেসেরও একই ব্যাখ্যা: প্রত্যেকের গ্রুপ দরকার, এবং প্রত্যেককে পড়ার আগে পছন্দসমূহ লোড করতে হবে।
API-কে প্রোটোকলের সাথে মিলান
বিল্ট-ইন ম্যানেজার IPsec ও IKEv2 প্রোটোকল অবজেক্ট বহন করে। অতিরিক্ত ফিল্ড দিয়ে এটি সাধারণ SSL VPN ক্লায়েন্টে পরিণত হয় না, আর বেমানান প্রোফাইল পরিষ্কারভাবে সেভ হয়েও কখনো সংযোগ করতে পারে না। স্ট্যাটাস তদন্তের আগে ঠিক করুন আপনি কোন শ্রেণিতে, কারণ স্ট্যাটাস বাগ ও অসমর্থিত প্রোটোকল বাইরে থেকে একই দেখায়।
পরের রিলঞ্চের জন্য চেকলিস্টটি ছোট: পছন্দসমূহ লোড করুন, স্ট্যাটাস পড়ুন, পরিবর্তনের সাবস্ক্রিপশন ফোরগ্রাউন্ডে রাখুন, শেয়ার্ড গ্রুপ থেকে রেফারেন্স আবার গড়ুন, এবং নিশ্চিত করুন প্রোটোকল অবজেক্ট আপনার বাস্তবায়িত API-এর সাথে মেলে। তালিকাটি চালাতে এক মিনিট লাগে; এটি নিয়ে অনুমান করতে পুরো এক বিকেল।