קבלת קישורים דינמיים של Firebase באפליקציית Flutter

כדי לקבל את קישורים דינמיים ב-Firebase שיצרתם, אתם צריכים לכלול את SDK להטמעת קישורים דינמיים באפליקציה שלכם ולהפעיל את השיטה FirebaseDynamicLinks.getDynamicLink() כשהאפליקציה נטענת כדי לקבל את הנתונים שמועברים בקישור הדינמי.

  1. מתקינים ומפעילים את Firebase SDKs for Flutter, אם עוד לא עשיתם זאת.

  2. מתיקיית השורש של פרויקט Flutter, מריצים את הפקודה הבאה כדי להתקין את הפלאגין Dynamic Links:

    flutter pub add firebase_dynamic_links
    
  3. אם אתם מפתחים אפליקציית Android, פותחים את הדף Project settings (הגדרות הפרויקט) במסוף Firebase ומוודאים שציינתם את מפתח החתימה SHA-1. אם אתם משתמשים בקישורים לאפליקציות, אתם צריכים לציין גם את מפתח ה-SHA-256.

שילוב פלטפורמות

צריך לבצע את השלבים הבאים לשילוב הפלטפורמה בפלטפורמות שבהן אתם בונים את האפליקציה.

Android

ב-Android, צריך להוסיף מסנן Intent חדש כדי לזהות קישורי עומק של הדומיין, כי הקישור הדינמי יפנה לדומיין אם האפליקציה מותקנת. הפעולה הזו נדרשת כדי שהאפליקציה תקבל את הנתונים של הקישור הדינמי אחרי שהיא מותקנת או מתעדכנת מחנות 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 הזה כדי לטפל בקישור.

השלב הבא הוא לוודא שטביעת האצבע מסוג SHA-256 של אישור החתימה רשומה במסוף Firebase עבור האפליקציה. פרטים נוספים על אחזור טביעת האצבע מסוג SHA-256 זמינים בדף אימות הלקוח.

פלטפורמות של אפל

  1. אם עדיין אין לכם חשבון, יוצרים חשבון מפתח של אפל.

  2. בדף Project settings (הגדרות הפרויקט) במסוף Firebase, מוודאים שהאפליקציה ל-iOS מוגדרת בצורה נכונה עם מזהה App Store ומזהה צוות.

  3. באתר Apple Developer, יוצרים פרופיל הקצאת הרשאות לאפליקציה עם יכולת Associated Domain מופעלת.

  4. ב-Xcode, מבצעים את הפעולות הבאות:

    1. פותחים את האפליקציה בכותרת TARGETS.

    2. בדף Signing & Capabilities (חתימה ויכולות), מוודאים שהצוות רשום ושהוגדר Provisioning Profile (פרופיל הקצאת הרשאות).

    3. בדף Signing & Capabilities (חתימה ויכולות), מפעילים את Associated Domains (דומיינים משויכים) ומוסיפים את הדברים הבאים לרשימת הדומיינים המשויכים (מחליפים את הדוגמה בדומיין שלכם):

      applinks:example.page.link
      
    4. בדף המידע, מוסיפים סוג כתובת URL לפרויקט. מגדירים את השדה URL Schemes (סכימות של כתובות 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. אופציונלי: השבתת השימוש של Dynamic Links SDK בלוח ההדבקה של iOS.

      כברירת מחדל, SDK להטמעת קישורים דינמיים משתמש בלוח ההדבקה כדי לשפר את המהימנות של קישורי עומק אחרי ההתקנה. באמצעות לוח ההדבקה, קישורים דינמיים יכולים לוודא שכאשר משתמש פותח קישור דינמי אבל צריך להתקין את האפליקציה קודם, הוא יוכל לעבור מיד לתוכן המקורי המקושר כשהוא יפתח את האפליקציה בפעם הראשונה אחרי ההתקנה.

      החיסרון הוא שהשימוש בלוח ההדבקה מפעיל התראה ב-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);
}

מצב הרקע / החזית

כשהאפליקציה פתוחה או פועלת ברקע, משתמשים ב-getter‏ 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.), אם אתם בודקים קישור דינמי ממצב אפליקציה שהופסק (כלומר, האפליקציה נסגרה על ידי החלקה).