تلقّي "روابط Firebase الديناميكية" في تطبيق Flutter

لتلقّي "روابط Firebase الديناميكية" التي أنشأتها، عليك تضمين حزمة تطوير البرامج (SDK) لخدمة "روابط Firebase الديناميكية" في تطبيقك واستدعاء طريقة FirebaseDynamicLinks.getDynamicLink() عند تحميل تطبيقك لـ الحصول على البيانات التي تم تمريرها في الرابط الديناميكي.

  1. ثبِّت حِزم تطوير البرامج (SDK) لمنصة Firebase في Flutter وابدأها إذا لم يسبق لك إجراء ذلك.

  2. من دليل جذر مشروع Flutter، نفِّذ الأمر التالي لتثبيت مكوّن Dynamic Links الإضافي:

    flutter pub add firebase_dynamic_links
    
  3. إذا كنت تنشئ تطبيق Android، افتح صفحة إعدادات المشروع في "وحدة تحكّم Firebase" وتأكَّد من تحديد مفتاح توقيع SHA-1. إذا كنت تستخدم روابط التطبيقات، حدِّد أيضًا مفتاح SHA-256.

شريك التكامل

أكمِل خطوات شريك التكامل التالية للمنصات التي تنشئ تطبيقك من أجلها.

Android

على Android، عليك إضافة intent filter جديد لتلقّي الروابط لصفحات معيّنة في التطبيق ضمن نطاقك، لأنّ الرابط الديناميكي سيعيد التوجيه إلى نطاقك إذا كان تطبيقك مثبَّتًا. هذا الإجراء مطلوب لكي يتلقّى تطبيقك بيانات الرابط الديناميكي بعد تثبيته أو تحديثه من "متجر Play" والنقر على الزر "متابعة". في AndroidManifest.xml:

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:host="example.com"
        android:scheme="https"/>
</intent-filter>

عندما يفتح المستخدمون رابطًا ديناميكيًا يتضمّن رابطًا عميقًا للمخطط والمضيف اللذين تحدّدهما، سيبدأ تطبيقك النشاط باستخدام intent filter هذا للتعامل مع الرابط.

الخطوة التالية هي التأكّد من تسجيل الملف المرجعي لمعيار SHA-256 لشهادة التوقيع في "وحدة تحكّم Firebase" للتطبيق. يمكنك الاطّلاع على مزيد من التفاصيل حول كيفية استرداد الملف المرجعي لمعيار SHA-256 في صفحة المصادقة على العميل.

منصات Apple

  1. أنشِئ حساب مطوِّر على Apple إذا لم يكن لديك حساب حاليًا.

  2. في صفحة إعدادات المشروع في "وحدة تحكّم Firebase"، تأكَّد من ضبط تطبيق iOS بشكلٍ صحيح باستخدام رقم تعريف متجر التطبيقات ورقم تعريف الفريق.

  3. على موقع Apple للمطوّرين، أنشِئ ملفًا شخصيًا للتزويد لتطبيقك مع تفعيل إمكانية "النطاقات المرتبطة".

  4. في Xcode، نفِّذ ما يلي:

    1. افتح تطبيقك ضِمن العنوان الأهداف.

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

    3. في صفحة "التوقيع والإمكانات"، فعِّل النطاقات المرتبطة وأضِف ما يلي إلى قائمة "النطاقات المرتبطة" (استبدِل المثال بنطاقك):

      applinks:example.page.link
      
    4. في صفحة "معلومات"، أضِف نوع عنوان URL إلى مشروعك. اضبط حقل "مخططات عناوين URL" على رقم تعريف حزمة تطبيقك. (يمكن أن يكون المعرّف Bundle ID أو أي قيمة أخرى تريدها.)

    5. إذا كنت قد أعددت نطاقًا مخصّصًا لمشروعك على Firebase، أضِف بادئة عنوان URL للرابط الديناميكي إلى ملف Info.plist في مشروع iOS باستخدام المفتاح FirebaseDynamicLinksCustomDomains.

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      <key>FirebaseDynamicLinksCustomDomains</key>
      <array>
          <string>https://custom.domain.io/path1</string>
          <string>https://custom.domain.io/path2</string>
      </array>
      
      ...other settings
      
      </dict>
      </plist>
      
    6. اختياري: أوقِف استخدام حزمة تطوير البرامج (SDK) لخدمة "روابط Firebase الديناميكية" للوحة اللصق على iOS.

      تستخدم حزمة تطوير البرامج (SDK) للروابط الديناميكية لوحة اللصق بشكلٍ تلقائي لتحسين موثوقية الروابط لصفحات معيّنة في التطبيق بعد التثبيت. باستخدام لوحة اللصق، يمكن أن تتأكّد "روابط Firebase الديناميكية" من أنّ المستخدم يمكنه الانتقال فورًا إلى المحتوى المرتبط الأصلي عند فتح التطبيق لأول مرة بعد التثبيت، وذلك عندما يفتح رابطًا ديناميكيًا ولكن يحتاج إلى تثبيت تطبيقك أولاً.

      من عيوب هذه الميزة أنّ استخدام لوحة اللصق يؤدي إلى ظهور إشعار على نظام التشغيل iOS 14 والإصدارات الأحدث. لذلك، في المرة الأولى التي يفتح فيها المستخدمون تطبيقك، إذا كانت لوحة اللصق تحتوي على عنوان URL لرابط ديناميكي، سيظهر لهم إشعار بأنّ تطبيقك قد وصل إلى لوحة اللصق، ما قد يؤدي إلى حدوث ارتباك.

      لإيقاف هذا السلوك، عدِّل ملف Info.plist في مشروع Xcode واضبط المفتاح FirebaseDeepLinkPasteboardRetrievalEnabled على NO.

