EduFlow

الوحدة 5 · الإطلاق

التحديثات عبر الهواء (OTA) وروتين الإصدار

16 دقراءة 4 داختر بحكمة

الدرس في لمحة

أوصل إصلاحات JavaScript إلى مستخدمي Trailhead باستخدام EAS Update، وأبقِ التحديثات متوافقة مع الـ builds المثبّتة عبر القنوات (channels) وإصدارات وقت التشغيل (runtime versions)، وتراجع بأمان، واستقرّ على روتين إصدار مستدام.

  1. 1كيف يصل التحديث إلى الهاتف
  2. 2ما يمكن أن يصل عبر الهواء وما لا يمكن
  3. 3إصدارات وقت التشغيل تُبقي التحديثات متوافقة
  4. 4حين يسوء تحديث
  5. 5روتين إصدار يصمد
  6. 6أين وصلت الآن

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

تُبلغ مستخدمة أن Trailhead يرفض “8,4” مسافةً على هاتفها الألماني. تصلح أداة التحليل في خمس دقائق. ودون أي شيء آخر، يعني إيصال هذا الإصلاح إليها build جديدًا، وإرسالًا، ومراجعة، ثم انتظار أن تحدّث تطبيقها. يختصر EAS Update ذلك إلى أمر واحد: ينشر كود JavaScript وassets جديدة، وتنزّلها نسخ Trailhead المثبّتة في المرة التالية التي تبدأ فيها.

كيف يصل التحديث إلى الهاتف

يحتوي build الإصدار على شيئين: التطبيق الأصلي (كود Swift وKotlin وC++ المترجَم، بما في ذلك كل وحدة أصلية)، وحزمة JavaScript مضمّنة. والتحديث يستبدل الجزء الثاني فقط. حين يبدأ التطبيق، يتحقّق expo-updates من الخادم بحثًا عن حزمة أحدث لقناته وإصدار وقت التشغيل الخاص به. وافتراضيًا، يبدأ فورًا بالكود الذي لديه أصلًا، وينزّل التحديث الجديد في الخلفية، ويستخدمه في التشغيل التالي. لا ينتظر بدء التشغيل الشبكةَ أبدًا، وهذا مهم لتطبيق يُفتح عند بداية درب وفيه خطّ إشارة واحد.

اضبطه مرة واحدة، ثم اصنع builds جديدة لتتضمّن إعدادات التحديث:

Terminal
eas update:configure

هذا يضيف رابط التحديث وruntimeVersion إلى إعدادات تطبيقك. ثم أعطِ كل build profile قناة (channel) في eas.json:

eas.json
{
  "build": {
    "preview": { "distribution": "internal", "channel": "preview" },
    "production": { "autoIncrement": true, "channel": "production" }
  }
}

ونشر تحديث أمر واحد:

Terminal
eas update --channel production --message "Accept comma decimals in distance"

تلتقطه الـ production builds في تشغيلها التالي. انشر على preview أولًا، وتحقّق منه على builds المختبِرين، ثم انشر الكود نفسه على production.

ما يمكن أن يصل عبر الهواء وما لا يمكن

يصل باستخدام eas update يحتاج إلى build جديد وإصدار في المتجر
الـ components والشاشات والتنسيقات والمنطق إضافة وحدة أصلية أو ترقيتها
الصور والخطوط المضمّنة مع JavaScript أوصاف الأذونات وغيرها من الإعدادات الأصلية
إصلاح الأخطاء وتعديل النصوص أيقونة التطبيق وشاشة البداية ومعرّف الحزمة
شاشات جديدة مبنية من وحدات أصلية موجودة ترقيات Expo SDK

هذا هو التمييز بين JavaScript والكود الأصلي من الدرس الثاني في الدورة، وقد صارت له عواقب الآن. إن مسّ تغيير ما الكود الأصلي أو الإعدادات الأصلية، فلا يستطيع التحديث إيصاله.

إصدارات وقت التشغيل تُبقي التحديثات متوافقة

تخيّل أن Trailhead 1.1 يضيف expo-camera. كود JavaScript الخاص به يستورد وحدة أصلية لا تحتويها builds الإصدار 1.0. لو تلقّى مستخدمو 1.0 ذلك التحديث، لانهار التطبيق حين يلمس الكاميرا. يمنع إصدار وقت التشغيل (runtime version) ذلك: كل build وكل تحديث يحمل واحدًا، ولا ينطبق التحديث إلا على الـ builds التي لها إصدار وقت التشغيل نفسه.

app.json
{
  "expo": {
    "version": "1.1.0",
    "runtimeVersion": { "policy": "appVersion" }
  }
}

مع سياسة appVersion، يكون إصدار وقت التشغيل هو version الخاص بتطبيقك، فترفع version كلما تغيّر الكود الأصلي، فتتوقّف builds الإصدارين 1.0 و1.1 عن مشاركة التحديثات. أما سياسة fingerprint فتحسب hash للأجزاء الأصلية من مشروعك بدلًا من ذلك، فيتغيّر إصدار وقت التشغيل تلقائيًا حين يتغيّر الكود الأصلي. كلتاهما تعمل؛ اختر واحدة وافهمها.

