تكامل Firebase

Firebase Analytics والأحداث المخصصة

16 دقيقة الدرس 12 من 13

Firebase Analytics والأحداث المخصصة

Firebase Analytics (المعروف الآن بـ Google Analytics for Firebase) هو حل تحليلات مجاني وغير محدود مدمج في نظام Firebase. يجمع تلقائياً عشرات الأحداث — مثل فتح التطبيق وبداية الجلسة والفتح الأول — ويتيح لك تعريف أحداث مخصصة تتناسب مع رحلات المستخدم الفريدة في تطبيقك. في هذا الدرس ستدمج حزمة firebase_analytics، وتسجل الأحداث التلقائية والمخصصة، وتضبط خصائص المستخدم، وتتحقق من وصول الأحداث في Firebase DebugView ولوحة تحكم Analytics.

1. إضافة التبعية

أضف firebase_analytics إلى ملف pubspec.yaml بجانب حزم Firebase الموجودة:

# pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^3.6.0
  firebase_analytics: ^11.3.3

شغّل flutter pub get، ثم أعد تشغيل flutterfire configure إذا أضفت منصة جديدة. لا يلزم أي إعداد أصلي إضافي — تتولى FlutterFire التسجيل تلقائياً.

ملاحظة: يتطلب Firebase Analytics جهازاً حقيقياً أو محاكي Android/iOS مزوداً بخدمات Google Play. لا يُطلق الأحداث في Flutter web افتراضياً دون تفعيل SDK الويب. يفترض التحقق عبر DebugView في هذا الدرس استخدام جهاز حقيقي أو محاكٍ مُهيأ بشكل صحيح.

2. تهيئة FirebaseAnalytics

أنشئ مثيلاً واحداً من FirebaseAnalytics بعد Firebase.initializeApp(). اعرضه عبر طبقة حقن التبعيات أو مرره حسب الحاجة:

import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  // الحصول على المثيل الفريد
  final analytics = FirebaseAnalytics.instance;

  // إرفاق المراقب لإطلاق أحداث screen_view تلقائياً
  runApp(MyApp(analytics: analytics));
}

class MyApp extends StatelessWidget {
  final FirebaseAnalytics analytics;
  const MyApp({super.key, required this.analytics});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Analytics Demo',
      navigatorObservers: [
        FirebaseAnalyticsObserver(analytics: analytics),
      ],
      home: const HomeScreen(),
    );
  }
}
نصيحة: إرفاق FirebaseAnalyticsObserver بـ MaterialApp.navigatorObservers يسجّل حدث screen_view تلقائياً في كل مرة يتم فيها دفع مسار مسمى أو سحبه، دون الحاجة لكتابة كود إضافي في كل شاشة.

3. تسجيل الأحداث التلقائية والمخصصة

تعرّف Firebase Analytics أحداثاً تلقائية مسبقاً (مثل app_open وsession_start وfirst_open) تُجمع دون أي كود. أما السلوكيات المحددة لعملك فتسجّلها بـ logEvent().

تقدم الحزمة أيضاً دوال مساعدة ذات أنواع محددة للأحداث الشائعة في التجارة الإلكترونية والتفاعل:

class AnalyticsService {
  final FirebaseAnalytics _analytics = FirebaseAnalytics.instance;

  // --- دوال الأحداث المعرّفة مسبقاً ---

  Future<void> logLogin({required String method}) =>
      _analytics.logLogin(loginMethod: method);

  Future<void> logSignUp({required String method}) =>
      _analytics.logSignUp(signUpMethod: method);

  Future<void> logSearch({required String term}) =>
      _analytics.logSearch(searchTerm: term);

  Future<void> logShare({
    required String contentType,
    required String itemId,
    required String method,
  }) =>
      _analytics.logShare(
        contentType: contentType,
        itemId: itemId,
        method: method,
      );

  // --- حدث مخصص ---

  Future<void> logCourseEnrolled({
    required String courseId,
    required String courseName,
    required String level,
  }) =>
      _analytics.logEvent(
        name: 'course_enrolled',          // snake_case، بحد أقصى 40 محرفاً
        parameters: <String, Object>{
          'course_id': courseId,           // نص (بحد أقصى 100 محرف)
          'course_name': courseName,
          'level': level,
          'timestamp': DateTime.now().millisecondsSinceEpoch,
        },
      );

