ٹنل چلنے کے باوجود آپ کا iOS VPN ایپ منقطع کیوں دکھاتا ہے
آپ کا iOS ایپ ٹنل کو کنٹرول کرتا ہے مگر اس کا مالک نہیں، اور مینیجر کی حالت کیش میں ہے۔ پہلے ترجیحات لوڈ کریں، پھر حالت اور انٹرفیس کاؤنٹر پڑھیں۔
آپ کا ایپ کہتا ہے منقطع، مینیو بار کہتی ہے منسلک، اور ٹریفک صاف طور پر بہہ رہی ہے۔ یہ خلا کوئی ریس کنڈیشن نہیں جسے دوبارہ کوشش سے ٹھیک کریں: ایپ اور ٹنل الگ الگ پروسیس ہیں، اور آپ کا کوڈ جو آبجیکٹ پڑھتا ہے وہ سسٹم کی محفوظ کردہ کنفیگریشن کا کیش شدہ منظر ہے۔ Apple کی Personal VPN سطح ایک کنٹرول API ہے، ڈیٹا راستہ نہیں، اور اس کا بیشتر عجیب رویہ اسی ایک حقیقت سے نکلتا ہے۔ ہر کال کے نیچے واقعی کیا ہوتا ہے، یہ ہے۔
مینیجر آبجیکٹ کیش شدہ منظر ہے، ٹنل نہیں
NETunnelProviderManager سسٹم کی ملکیت والے ترجیحات کے ذخیرے سے بھرتا ہے، اس لیے loadFromPreferences مکمل ہونے تک اس کی خصوصیات کا کوئی مطلب نہیں۔ اس سے پہلے connection.status پڑھیں تو آپ کو ڈیفالٹ قدر ملے گی، اور اسی لیے دوبارہ آغاز کے بعد پہلی حالت کی تازہ کاری ٹنل چلنے کے باوجود منقطع بتاتی ہے۔ پہلے لوڈ کریں، پھر اسی تکمیل ہینڈلر سے حالت اور پروٹوکول کنفیگریشن پڑھیں۔ بعد کی تبدیلیاں پولنگ کے بجائے NEVPNStatusDidChange کے ذریعے دیکھیں، اور غور کریں کہ اطلاع On Demand کے شروع کردہ کنکشنز کے لیے بھی آتی ہے، جہاں کچھ واپس کرنے والی کوئی ایپ کال ہی نہیں۔ پروٹوکول سیٹنگز پر بھی یہی لاگو ہے: وہ لوڈ شدہ کنفیگریشن سے پڑھی جاتی ہیں، ایپ کے بھیجے ہوئے سے نہیں۔
ٹنل خود Network Extension فراہم کنندہ کے پروسیس میں رہتا ہے، اس لیے ایپ کنکشن کھوئے بغیر اپنی حالت کھو سکتا ہے۔ انٹرفیس جو کچھ دکھاتا ہے وہ مینیجر سے دوبارہ بنانا ہوگا، پچھلے سیشن سے یاد نہیں رکھنا۔
شروع کرنے کی ترتیب: محفوظ کریں، لوڈ کریں، پھر شروع کریں
فراہم کنندہ پر مبنی کنکشن کو ترتیب سے تین مراحل درکار ہیں۔ فراہم کنندہ کی کنفیگریشن لکھیں اور saveToPreferences کال کریں، مینیجر لوڈ کریں تاکہ محفوظ کنفیگریشن وہی ہو جو آپ کے ہاتھ میں ہے، پھر NETunnelProviderSession.startVPNTunnel() کے ذریعے شروع کریں۔ محفوظ کرنا چھوڑ دیں تو آغاز کے پاس شروع کرنے کو کچھ نہیں؛ محفوظ کرنے سے پہلے لوڈ کریں تو مینیجر اب بھی پرانی کنفیگریشن ظاہر کرتا ہے۔
startVPNTunnel جو بولین واپس کرتا ہے وہ صرف یہ کہتا ہے کہ درخواست قبول ہوئی۔ فراہم کنندہ سطح کی ناکامیاں بعد میں منقطع حالت میں تبدیلی کے طور پر آتی ہیں، جنہیں آپ NEVPNStatusDidChange اطلاع کے ذریعے دیکھتے ہیں، اور اطلاع ہینڈلر کو loadFromPreferences کے بعد connection.status دوبارہ پڑھنا ہوگا کیونکہ کیش شدہ قدر اب بھی پرانی ہو سکتی ہے۔ درخواست سطح کی ناکامیاں کال کی استثنا پھینکنے والی شکل سے فوراً واپس آتی ہیں، یا startVPNTunnelAndReturnError: کے خطا آؤٹ پیرامیٹر کے ذریعے۔ جو کوڈ واپسی قدر کو نتیجہ سمجھتا ہے وہ ایسے کنکشن کی اطلاع دیتا ہے جو کبھی قائم نہیں ہوا۔ دوسری خاموش ناکامی وہ فراہم کنندہ بنڈل شناخت کنندہ ہے جو نصب شدہ ایکسٹینشن سے میل نہیں کھاتا: درخواست مسترد ہو جاتی ہے، اور پیغام میں کچھ بھی شناخت کنندہ کی طرف اشارہ نہیں کرتا۔ اگر شناخت کنندہ غلط ہو تو درخواست عام طور پر فوراً ناکام ہوتی ہے، فراہم کنندہ کی ایک بھی لاگ لائن آنے سے پہلے۔
آغاز کے بعد ترجیحات دوبارہ لوڈ کرنا ہی حالت سکرینوں کو درست بناتا ہے۔ سسٹم کنفیگریشن بدلتا ہے تو مینیجر آپ کی طرف نئی کنفیگریشن نہیں دھکیلتا۔
اعتماد کا مواد پروفائل کے ذریعے آتا ہے، کبھی ایپ کوڈ سے نہیں
ایپ کے پاس iOS اعتماد ذخیرے میں روٹ سرٹیفکیٹ شامل کرنے کا کوئی معاون طریقہ نہیں، اس لیے Personal VPN کنفیگریشن صرف اسی مواد کا حوالہ دے سکتی ہے جس پر ڈیوائس پہلے سے اعتماد کرتی ہے: نصب شدہ پروفائل، ڈیوائس مینجمنٹ یا کسی CA نے قائم کردہ زنجیر جس پر سسٹم دیگر وجوہات سے اعتماد کرتا ہے۔ جو ایپ پہلی بار چلنے پر اپنا CA بناتا ہے اور توقع کرتا ہے کہ سسٹم اسے مانے گا، وہ فراہم کنندہ کے اندر تصدیق میں ناکام ہوگا، جہاں ایپ کا انٹرفیس وجہ نہیں دیکھ سکتا۔
اس حد کو جیسا ہے ویسا ڈیزائن کی پابندی سمجھیں اور اندراج پروفائل کے ساتھ اعتماد اینکر بھیجیں۔ VPN توثیق کو اعتماد کے فیصلے سے الگ رکھیں، کیونکہ وہ الگ جگہوں پر ناکام ہوتے ہیں اور الگ لوگ انہیں ڈیبگ کرتے ہیں۔
کاؤنٹر انٹرفیس سے آتے ہیں، VPN API سے نہیں
مینیجر حالت اور کنفیگریشن ظاہر کرتا ہے، اور ہر ٹنل کے بائٹ گننے والا کچھ نہیں۔ اگر آپ کو استعمال کے اعداد درکار ہوں تو getifaddrs() کال کریں اور متعلقہ انٹرفیس کے لیے if_data پڑھیں: Wi-Fi کے لیے en0، سیلولر کے لیے pdp_ip انٹرفیس، اور خود ٹنل کے لیے utun ڈیوائس۔ utun کاؤنٹر اندرونی ٹریفک بیان کرتے ہیں اور پروٹوکول اوور ہیڈ شامل رکھتے ہیں۔
یہ اعداد اندازے ہیں، فی ایپ حساب نہیں، اور انٹرفیس دوبارہ بننے پر وہ ری سیٹ ہو جاتے ہیں۔ انٹرفیس میں انہیں اسی طرح لیبل کریں، ورنہ کوئی انہیں گاہک کو بل کرنے کے لیے استعمال کرے گا۔ اگر آپ کو فی ایپ اعداد درکار ہوں تو بالکل الگ طریقہ کار چاہیے، ان فیلڈز کا بہتر مطالعہ نہیں۔
صفائی stopVPNTunnel میں ہے، اختتام میں نہیں
applicationWillTerminate آپ کو چند سیکنڈ دیتا ہے اس سے پہلے کہ سسٹم پروسیس کو مار سکے، جو کنکشن توڑنے کے لیے قابل اعتماد جگہ نہیں۔ روکنے کی ہدایت stopVPNTunnel() کو بھیجیں یا فراہم کنندہ کے اسٹاپ کال بیک میں سنبھالیں، اور وہ مینیجر یا کنفیگریشن شناخت کنندہ رکھیں جس سے آپ نے آغاز کیا تاکہ روکنا ڈیوائس کی ہر کنفیگریشن کے بجائے اسی کنکشن کو نشانہ بنائے۔
وہ شناخت کنندہ اس پروفائل کے ساتھ محفوظ کریں جس کا وہ ہے، کیونکہ مینیجر آبجیکٹ یہ درج نہیں کرتا کہ صارف نے کون سی کنفیگریشن منتخب کی۔ اور یاد رکھیں کہ On Demand کا اٹھایا ہوا کنکشن اپنے پیچھے کوئی ایپ کال نہیں رکھتا، اس لیے حالت سکرین کو کچھ بھی کھینچنے سے پہلے اب بھی ترجیحات لوڈ کرنی ہوں گی۔