حين يسوء تحديث

تصل التحديثات إلى مستخدمين كثيرين بسرعة، وهذا سلاح ذو حدّين. إن أساء أحدها التصرّف، فتراجع:

Terminal
eas update:rollback

يرشدك خطوة بخطوة لإعادة فرع القناة إلى تحديث سابق أو إلى الكود المضمّن في الـ build. ويحصل المستخدمون على التراجع في تشغيلهم التالي، بالطريقة نفسها التي حصلوا بها على التحديث. ولهذا يستحق كل تحديث العناية نفسها التي يستحقها الإصدار: شغّل اختباراتك، وانشر على preview، وافتحه على هاتف حقيقي، ثم انشر على production. يسمح المتجران بتحديث JavaScript بهذه الطريقة لإصلاح الأخطاء والتحسينات؛ أما استخدامه لتغيير ما يفعله التطبيق جوهريًا دون مراجعة فمخالف لقواعدهما.

روتين إصدار يصمد

هذا إيقاع يناسب فريقًا صغيرًا:

  • إصلاحات JavaScript: اختبر، ثم eas update إلى preview، وتحقّق، ثم إلى production. في اليوم نفسه.
  • التغييرات الأصلية أو الميزات الجديدة: ارفع version، ثم production build، ثم TestFlight والمسار الداخلي، ثم المراجعة، ثم الإطلاق. بتخطيط مسبق، كل بضعة أسابيع.
  • مع كل إصدار: راقب تقارير الانهيار في اليوم الأول، وأبقِ eas update:rollback جاهزًا.

أين وصلت الآن

بدأت بـ Text واحد في مشروع Expo. أما Trailhead الآن ففيه قوائم تبقى سريعة، وtabs وstacks مع params مضبوطة الأنواع، ونموذج يتعامل مع لوحة المفاتيح، وبيانات في SQLite وtoken في التخزين الآمن، وتتبّع GPS، وصور، وتذكيرات، واختبارات، وbuilds للمتاجر، وطريقة لإصلاح الأخطاء في عصر اليوم نفسه. والأهم أنك تعرف أين يختلف React Native عن الويب ولماذا: native views، وthreads اثنان، ولا cascade، وأذونات يمكن رفضها، ونوعان من التغييرات، JavaScript وأصلي.

خطوات تالية جيدة: أضف Reanimated وreact-native-gesture-handler لتفاعلات أغنى، وTanStack Query لبيانات الخادم، وMaestro لبضعة اختبارات end-to-end. ثم أطلق شيئًا صغيرًا لمستخدمين حقيقيين وتعلّم مما يفعلونه به.

أهم النقاط

  • يستبدل EAS Update حزمة JavaScript والملفات المرافقة (assets) في الـ builds المثبّتة، دون ملف تطبيق جديد ودون مراجعة المتجر.
  • تغييرات JavaScript والـ assets وحدها يمكن أن تصل عبر الهواء؛ أما الوحدات الأصلية الجديدة ونصوص الأذونات والأيقونات وترقيات الـ SDK فتحتاج إلى build جديد.
  • قناة الـ build (channel) تحدّد أي التحديثات يتلقّاها، وإصدار وقت التشغيل (runtime version) يحدّد أي التحديثات متوافقة مع كوده الأصلي.
  • افتراضيًا، يُنزَّل التحديث في الخلفية ويُطبَّق عند التشغيل التالي.
  • حين يسيء تحديث التصرّف، يعيد eas update:rollback المستخدمين إلى تحديث سابق أو إلى الكود المضمّن في الـ build الخاص بهم.

قراءات إضافية

تحقّق من فهمك

3 أسئلة

السؤال 1 من 3

أيّ تغيير في Trailhead يمكن أن يصل إلى المستخدمين باستخدام eas update وحده؟

السؤال 2 من 3

نشرت تحديثًا على قناة production. فتح مستخدم Trailhead بعد ساعة. مع الإعدادات الافتراضية، متى يرى الإصلاح؟

السؤال 3 من 3

مستخدمو Trailhead 1.0 (المبني قبل إضافة expo-camera) و1.1 (المبني بعدها) يستخدمون قناة production. نشرت تحديث JavaScript يستورد expo-camera. ما الذي يحمي مستخدمي 1.0 من الانهيار؟

تدريب

اختر بحكمة

تحديث أم build جديد؟

Trailhead 1.2 منشور مع ضبط runtimeVersion على سياسة appVersion. قائمة الفريق لهذا الأسبوع أدناه. اختر كل تغيير تستطيع إيصاله إلى مستخدمي 1.2 الحاليين باستخدام eas update وحده، دون build جديد ودون مراجعة المتجر.

تحديث أم build جديد؟