الفصل الثاني عشر: التكامل مع Firebase Chapter 12: Firebase Integration

كيف نستخدم سحابة Google لتقوية التطبيق وتعقب الأخطاء والوصول للمستخدمين أينما كانوا.

🔥 لماذا فيربيز (Firebase)؟ Why Firebase?

فيربيز مش مجرد قاعدة بيانات، هي منظومة كاملة بتساعدنا في MRE CashBook بـ 3 حاجات أساسية:

1
Reliability (الموثوقية)

معرفة لو التطبيق "كرش" (Crashed) عند حد من المستخدمين فوراً عن طريق Crashlytics.

2
Communication (التواصل)

إرسال إشعارات فورية (Push Notifications) لجذب المستخدمين للعودة للتطبيق باستخدام FCM.

3
Scalability (التوسع)

إدارة آلاف المستخدمين وإرسال رسائل جماعية بسهولة بدون استهلاك موارد الموبايل.

🏗️ هيكل التكامل السحابي Cloud Integration Architecture

يوضح الرسم التالي كيف يتفاعل التطبيق مع خدمات Firebase المختلفة:

graph TD App[MRE CashBook App] -- Errors --> Crashlytics[Firebase Crashlytics] Cloud[Firebase Cloud] -- Push --> App App -- Reg Token --> FCM[Firebase Messaging] Config[firebase_options.dart] -- Credentials --> App subgraph Google Cloud FCM Crashlytics end subgraph Local Device App Config end

التكامل ده بيتم في طبقة الـ Core بتاع التطبيق عشان يغطي جميع الـ Features في نفس الوقت.

التجهيز الذكي (Defensive Init) Smart Initialization Strategy

واحدة من أكبر المشاكل في الأندرويد هي غياب خدمات جوجل (GMS) على بعض الأجهزة. لو حاولنا نشغل Firebase بدون حذر، التطبيق ممكن "يهنج" تماماً.

main.dart logic
Future<void> initFirebase() async {
  try {
    await Firebase.initializeApp(
      options: DefaultFirebaseOptions.currentPlatform,
    ).timeout(
      const Duration(seconds: 3),
      onTimeout: () => throw TimeoutException('Firebase unreachable'),
    );
    
    // إعداد الـ Crashlytics في وضع الـ Release فقط
    await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(kReleaseMode);
  } catch (e) {
    AppLogger.error("Firebase init failed, but continuing app launch.");
  }
}
.timeout(Duration(seconds: 3))
لماذا التايم أوت؟Why Timeout?
عشان نحمي المستخدم اللي جهازه مفيهوش خدمات جوجل من إنه يفضل عالق في شاشة الـ Splash للأبد. 3 ثواني كافية جداً للربط السحابي، لو مخلصش بنكمل Offline.To protect non-GMS users from Splash screen hangs. 3s is plenty for a cloud handshake; if it fails, we launch in offline mode.
🐞 تعقب الأخطاء: Crashlytics Real-time Bug Monitoring

بدل ما نعتمد على كلام المستخدم الشفهي "التطبيق قفل"، Crashlytics بتبعت لنا الـ Stack Trace كامل.

Log TypeDescription
Fatalالأخطاء اللي بتخلي الأبلكيشن يقفل تماماً (Native Crashes).
Non-Fatalالأخطاء اللي بنمسكها بالـ Try-Catch وبنبعتها يدوي.
Logsسلسلة أحداث المستخدم (Breadcrumbs) قبل ما الكراش يحصل.

نصيحة: إحنا بنستخدم FirebaseCrashlytics.instance.recordFlutterError(details) في الـ FlutterError.onError عشان نمسك أي خطأ يحصل في الـ UI بشكل تلقائي.

🔔 الإشعارات (Cloud Messaging) Push Notifications with FCM

الإشعارات في MRE CashBook بتشتغل على 3 مستويات بناءً على حالة التطبيق:

1
Foreground (التطبيق مفتوح)

