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

כדי לקבל את הקישורים הדינמיים של Firebase שיצרתם, אתם צריכים לכלול את Dynamic Links 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>

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

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

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

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

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

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

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

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

    2. בדף 'חתימה ויכולות', מוודאים שהצוות רשום ושהוגדר פרופיל הקצאת ההרשאות.

    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. אופציונלי: השבתה של השימוש בלוח ההדבקה של iOS ב-Dynamic Links SDK.

      כברירת מחדל, Dynamic Links 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.).