Network request failed في تطبيق Expo على أندرويد

تطبيق Expo يشتغل في التطوير ويطلع Network request failed على أندرويد؟ الأسباب الخمسة الأشهر: http، و localhost، والشهادة، وكيف تتأكد.

22 أكتوبر 2026 (11 جمادى الأولى 1448 هـ) · قراءة 4 دقائق · كتبها م. معاذ أحمد

تطبيقك على الجوال مبني بـ Expo أو React Native، يشتغل في المحاكي أو في Expo Go، وفي أندرويد يطلع TypeError: Network request failed. وأحيانًا يشتغل عندك ويتعطّل في النسخة اللي نزّلتها على Google Play. الرسالة نفسها ما تقول السبب: كل اللي تقوله إن الجوال حاول يكلّم السيرفر وما وصل.

إيش يعني بالضبط

fetch في تطبيق الجوال حاولت ترسل طلب، وفشل الاتصال قبل ما يرجع أي رد. ما فيه رقم خطأ مثل 404 أو 500، لأن السيرفر ما رد أصلًا، أو أندرويد منع الطلب قبل ما يطلع. عشان كذا الحل يبدأ بسؤال واحد: ليش الجوال ما وصل؟

الأسباب الأشهر

1. الرابط يبدأ بـ http مو https

من أندرويد 9، التطبيقات ممنوعة افتراضيًا من الاتصال بروابط http:// غير مشفّرة. في وضع التطوير هذا غالبًا مسموح عشان يسهّل الشغل، فكل شيء يشتغل. أول ما تبني النسخة النهائية، الطلبات تنمنع. هذا أكثر سبب لـ «يشتغل في التطوير وما يشتغل من المتجر».

2. localhost في الكود

localhost أو 127.0.0.1 في الجوال يعني الجوال نفسه، مو جهازك اللي عليه السيرفر. في محاكي أندرويد، جهازك عنوانه 10.0.2.2. والجوال الحقيقي يحتاج عنوان جهازك على الشبكة، أو الأفضل: سيرفر حقيقي على دومين.

3. الرابط ما انتقل للنسخة النهائية

إذا رابط السيرفر في متغير مثل EXPO_PUBLIC_API_URL، هذا المتغير ينكتب داخل التطبيق وقت البناء. إذا ما كان موجود في إعدادات البناء على EAS، التطبيق يطلع والرابط فاضي أو يأشّر على جهازك. نفس الفكرة في درس متغيرات تطلع undefined بعد النشر.

4. شهادة SSL ناقصة

موقعك يفتح في المتصفح بدون مشاكل، لكن التطبيق يفشل. السبب كثير إن السيرفر ما يرسل الشهادة الوسيطة (intermediate certificate). متصفحات الكمبيوتر كثير تكمّل الناقص بنفسها، والتطبيقات في أندرويد ما تكمّله، فترفض الاتصال. وشهادة منتهية أو لدومين ثاني نفس النتيجة.

وإذا التطبيق يشتغل في iPhone ويتعطّل في أندرويد فقط، ابدأ بالشهادة قبل أي شيء ثاني: أندرويد ما يكمّل الشهادة الناقصة أبدًا، و iPhone أحيانًا يتسامح معها، لكن Apple نفسها تقول لا تعتمد على هذا.

5. السيرفر نفسه ما يرد

السيرفر واقف، أو جدار حماية يمنع، أو المنفذ غلط. هذا تعرفه لما تجرّب الرابط من متصفح الجوال نفسه.

كيف تتأكد بنفسك

  1. دوّر في الكود على http:// و localhost و 192.168 و 10.0.2.2. أي واحد منها في نسخة رايحة للمتجر هو المشتبه الأول.
  2. افتح رابط السيرفر من متصفح Chrome في جوال أندرويد حقيقي، على بيانات الجوال مو على شبكة البيت. إذا ما فتح، المشكلة في السيرفر أو الشبكة، مو في التطبيق.
  3. افحص الشهادة في SSL Labs: إذا طلع Chain issues: Incomplete، هذا السبب.
  4. تأكد إن متغيرات البيئة موجودة في إعدادات البناء على EAS، مو فقط في ملف .env على جهازك، لأن الملف غالبًا ما يرتفع مع البناء.

الحل الصح

  • السيرفر على دومين حقيقي بـ https:// وشهادة كاملة. Let's Encrypt مجانية، وأغلب منصات الاستضافة تركّبها لك.
  • رابط السيرفر في متغير واحد، موجود في إعدادات كل نوع بناء: تطوير وتجربة ونهائي.
  • جرّب النسخة النهائية (release) على جوال أندرويد حقيقي قبل ما ترفعها للمتجر، مو فقط في Expo Go.
  • خلّ التطبيق يعرض رسالة واضحة لما يفشل الاتصال، مثل «ما قدرنا نوصل، تأكد من الإنترنت وحاول مرة ثانية»، وسجّل الخطأ مع الرابط اللي فشل. بدون هذا، العميل يشوف شاشة فاضية، وأنت ما تعرف إن فيه مشكلة.

الحل اللي لا تسويه

لما تسأل الذكاء الاصطناعي، كثير يقترح تفعيل usesCleartextTraffic عشان يسمح بـ http:// في النسخة النهائية، أو يوقّف التحقق من الشهادة. الاثنين يشغّلون التطبيق، والاثنين يعني إن بيانات عملائك، كلمات السر وأرقام الجوال والطلبات، تمر بدون تشفير، أو لسيرفر يقدر ينتحل شخصيته أي أحد على نفس شبكة الواي فاي. لا تطلّع تطبيق بهالشكل.

إذا ما لقيت السبب

Network request failed سببه غالبًا واحد من الخمسة، وتحديده يحتاج نظرة على الكود وإعدادات البناء والسيرفر مع بعض. في مكالمة استشارية نمر عليها كلها معك. وإذا التطبيق رايح للمتجر قريب، ابدأ بـ قائمة التحقق قبل الإطلاق.

عندك نفس المشكلة؟

علّمنا إيش صار بدون كلام تقني، ونقول لك إيش تحتاج وكم يكلّف.

ابدأ طلبك

بدون أي كلمة سر · عرض السعر مجاني