افرض تحديث التطبيق أو فعّل وضع الصيانة دون نشر إصدار جديد
إصدار قديم يتعطل مع الـ API الجديدة، أو الخادم يحتاج ساعة صيانة. اضبط قواعد التحديث ونوافذ الصيانة من لوحة التحكم وستلتزم بها كل التطبيقات خلال دقائق.
6 دقائق قراءة

إصدار قديم يتعطل مع الـ API الجديدة، أو الخادم يحتاج ساعة صيانة. اضبط قواعد التحديث ونوافذ الصيانة من لوحة التحكم وستلتزم بها كل التطبيقات خلال دقائق.
6 دقائق قراءة


معظم المستخدمين لا يبلّغون عن الأعطال، بل يغادرون. أعدّ تتبّع الأعطال في تطبيق Flutter خلال دقائق: ما الذي يُلتقط، وكيف تضيف السياق، وكيف تتخلص من الضجيج.
5 دقائق قراءة

لدى مستخدمك هاتف وحاسوب وتبويب في المتصفح. توقّف عن تخزين رموز الأجهزة: اربط الأجهزة بمعرّف المستخدم في نظامك وأرسل مرة واحدة إلى iOS وأندرويد والويب وmacOS.
موقفان يواجههما كل فريق تطبيقات جوال عاجلاً أو آجلاً:
الحل المعتاد حقل "الحد الأدنى للإصدار" في خادمك وشاشة في التطبيق تتحقق منه. ينجح ذلك، إلى أن تكتشف أنك لا تستطيع تغيير الشاشة دون إصدار جديد، وأن التطبيقات التي بين أيدي الناس لا تفعل إلا ما بنيته فيها مسبقاً.
التحكم بالإصدارات في ليركس يقدّم ذلك جاهزاً: تضبط القواعد في لوحة التحكم، وتعرض الحزمة الشاشة المناسبة في كل تطبيق، على iOS وأندرويد وmacOS وWindows والويب.
تُقيَّم القواعد على خوادم ليركس. يسأل التطبيق "ما الذي ينطبق عليّ؟" فيتلقى إجابة لمنصته وإصداره ورقم بنائه وبيئته ودولته تحديداً.
والإجابات التي لم تتغير لا تكلّف شيئاً تقريباً: يرسل التطبيق ما لديه، فيرد ليركس بأنه "لم يتغير".
لكل منصة قاعدة خاصة بها لكل بيئة (prod ما لم تختر غيرها). ويمكن أن تحتوي القاعدة على:
ويفحصها ليركس بهذا الترتيب: الإصدار المحظور إلزامي، والأقدم من الحد الأدنى إلزامي، والأقدم من الأحدث اختياري أو موصى به (أو إلزامي بعد فوات الموعد)، وإلا فلا يُعرض شيء. وتُقارن الإصدارات كأرقام جزءاً جزءاً، فالإصدار 1.10.0 أحدث من 1.9.2.
حجب المستخدمين قرار جاد، لذا تعرض لوحة التحكم أثره أثناء الكتابة، مثل "This will block 1,240 devices (31%)"، وتطلب منك التأكيد إذا كانت القاعدة ستوقف نصف أجهزتك النشطة أو تضع حداً أدنى أعلى من كل إصدار مستخدم فعلياً. وتعرض قائمة Versions in the wild ما يستخدمه الناس حقاً.
يفتح زر Update صفحة المتجر: Google Play حسب اسم الحزمة، أو App Store حسب معرّف التطبيق الذي تستطيع لوحة التحكم البحث عنه لك.
الصيانة في تبويب Emergency. ولكل نافذة صيانة:
وميزتان تجعلان استخدامها في العجلة آمناً:
يطلب تفعيل الصيانة سبباً وكتابة الاسم المختصر للمشروع، ويُسجَّل كل تغيير في History مع من أجراه. وزر Lift all ينهي كل نوافذ الصيانة ويوقف كل التحديثات الإلزامية بخطوة واحدة، للحظة التي تكتشف فيها أن القاعدة كانت خطأً.
في Flutter يكون التحكم بالإصدارات مفعّلاً افتراضياً بمجرد إعداد lerix_flutter. لا عنصر واجهة تضيفه: تضع الحزمة شاشاتها فوق الـ navigator الرئيسي لتطبيقك.
Lerix.init(
url: 'https://api.lerix.dev/v1/your-project-slug',
apiKey: 'your-api-key',
projectId: 'your-project-slug',
appControl: const LerixAppControlOptions(
enabled: true, // false: no checks, no screens, no events
ui: true, // false: draw your own screens
),
builder: () => runApp(const MyApp()),
);
الشاشات الجاهزة: صفحة صيانة بملء الشاشة مع زر Try again، وصفحة Update required بملء الشاشة، ونافذة حوار للتحديثات الاختيارية والموصى بها. وتأتي أزرارها بالعربية والإنجليزية، مع دعم الكتابة من اليمين إلى اليسار.
وعلى أندرويد يمكنك أن تخطو خطوة أبعد: أضِف حزمة lerix_app_update فيفتح التحديث الإلزامي التحديث داخل التطبيق من Google Play بدل صفحة المتجر، للتطبيقات المثبّتة من Play. والتطبيقات التي لا تستخدم Play لا تحمل تلك المكتبة.
وعلى الويب اضبط release على الإصدار الذي تنشره. لا متجر هناك، فيعيد زر Update تحميل الصفحة:
import { Lerix } from '@lerix-dev/lerix-core';
await Lerix.initialize({
apiKey: 'your-api-key',
projectId: 'your-project-slug',
release: '1.4.0', // update rules need it; use numbers, not a commit hash
});
اضبط ui: false وارسمها بنفسك. تستمر الحزمة في الجلب والحفظ والتطبيق، بما في ذلك قواعد العمل دون اتصال؛ الرسم وحده عليك:
ValueListenableBuilder<LerixAppControlState>(
valueListenable: Lerix.appControl,
builder: (context, state, _) {
final maintenance = state.maintenance;
final update = state.update;
if (maintenance != null) {
return MaintenanceScreen(
title: maintenance.title,
message: maintenance.message,
onRetry: () => Lerix.appControl.refresh(),
);
}
if (update != null && update.state == LerixUpdateState.required) {
return ForceUpdateScreen(
message: update.message,
onUpdate: () => Lerix.appControl.openStore(),
);
}
return child;
},
);
وفي React الشيء نفسه عبر الـ hook useLerixAppControl()، وفي Angular عبر LerixAppControlService.
تسجّل الحزمة الأحداث $update_prompt_shown و$update_prompt_action (تحديث أو لاحقاً أو تخطٍّ) و$maintenance_shown. ومع تغيّرات إصدار التطبيق تكوّن مساراً تحويلياً في Analytics ← Funnels: كم شخصاً رأى التنبيه، وضغط Update، ووصل إلى الإصدار الجديد. ويعرض مقياس Propagation في تبويب Emergency عدد الأجهزة النشطة التي وصلها آخر تغيير أجريته.
5 دقائق قراءة

السطر index-8f3a1c.js:1:48213 لا يخبرك بشيء. ارفع خرائط المصدر من البناء ليشير كل خطأ إلى ملفك وسطرك ودالتك، وتعرّف على طريقة تجميع الأخطاء في مشكلات.
6 دقائق قراءة