بنستخدم onMessage.listen وبنظهر In-app notification أو Banner مخصص.

2
Background (التطبيق في الخلفية)

بنستخدم onBackgroundMessage (ولازم يكون Static Function) عشان السيستم يظهره.

3
Terminated (التطبيق مقفول تماماً)

بنستخدم getInitialMessage عشان نعرف لو المستخدم دخل التطبيق عن طريق إشعار.

Entry Point: الـ Background Handler لازم يكون واخد الـ Annotation دي: @pragma('vm:entry-point') عشان الـ Dart VM يقدر يشوفه من برا التطبيق.

🛤️ التوجيه الذكي (Routing) Deep Linking from Notifications

الإشعار مش مجرد رسالة، هو ممكن يوجه المستخدم لشاشة معينة (مثلاً شاشة إضافة معاملة جديدة).

// Handling notification click
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
  if (message.data['screen'] == 'add_transaction') {
    navigator.pushNamed('/add');
  }
});

ده بيزود الـ Interactive Rate بتاع التطبيق وبيخلي المستخدم يوصل لهدفه أسرع.

🔑 سر الإشعارات: FCM Tokens Device Identification (Tokens)

كل جهاز له "عنوان بريدي" فريد في فيربيز اسمه Token. إحنا بنحتاج العنوان ده عشان نبعت رسالة للجهاز ده بالذات.

// Get the token for this device
String? token = await FirebaseMessaging.instance.getToken();
print("Device Token: $token");

PRO TIP: التوكين بيتغير لو المستخدم مسح الداتا أو عمل Reset للموبايل. لازم دايماً نحدثه في السيرفر عندنا باستخدام onTokenRefresh.

📱 دعم أجهزة هواوي (Huawei Support) Handling Non-GMS Devices

أجهزة هواوي الحديثة مفهاش خدمات جوجل، وعشان كدة فيربيز مش هيشتغل عليها (Out of the box). كيف يتعامل MRE CashBook؟

!
Silent Failover

بدل ما نضايق المستخدم برسالة خطأ، التطبيق بيكمل "صامت" وبيلغي ميزات السحاب تلقائياً.

!
Local Core Dependency

التطبيق مبنى إنه يكون "Native First"، يعني الأساس (الداتابيز، الحسابات) مش محتاج إنترنت ولا فيربيز عشان يشتغل.

⚙️ ملفات الإعدادات (Config Files) The firebase_options.dart File

زمان كان لازم نحط ملفات JSON و Plist في فولدرات Native. دلوقتي، الـ FlutterFire CLI بيعملنا ملف Dart فيه كل الإعدادات لكل المنصات (Android, iOS, Web).

static const FirebaseOptions android = FirebaseOptions(
  apiKey: 'AIzaSyA...',
  appId: '1:123456789:android:...',
  messagingSenderId: '123456789',
  projectId: 'mre-cashbook',
);

ده بيخلي الـ Source Control (Git) أنظف، وبنقدر نغير الـ Config بسهولة من مكان واحد.

🛠️ حل المشاكل (Troubleshooting) Common Firebase Issues

أشهر المشاكل اللي بتقابل المطورين مع فيربيز وحلها:

!
SHA-1 Mismatch

الإشعارات والـ Phone Auth مش بيشتغلوا لو الـ SHA-1 بتاع الـ KeyStore مش متسجل في Firebase Console.

!
Missing google-services.json

حتى مع ملف الـ Dart الجديد، الأندرويد بيحتاج "Plugin" في الـ build.gradle عشان يفهم التكامل ده.

!
Duplicate Plugin Class

حلها دايماً هو مسح الـ Build القديم:

flutter clean && flutter pub get
🔐 الأمان والخصوصية (Security) Data Privacy in the Cloud

سياسة MRE CashBook صارمة جداً فيما يخص البيانات:

لا نرسل بيانات المستخدم: إحنا بنستخدم فيربيز للـ Metadata فقط. يعني بنعرف إن فيه كراش حصل، بس مش بنعرف إيه الأرقام اللي كانت مكتوبة في الداتابيز بتاعتك. خصوصيتك 100% محلية.

أيضاً، إحنا بنشفر الـ User ID المبعوت للـ Crashlytics بـ UUID عشوائي عشان محدش يقدر يربط الخطأ بشخص معين.

أسئلة هندسية عن Firebase Firebase FAQ
هل فيربيز بيستهلك بطارية الجهاز؟
لا، تقنية الـ FCM موفرة جداً للبطارية لأنها بتفتح قناة اتصال واحدة (Socket) لكل الموبايل، مش لكل تطبيق لوحده.
هل ممكن التطبيق يشتغل بدون فيربيز؟
نعم، MRE CashBook مصمم "Offline-First". فيربيز هو مجرد طبقة إضافية للمراقبة والإشعارات.
ماذا لو توقفت خدمات جوجل في منطقتي؟
التطبيق هيفضل شغال بكامل كفاءته المحلية (إضافة، مسح، تقارير)، وفقط الإشعارات هي اللي هتتأثر.
📖 قاموس الفصل Firebase Glossary
TermMeaning (AR)
FCMخدمة إرسال الإشعارات السحابية.
Stack Traceتقرير تقني بيبين تسلسل الكود اللي أدى للخطأ.
Deep Linkرابط بيفتح شاشة معينة داخل التطبيق مباشرة.
GMSخدمات جوجل للهواتف (Google Mobile Services).
Payloadالبيانات الإضافية المخفية جوه الإشعار.
🔑 إدارة الصلاحيات (Permissions) Handling Mobile Permissions

الإشعارات في أندرويد 13+ و iOS بتحتاج موافقة صريحة من المستخدم. إحنا بنطلبها بذكاء:

NotificationSettings settings = await FirebaseMessaging.instance.requestPermission(
  alert: true,
  badge: true,
  sound: true,
);

if (settings.authorizationStatus == AuthorizationStatus.authorized) {
  print('User granted permission');
} else {
  print('User declined or has not accepted permission');
}
requestPermission()
متى تظهر؟When?
الطلب ده بيظهر للمستخدم مرة واحدة بس. لو رفض، لازم يروح الإعدادات يدوي عشان يفعلها.This prompt appears once. If denied, the user must enable it manually in OS settings.
📊 تحليلات الاستخدام (Analytics) Usage Tracking Strategy

إحنا بنستخدم Analytics عشان نعرف الأجزاء اللي مش مستخدمة ونحسنها، مش عشان نراقب خصوصيتك.

// Example: Log report generation
await FirebaseAnalytics.instance.logEvent(
  name: 'generate_report',
  parameters: {'type': 'monthly'},
);
graph LR Action[User Action] --> Event[Firebase Event] Event -- Aggregation --> Insights[Usage Statistics] Insights -- Decision --> Dev[Improve Feature]
🛡️ قائمة أمان السحابة Cloud Security Checklist

عشان نضمن أقصى درجة من الأمان، بنتبع القواعد دي:

1

لا بيانات حساسة: لا يتم إرسال أي أرقام ومعاملات مالية لـ Firebase Analytics.

2

API Key Restrictions: مفاتيح الـ API محددة لتطبيقاتنا فقط عن طريق الـ Package Name والـ Bundle ID.

3

Data Retention: تقارير الكراشات بتتمسح تلقائياً بعد فترة 90 يوم لضمان الخصوصية.

📝 ملخص الفصل Chapter Summary
ComponentStrategic Value
CrashlyticsZero-day bug detection and fixing.
FCMHigh user retention via smart alerts.
Safe InitUniversal device compatibility (GMS/HMS).
ConfigCentralized platform management.

دمج فيربيز بيحول تطبيقنا من مجرد كود محلي إلى تجربة مستخدم سحابية ناضجة، بتقدر تتعامل مع المشاكل وتتواصل مع المستخدمين باحترافية.