التحديثات اللاسلكية باستخدام Shorebird Code Push
التحديثات اللاسلكية باستخدام Shorebird Code Push
قد يستغرق إطلاق إصلاح عبر App Store أو Google Play ساعاتٍ أو أياماً. يحلّ Shorebird Code Push هذه المشكلة بتمكينك من دفع تصحيحات Dart مباشرةً إلى أجهزة المستخدمين دون المرور بدورة مراجعة المتجر. يشرح هذا الدرس آلية عمل Shorebird من الداخل، وكيفية دمجه في خط أنابيب CI، وما يجب معرفته عن الامتثال لإرشادات المتجر قبل الإطلاق.
كيف يعمل Shorebird
يعتمد Shorebird على Dart VM معدّل يُحزَّم داخل إصدار الإنتاج من تطبيقك. عند تشغيل التطبيق، تتحقق بيئة تشغيل Shorebird من وجود تصحيح متاح على خوادمها. إن وُجد التصحيح، يُنزَّل ويُطبَّق في الخلفية، ويشغّل الإطلاق التالي الكود المُصحَّح. هذه الآلية مشابهة لـ CodePush في React Native، لكنها تعمل على مستوى بايتكود Dart المُجمَّع — دون أي JavaScript.
- تصحيح Dart VM: لا يمكن توصيل سوى تغييرات كود Dart. يستلزم كود الطبقة الأصيلة (Kotlin وSwift وقنوات المنصة) دائماً تقديماً كاملاً للمتجر.
- لا إعادة تنزيل كاملة للبرنامج الثنائي: التصحيحات تفاضلية — يُنقل فقط لقطات Dart المتغيرة، مما يُبقي أحجام التصحيحات صغيرة (في الغالب عشرات الكيلوبايت).
- إطلاق ذري: تُدرَّج التصحيحات بنسبة مئوية، فيمكنك طرحها لـ 5 % من المستخدمين قبل التوسع.
تثبيت Shorebird CLI
يُغلّف shorebird CLI أدوات Flutter. ثبّته مرةً واحدة لكل جهاز:
تثبيت Shorebird CLI
# macOS / Linux — أمر واحد عبر curl
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash
# التحقق من التثبيت
shorebird --version
# المصادقة بحسابك في Shorebird
shorebird login
بعد التثبيت، هيّئ Shorebird داخل مشروع Flutter الخاص بك. يُضيف هذا ملف shorebird.yaml ويحقن تجاوز محرك Shorebird في مشروعك:
تهيئة تطبيق Flutter مع Shorebird
# نفّذ من جذر مشروعك
shorebird init
# يُنشأ shorebird.yaml — أضف هذا الملف إلى git
# يحتوي على app_id الذي يربط الإصدارات بلوحة تحكم Shorebird
# بناء APK للإنتاج مُمكَّن Shorebird (Android)
shorebird release android
# بناء IPA للإنتاج مُمكَّن Shorebird (iOS)
shorebird release ios
# إنشاء تصحيح بعد تغيير كود Dart (لا يلزم تقديم للمتجر)
shorebird patch android
shorebird patch ios
دمج Shorebird في خط أنابيب CI
يفصل سير عمل GitHub Actions النموذجي بين الإصدار الكامل للمتجر وعمليات النشر التي تقتصر على التصحيح لاحقاً. فيما يلي مثال بسيط لكنه تمثيلي للإنتاج:
GitHub Actions — سير عمل التصحيح (shorebird_patch.yml)
name: Shorebird Patch
on:
push:
branches: [patch/**] # الدفع إلى patch/fix-login يُطلق تصحيحاً
jobs:
patch:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.22.0'
channel: stable
- uses: shorebirdtech/setup-shorebird@v1
with:
shorebird-version: latest
- name: مصادقة Shorebird
run: echo "$SHOREBIRD_TOKEN" | shorebird login --ci
env:
SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}
- name: تطبيق تصحيح Android
run: shorebird patch android --release-version=1.2.3+45
- name: تطبيق تصحيح iOS
run: shorebird patch ios --release-version=1.2.3+45
SHOREBIRD_TOKEN كسرّ مشفّر في GitHub Actions. أنشئ الرمز المميز من لوحة تحكم Shorebird ضمن الحساب ← مفاتيح API. لا تُضمّنه أبداً في ملف YAML الخاص بسير العمل.سياسات التحديث والتراجعات
يكشف حزمة Flutter shorebird_code_push عن تعداد UpdateTrack وأساليب فحص التحديث التي يمكنك استدعاؤها من كود التطبيق للتحكم في وقت التحديثات وكيفيتها:
التحقق من التحديثات في وقت التشغيل
import 'package:shorebird_code_push/shorebird_code_push.dart';
final _updater = ShorebirdUpdater();
Future<void> checkForUpdate() async {
final status = await _updater.checkForUpdate();
if (status == UpdateStatus.outdated) {
// تنزيل التصحيح في الخلفية؛ يُطبَّق عند التشغيل البارد التالي
await _updater.update();
debugPrint('تم تنزيل التصحيح — أعد التشغيل للتطبيق.');
}
}
// تحديث فوري (قسري) — يُجبر إعادة تشغيل التطبيق بعد التنزيل
Future<void> forceUpdate() async {
final result = await _updater.update(
track: UpdateTrack.stable,
);
if (result == UpdateResult.upToDate) return;
// اطلب من المستخدم إعادة التشغيل أو استدع SystemNavigator.pop()
}
التراجع عن تصحيح معيب هو عملية بأمر واحد من CLI أو نقرة واحدة في لوحة تحكم Shorebird على الويب:
التراجع عن تصحيح
# سرد التصحيحات لإصدار معين
shorebird patch list --release-version=1.2.3+45
# التراجع عن التصحيح رقم 3
shorebird patch rollback --patch-number=3 --release-version=1.2.3+45
# بعد التراجع، تعود الأجهزة المتأثرة عند الإطلاق التالي
# لا يلزم أي إجراء من المستخدمين
الامتثال لإرشادات المتجر
يسمح كل من Apple وGoogle بتحديثات الكود عبر الهواء، لكن مع قيود. قد يؤدي انتهاك هذه القواعد إلى إزالة التطبيق:
- Apple App Store: تحظر المادة 3.3.2 من اتفاقية ترخيص برنامج المطورين تنزيل الكود الأصيل وتنفيذه. ولأن Shorebird لا يُصحّح سوى بايتكود Dart الذي يفسّره Dart VM المُدمَج، فإنه يمتثل لهذه القاعدة — لا يُدخَل أي كود أصيل جديد.
- Google Play: تقيّد سياسة إساءة استخدام الأجهزة والشبكات تشغيل الكود المُنزَّل الذي يُغيّر سلوك التطبيق بطريقة مضللة. يُستخدم Shorebird لتوصيل إصلاحات الأخطاء والتحسينات الطفيفة، لا لاستبدال الوظائف الأساسية أو تجاوز مراجعة الإضافات الكبرى.
- حالات الاستخدام الآمنة: تغييرات النصوص، وإصلاحات الأخطاء، وتحسينات الأداء، والتعديلات الطفيفة على واجهة المستخدم.
- حالات الاستخدام المحظورة: إضافة صلاحيات منصة جديدة، وتغيير الغرض الأساسي للتطبيق، وتجاوز مراجعة المحتوى للميزات الكبرى.
الملخص
يمنح Shorebird Code Push فِرَق Flutter القدرة على شحن إصلاحات أخطاء Dart وتحديثات طفيفة مباشرةً إلى المستخدمين، متجاوزةً دورة مراجعة المتجر. يتكامل CLI بسلاسة مع GitHub Actions وأنظمة CI الأخرى. تسليم التصحيحات تفاضلي ومُدرَّج، والتراجعات فورية من لوحة التحكم. القيد الرئيسي هو أن كود Dart فقط قابل للتصحيح — تغييرات الطبقة الأصيلة تستلزم دائماً إصداراً كاملاً للمتجر. عند الاستخدام المسؤول ضمن إرشادات Apple وGoogle، يُعدّ Shorebird إضافةً قوية لخط أنابيب نشر Flutter الناضج.