آپ نے نیا بلڈ جاری کیا، VPN پر گئے، اور وہی اسکرین لوڈ ہونا بند ہو گئی۔ Android 9 اور اس کے بعد زیادہ عام وضاحت زیادہ بے کیف ہے: پلیٹ فارم API 28 یا اس سے زیادہ کو ہدف بنانے والی ایپس کے لیے سادہ HTTP مسترد کرتا ہے، اور VPN نے صرف اتنا سیاق بدلا کہ یہ کھل جائے۔ آپ کو جو خرابی نظر آتی ہے وہ HTTP کلائنٹ پر منحصر ہے، اسی لیے یہ اتنی کم cleartext کہتی ہے۔

یہ ناکامی دراصل کیا ہے

Android 9 سے پلیٹ فارم بطور ڈیفالٹ cleartext روکتا ہے، جیسے ہی ایپ API سطح 28 یا اس سے زیادہ کو ہدف بناتی ہے۔ سادہ HTTP پتے کی درخواست پلیٹ فارم نے ایک بھی پیکٹ ڈیوائس سے نکلنے سے پہلے مسترد کر دی جاتی ہے۔ آپ کون سی خرابی دیکھتے ہیں یہ HTTP لائبریری پر منحصر ہے: کبھی عام نیٹ ورک ناکامی، کبھی وقت کا خاتمہ، کبھی ایسا پیغام جو cleartext کا صریح نام لے۔ جو یہ کبھی نہیں کرتا وہ آپ کے سرور تک پہنچنا ہے۔ Android ڈیفالٹ اور ڈومین سے محدود متبادل کو اپنی سیکیورٹی کنفگریشن گائیڈ میں دستاویز کرتا ہے۔

اسی ڈیوائس کا براؤزر اب بھی صفحہ لوڈ کر سکتا ہے، اور یہی وہ سراغ ہے جو زیادہ تر لوگ چھوڑ دیتے ہیں۔ براؤزر آپ کی ایپ کی نیٹ ورک سیکیورٹی پالیسی کے تابع نہیں۔

VPN پر الزام کیوں آتا ہے

عام طور پر تین چیزیں ایک ساتھ بدلتی ہیں۔ VPN جڑنے کے بعد ایپ کوئی اور ہوسٹ نام حل کر سکتی ہے، ڈیوائس نئی اور نئے بلڈ والی ہو سکتی ہے، یا بلڈ خود ایسی ہدف API سطح پر چلا گیا ہو جو ڈیفالٹ کو فعال کرتی ہے۔ VPN نظر آتا ہے اور ہدف SDK نہیں، اس لیے ٹکٹ VPN کو ملتا ہے۔

نیٹ ورک کنفگ کو چھونے سے پہلے پرانے اور نئے بلڈ کی ہدف سطحوں کا موازنہ کریں۔ 27 یا اس سے کم کو ہدف بنانے والی ایپ مستثنیٰ ہے، اور یہی «میرے پرانے فون پر چلتی ہے» جیسی ہر رپورٹ کی وضاحت کرتا ہے۔

Expo پرچم دراصل کہاں گرتا ہے

مینجڈ Expo پروجیکٹ میں app.json میں سیٹنگ شامل کرنا Android مینی فیسٹ میں ترمیم نہیں کرتا، کیونکہ مینی فیسٹ prebuild اور ڈیولپمنٹ بلڈ بناتے ہیں۔ اسی مرحلے پر سیٹنگ کنفگ پلگ ان لکھتا ہے۔ معاون راستہ expo-build-properties ہے، جو ایپ کنفگ میں android کے تحت cleartext آپشن کے ساتھ کنفگر کیا جاتا ہے۔

{
  "plugins": [
    ["expo-build-properties", {
      "android": { "usesCleartextTraffic": true }
    }]
  ]
}

اسنیپٹ صرف پلگ ان آپشن مقرر کرتا ہے؛ مینی فیسٹ بعد میں بنتا ہے۔ prebuild یا نیا ڈیولپمنٹ کلائنٹ بلڈ چلائیں، پھر دوبارہ جانچنے سے پہلے بنے ہوئے AndroidManifest.xml میں android:usesCleartextTraffic دیکھیں، کیونکہ صرف JS سے دوبارہ لوڈ کرنے پر پرانا مینی فیسٹ برقرار رہتا ہے۔ پلگ ان ورژن کو اس Expo SDK سے ملائیں جس پر پروجیکٹ چلتا ہے۔ پلگ ان آپشنز ریلیز کے درمیان بدلتے ہیں، اور کسی دوسرے SDK سے کاپی کیا گیا اسنیپٹ خاموش بے عملی کا قابلِ اعتماد ذریعہ ہے۔

Bare ورک فلو اور زیادہ تنگ آپشن

bare React Native کے لیے مساوی چیز application عنصر پر android:usesCleartextTraffic ہے، یا ایسی نیٹ ورک سیکیورٹی کنفگ جو cleartext کی اجازت صرف نامزد ڈومینز کو دے۔ ڈومین سے محدود شکل ہی ترجیحی ہے، کیونکہ یہ اندرونی API کی اجازت دیتی ہے اور باقی سب HTTPS پر چھوڑ دیتی ہے۔ یہ اپنی استثنا فہرست بھی دستاویز کرتی ہے، اور جائزہ لینے والا ٹھیک اسی حصے کے بارے میں پوچھے گا۔

دونوں میں سے کوئی بھی طریقہ کسی ایسی چیز کے لیے پلیٹ فارم کا ڈیفالٹ نہیں بدلتا جس کا آپ نے نام نہیں لیا۔

پہلے ڈیوائس لاگ سے ثابت کریں

کنفگ میں ترمیم سے پہلے درست ناکامی حاصل کریں۔ منسلک ڈیوائس پر adb logcat پلیٹ فارم کا cleartext انکار دکھاتا ہے اور اُس جزو کا نام لیتا ہے جس نے اسے اٹھایا۔ مسترد شدہ ساکٹ، حل نہ ہونے والا نام یا ناکام TLS ہینڈ شیک بالکل کسی اور جگہ کی طرف اشارہ کرتے ہیں، اور cleartext فعال کرنا ایپ کو بلا وجہ کمزور ہی کرے گا۔

پھر پروڈکشن کو دیانت دار رکھیں۔ جو لیب اینڈ پوائنٹ TLS فراہم نہیں کر سکتا اس کے لیے cleartext قابلِ قبول ہے، اور صرف اُتنے ہی کم وقت کے لیے جتنا آپ منصوبہ بندی کر سکیں۔ اگر API نجی نیٹ ورک کے اندر TLS ختم کر سکتا ہے تو سرٹیفکیٹ ڈیوائس کے ٹرسٹ اسٹور میں رکھیں اور cleartext بند رکھیں، کیونکہ ٹنل اپنے اخراج تک کا راستہ خفیہ کرتا ہے اور اس کے بعد کچھ نہیں۔

اینڈ پوائنٹ کے HTTPS پر جواب دینے لگے تو اجازت ہٹا دیں، دوبارہ بلڈ کریں اور اسی سیشن میں VPN پر اور عام Wi-Fi پر جانچیں۔ ناموں کا حل ان دو راستوں میں مختلف ہو سکتا ہے، اور کون سچ کہہ رہا ہے یہ صرف وہی جوڑی بتاتی ہے۔

متعلقہ مضامین