مواقع البناء تقع حيث لا تكون الشبكة: أطراف المدن، القبو، منتصف مشروع طرق، الدور الثامن عشر من هيكل خرساني. ومع ذلك يُختبر أغلب برامج المقاولات في مكتب بشبكة ممتازة، ويُشترى بناءً على ذلك الاختبار. النتيجة أن الفريق الميداني يعود إلى الورقة خلال شهر، ويُدخل المكتب البيانات مساءً — وهي بالضبط الحالة التي اشتُري البرنامج لإنهائها.
أهم ما في المقال
- «يدعم العمل بلا اتصال» عادةً تعني «يعرض بيانات مخزّنة» — والفارق كله في إمكانية الكتابة لا القراءة.
- طابور مزامنة واحد فقط. الطابوران المتوازيان ينتجان تسجيلات مكررة على الشبكات المتقطعة.
- المزامنة تتوقف عند الخطأ ولا تتخطاه — التخطي يترك فجوات صامتة في السجل.
- المعرّف الفريد يُولَّد على الجهاز قبل الإرسال، وهو ما يمنع التكرار عند إعادة المحاولة.
- البيانات الشخصية لا تُخزَّن في ذاكرة المتصفح المؤقتة — التخزين المحلي للمعاملات المعلّقة شيء، وتخزين ردود الخادم شيء آخر.
المشكلة ليست الشبكة الضعيفة، بل المتقطعة
انعدام الشبكة تماماً حالة سهلة نسبياً: التطبيق يعرف أنه غير متصل ويتصرف على هذا الأساس. الحالة الصعبة هي الشبكة المتقطعة — إشارة تظهر وتختفي كل بضع ثوانٍ، أو اتصال قائم فنياً لكن بسرعة تجعل الطلب ينتهي بالمهلة.
في هذه الحالة، متصفح الجهاز يقول «متصل»، والتطبيق يرسل الطلب، والطلب يُسلَّم إلى الخادم فعلاً — لكن الرد لا يعود قبل انتهاء المهلة. التطبيق يظن أن العملية فشلت، فيعيد المحاولة. والخادم استقبلها مرتين.
الاختبار الحقيقي لأي تطبيق ميداني ليس «هل يعمل بدون إنترنت؟» بل «ماذا يحدث حين تنقطع الشبكة في منتصف الإرسال؟».
القراءة بلا اتصال سهلة، الكتابة هي المسألة
حين يقول مزود برنامج إن تطبيقه «يعمل بدون إنترنت»، اسأل سؤالاً واحداً: هل أستطيع إنشاء سجل جديد وأنا غير متصل؟ الفرق بين الإجابتين هو الفرق بين ميزة تسويقية وميزة تشغيلية.
| المستوى | ما يستطيعه المستخدم | الجهد الهندسي |
|---|---|---|
| عرض مخزّن مؤقتاً | رؤية آخر بيانات حُمِّلت وهو متصل | منخفض |
| قراءة كاملة | تصفح المشاريع والمهام والمخططات كاملة بلا اتصال | متوسط |
| كتابة مع طابور | إنشاء وتعديل السجلات، والمزامنة لاحقاً | عالٍ |
| كتابة مع حل تعارض | كل ما سبق، مع التعامل مع تعديل متزامن من مستخدم آخر | عالٍ جداً |
أغلب المنتجات تقف عند المستوى الأول وتسوّق نفسها كأنها في الثالث. والفريق الميداني يكتشف الفرق في اليوم الأول من الاستخدام الحقيقي.
كيف يُبنى طابور المزامنة
الفكرة الأساسية: التطبيق لا يرسل إلى الخادم مباشرة أبداً. يكتب العملية في طابور محلي، ويحاول الطابور إرسالها. هذا الفصل هو ما يجعل السلوك موحداً سواء كانت الشبكة موجودة أم لا.
توليد معرّف فريد على الجهاز
قبل الحفظ المحلي، يُولَّد معرّف عالمي (UUID) للعملية. هذا المعرّف يُرسل مع الطلب، فيستطيع الخادم أن يميّز «عملية جديدة» من «إعادة إرسال لعملية استقبلها سابقاً».
الكتابة المحلية أولاً
العملية تُخزَّن في IndexedDB مع حالتها ووقت إنشائها. المستخدم يرى النتيجة فوراً في الواجهة — لا انتظار لرد الخادم.
الإرسال بترتيب الإنشاء
الطابور يُفرَّغ بترتيب زمني صارم. إرسال تعديل قبل إنشاء السجل الذي يعدّله ينتج خطأ مضللاً في الخادم.
التوقف عند خطأ التحقق لا التخطي
إذا رفض الخادم عملية لخطأ في البيانات، يتوقف الطابور ويُعرض الخطأ للمستخدم. الاستمرار يعني أن العمليات التالية — التي قد تعتمد على المرفوضة — ستفشل بصمت أو تنتج بيانات خاطئة.
إعادة المحاولة بتباعد متزايد لأخطاء الشبكة فقط
خطأ الشبكة يستحق إعادة المحاولة؛ خطأ التحقق (٤٠٠) لا يستحقها أبداً — إعادة إرسال بيانات غير صالحة لن تجعلها صالحة.
التعارض: ماذا لو عدّل شخصان الشيء نفسه؟
مهندس الموقع يحدّث نسبة إنجاز مهمة وهو بلا اتصال في الساعة العاشرة. مدير المشروع يحدّث النسبة نفسها من المكتب في الحادية عشرة. يعود المهندس إلى التغطية في الواحدة ظهراً وتُرسل عمليته. أي القيمتين تبقى؟
لا توجد إجابة صحيحة تقنياً — الإجابة تعتمد على المجال. لكن هناك ثلاث سياسات، واختيار واحدة صراحةً أفضل بكثير من تركها للصدفة.
- آخر كتابة تفوز: الأبسط، والمقبول لبيانات لا يضر فقدان نسخة منها (ملاحظة نصية مثلاً).
- الرفض عند تغيّر النسخة: الخادم يرفض العملية إذا تغيّر السجل منذ قراءته، ويُعرض على المستخدم أن يراجع ويعيد المحاولة. الأنسب للأرقام المالية والكميات.
- الدمج على مستوى الحقل: العمليتان تُقبلان إن كانتا تعدّلان حقلين مختلفين. الأفضل تجربة للمستخدم والأعلى تكلفة هندسية.
ما الذي يجب ألا يُخزَّن على الجهاز
الحماس للعمل بلا اتصال يقود أحياناً إلى تخزين كل شيء محلياً. هذا خطأ أمني، وهو أخطر في منصة متعددة المستأجرين حيث قد يُستخدم الجهاز نفسه من أكثر من شخص.
- ردود الخادم التي تحتوي بيانات شخصية (رواتب، بيانات عمال، مستندات موارد بشرية) لا تُخزَّن في ذاكرة المتصفح المؤقتة.
- صفحة البديل عند انقطاع الاتصال يجب أن تكون صفحة ثابتة لا تخص مستأجراً بعينه — لا لوحة تحكم مخزّنة، وإلا عُرضت بيانات مستخدم على مستخدم آخر.
- رموز الجلسة لا تُخزَّن في التخزين المحلي القابل للقراءة من أي سكربت.
- ما يُخزَّن هو المعاملات المعلّقة التي أنشأها المستخدم الحالي — لا نسخة من قاعدة البيانات.
العمل بلا اتصال يعني أن تحتفظ بما لم تُرسله بعد، لا أن تحتفظ بنسخة من كل ما استقبلته.
أسئلة تكشف الادعاء
قبل شراء أي منصة ميدانية، هذه الأسئلة الخمسة تكشف مستوى الدعم الحقيقي خلال دقائق:
- هل أستطيع إنشاء تقرير يومي جديد ورفع صورة عليه وأنا في وضع الطيران؟
- ماذا يحدث إذا أغلقت التطبيق تماماً قبل عودة الشبكة — هل تبقى العملية؟
- إذا انقطع الاتصال أثناء الإرسال، هل يظهر السجل مرة واحدة أم مرتين؟
- إذا رفض الخادم عملية في منتصف الطابور، ماذا يحدث للعمليات التالية؟
- ما الذي يُخزَّن على الجهاز، ومتى يُمسح، وماذا يحدث عند تسجيل الخروج؟
اطلب عرضاً حياً لا إجابة في مستند. تجربة الأسئلة الثلاثة الأولى على هاتف في وضع الطيران تستغرق أقل من خمس دقائق وتغني عن مقارنة جداول الميزات كاملة.
كيف بُنيت مقاول
مقاول تطبيق ويب تقدمي (PWA) مبني على هذا النموذج: مصدر واحد للحقيقة للمعاملات المعلّقة، مخزّن في IndexedDB، يُفرَّغ بترتيب الإنشاء ويتوقف عند أخطاء التحقق بدل تخطيها.
- التقارير اليومية وتحديثات المهام وتسجيلات الحضور تُنشأ بلا اتصال وتتزامن لاحقاً.
- معرّف فريد يُولَّد على الجهاز لكل عملية، فيمنع التكرار عند إعادة المحاولة.
- طلبات الواجهة البرمجية لا تُخزَّن مؤقتاً إطلاقاً — الردود قد تحتوي بيانات شخصية.
- صفحة البديل عند انقطاع الاتصال ثابتة ولا تخص مستأجراً بعينه.
- يعمل على أي هاتف أندرويد دون تنزيل من متجر التطبيقات.
أسئلة شائعة
ما الفرق بين تطبيق الويب التقدمي والتطبيق الأصلي في العمل بلا اتصال؟
من ناحية القدرة على العمل بلا اتصال، الفرق صغير اليوم: كلاهما يخزّن محلياً ويزامن لاحقاً. الفرق العملي في التوزيع — تطبيق الويب التقدمي يُثبَّت من الرابط مباشرة دون متجر تطبيقات، وهو ما يهم كثيراً حين يكون فريقك الميداني على أجهزة متنوعة ولا تريد إدارة تحديثات المتجر.
كم من الوقت يمكن للتطبيق أن يعمل بلا اتصال؟
مدة العمل نفسها غير محدودة عملياً — الحد هو مساحة التخزين على الجهاز وعدد العمليات المعلّقة. القيد الحقيقي هو انتهاء صلاحية جلسة الدخول، لذا يجب أن يوضح التطبيق للمستخدم متى يحتاج إلى اتصال لتجديد الجلسة قبل أن يفاجئه بذلك.
هل تُفقد البيانات إذا أغلق العامل التطبيق قبل المزامنة؟
لا، إن كانت العمليات مخزّنة في IndexedDB — فهي تبقى بعد إغلاق التطبيق وإعادة تشغيل الجهاز. البيانات تُفقد فقط إذا مسح المستخدم بيانات المتصفح يدوياً أو ألغى تثبيت التطبيق.
ماذا عن رفع الصور بلا اتصال؟
الصور تُخزَّن محلياً كملفات ثنائية وتُرفع مع عمليتها عند عودة الشبكة. النقطة المهمة هي ضغط الصورة على الجهاز قبل التخزين — صور بحجم ١٢ ميغابايت في طابور من ثلاثين عملية ستستهلك مساحة الجهاز وتجعل المزامنة بطيئة على شبكة ضعيفة.
هل نحتاج فعلاً كل هذا إذا كانت مواقعنا داخل المدن؟
حتى داخل المدن، القبو والمصعد والأدوار السفلية من الهياكل الخرسانية تظل مناطق بلا تغطية. والفارق أن التطبيق المبني للعمل بلا اتصال لا يتصرف بشكل مختلف في هذه الحالات — لا شاشة خطأ ولا عمل ضائع، فقط تأخير في المزامنة لا يلاحظه المستخدم.
جرّبها في وضع الطيران
أنشئ حساباً، افتح مقاول على هاتفك، فعّل وضع الطيران، وسجّل تقريراً يومياً. ثم أعد الاتصال وشاهده يتزامن.