  Future<void> logLessonCompleted({
    required String lessonId,
    required int durationSeconds,
    required int score,
  }) =>
      _analytics.logEvent(
        name: 'lesson_completed',
        parameters: <String, Object>{
          'lesson_id': lessonId,
          'duration_seconds': durationSeconds,  // int أو double
          'score': score,
          'passed': score >= 70,               // bool يُحوَّل إلى int (1/0)
        },
      );
}

قيود التسمية الواجب مراعاتها:

  • أسماء الأحداث: snake_case، بحد أقصى 40 محرفاً، يجب أن تبدأ بحرف.
  • أسماء المعاملات: بحد أقصى 40 محرفاً؛ القيم يمكن أن تكون String أو int أو double.
  • بحد أقصى 25 معاملاً لكل حدث. المعاملات الزائدة تُحذف بصمت.
  • لا تستخدم البادئات المحجوزة: firebase_ أو google_ أو ga_.

4. ضبط خصائص المستخدم

خصائص المستخدم هي سمات تصف شرائح قاعدة مستخدميك، مثل مستوى الاشتراك واللغة المفضلة ونوع الحساب. على عكس الأحداث (التي تُطلق مرة واحدة لكل إجراء)، تستمر خاصية المستخدم عبر الجلسات حتى تكتب عليها:

Future<void> setUserProperties({
  required String userId,
  required String plan,
  required String preferredLanguage,
}) async {
  final analytics = FirebaseAnalytics.instance;

  // ربط الأحداث بمعرّف مستخدم داخلي (مجزّأ — لا يحتوي على معلومات تعريف شخصية)
  await analytics.setUserId(id: userId);

  // خصائص مستخدم مخصصة (بحد أقصى 25 لكل مشروع، اسم 24 محرفاً، قيمة 36 محرفاً)
  await analytics.setUserProperty(name: 'subscription_plan', value: plan);
  await analytics.setUserProperty(
    name: 'preferred_language',
    value: preferredLanguage,
  );
}
تحذير: لا تمرر أبداً معلومات تعريف شخصية (PII) — كعنوان بريد إلكتروني حقيقي أو اسم كامل — إلى setUserId أو setUserProperty. تحظر شروط خدمة Firebase ذلك. استخدم دائماً معرّفاً داخلياً غير قابل للعكس.

5. التحقق من الأحداث باستخدام DebugView

بشكل افتراضي، تجمّع Analytics الأحداث وترفعها كل ~60 ثانية. أثناء التطوير، فعّل وضع DebugView لتظهر الأحداث في وحدة تحكم Firebase خلال ثوانٍ:

  • Android: شغّل adb shell setprop debug.firebase.analytics.app <YOUR_PACKAGE_NAME> من الطرفية.
  • iOS: أضف -FIRAnalyticsDebugEnabled إلى وسائط الإطلاق في مخطط Xcode.
  • افتح Firebase Console ← Analytics ← DebugView واختر جهازك من القائمة المنسدلة.

تعرض بطاقة كل حدث اسمه وطابعه الزمني وقيم معاملاته. تحقق من إطلاق أحداثك المخصصة بمفاتيح ومعاملات صحيحة قبل الإصدار.

نصيحة: يعرض تقرير Realtime (Analytics ← Realtime) أعداد الأحداث التراكمية خلال آخر 30 دقيقة — مفيد للاختبار السريع بعد نشر بناء لمجموعة صغيرة من المختبرين دون الحاجة لإعداد DebugView لكل جهاز.

6. الخلاصة

تعلمت في هذا الدرس كيفية دمج Firebase Analytics في تطبيق Flutter من البداية إلى النهاية: إضافة التبعية، وتهيئة المثيل الفريد، وإرفاق مراقب التنقل لأحداث screen_view التلقائية، وتسجيل الأحداث المعرّفة مسبقاً والمخصصة بمعاملات ذات أنواع محددة، وضبط خصائص المستخدم الدائمة، والتحقق من وصول الأحداث في DebugView. تشكّل هذه الإشارات التحليلية الأساس للقرارات المستندة إلى البيانات — يمكنك الآن إنشاء جماهير وقمعيات تحويل واختبارات A/B مباشرة في وحدتي تحكم Firebase وGoogle Analytics.