للتعامل مع رابط ديناميكي في تطبيقك، يجب تنفيذ سيناريوهَين.

حالة "تم إيقاف التطبيق"

اضبط الطريقتَين التاليتَين:

  1. FirebaseDynamicLinks.getInitialLink : تعرض Future<PendingDynamicLinkData?>
  2. FirebaseDynamicLinks.onLink : معالج أحداث يعرض Stream يحتوي على PendingDynamicLinkData?

سيتلقّى Android الرابط دائمًا من خلال FirebaseDynamicLinks.getInitialLink من حالة "تم إيقاف التطبيق"، ولكن لا يتم ضمان ذلك على iOS. لذلك، من المفيد إعداد كلتا الطريقتَين بالترتيب التالي لضمان تلقّي تطبيقك للرابط:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseConfig.platformOptions);

  // Check if you received the link via `getInitialLink` first
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  if (initialLink != null) {
    final Uri deepLink = initialLink.link;
    // Example of using the dynamic link to push the user to a different screen
    Navigator.pushNamed(context, deepLink.path);
  }

  FirebaseDynamicLinks.instance.onLink.listen(
        (pendingDynamicLinkData) {
          // Set up the `onLink` event listener next as it may be received here
          if (pendingDynamicLinkData != null) {
            final Uri deepLink = pendingDynamicLinkData.link;
            // Example of using the dynamic link to push the user to a different screen
            Navigator.pushNamed(context, deepLink.path);
          }
        },
      );

  runApp(MyApp(initialLink));
}

ضِمن منطق تطبيقك، يمكنك بعد ذلك التحقّق مما إذا تم التعامل مع رابط وتنفيذ إجراء، على سبيل المثال:

if (initialLink != null) {
  final Uri deepLink = initialLink.link;
  // Example of using the dynamic link to push the user to a different screen
  Navigator.pushNamed(context, deepLink.path);
}

حالة "التطبيق في الخلفية" أو "التطبيق في المقدّمة"

أثناء فتح التطبيق أو عندما يكون في الخلفية، استخدِم أداة الجلب FirebaseDynamicLinks.onLink:

FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
  Navigator.pushNamed(context, dynamicLinkData.link.path);
}).onError((error) {
  // Handle errors
});

بدلاً من ذلك، إذا أردت تحديد ما إذا تم استخدام رابط ديناميكي معيّن لفتح التطبيق، مرِّره إلى طريقة getDynamicLink بدلاً من ذلك:

String link = 'https://dynamic-link-domain/ke2Qa';

final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getDynamicLink(Uri.parse(link));

لاختبار رابط ديناميكي على iOS، يجب استخدام جهاز فعلي. عليك أيضًا تشغيل التطبيق في وضع الإصدار (على سبيل المثال، flutter run --release)، إذا كنت تختبر رابطًا ديناميكيًا من حالة "تم إيقاف التطبيق" (أي تم إغلاق التطبيق عن طريق التمرير سريعًا).