קבלת קישורים דינמיים ב-iOS

כדי לקבל את ה-Firebase Dynamic Links שיצרתם, אתם צריכים לכלול את ה-SDK של Dynamic Links באפליקציה ולקרוא ל-methods‏ handleUniversalLink: ו-dynamicLinkFromCustomSchemeURL: כשהאפליקציה נטענת, כדי לקבל את הנתונים שהועברו ב-Dynamic Link.

דרישות מוקדמות

לפני שמתחילים, צריך לוודא שהוספתם את Firebase לפרויקט ב-iOS.

משתמשים ב-Swift Package Manager כדי להתקין ולנהל את יחסי התלות של Firebase.

  1. ב-Xcode, כשהפרויקט של האפליקציה פתוח, עוברים אל File > Add Packages (קובץ > הוספת חבילות).
  2. כשמוצגת בקשה, מוסיפים את מאגר ה-SDK של Firebase לפלטפורמות של אפל:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. בוחרים את הספרייה Dynamic Links.
  5. מוסיפים את הדגל -ObjC לקטע Other Linker Flags (דגלים אחרים של מקשרים) בהגדרות ה-build של היעד.
  6. כדי ליהנות מחוויית שימוש אופטימלית ב-Dynamic Links, מומלץ להפעיל את Google Analytics בפרויקט Firebase ולהוסיף לאפליקציה את Firebase SDK for Google Analytics. אפשר לבחור בספרייה בלי איסוף של IDFA או בספרייה עם איסוף של IDFA. שאלות נפוצות על הארגון העדכני של המודולים ב-Google Analytics for Firebase SDK
  7. אחרי שתסיימו, פלטפורמת Xcode תתחיל לטפל ביחסי התלות ולהוריד אותם באופן אוטומטי ברקע.

עכשיו מבצעים כמה שלבי הגדרה:

  1. במסוף Firebase, פותחים את הקטע Dynamic Links. אם מוצגת בקשה לאשר את התנאים וההגבלות, מאשרים אותם.
  2. מוודאים שמזהה האפליקציה ב-App Store והקידומת של מזהה האפליקציה מצוינים בהגדרות האפליקציה. כדי לראות ולערוך את הגדרות האפליקציה, נכנסים ל דף ההגדרות של הפרויקט ב-Firebase ובוחרים את האפליקציה ל-iOS.

    כדי לוודא שהפרויקט ב-Firebase מוגדר כמו שצריך לשימוש ב-Dynamic Links באפליקציה ל-iOS, פותחים את כתובת ה-URL הבאה:

    https://your_dynamic_links_domain/apple-app-site-association

    אם האפליקציה מקושרת, הקובץ apple-app-site-association מכיל הפניה לקידומת של מזהה האפליקציה ולמזהה החבילה של האפליקציה. לדוגמה:

    {"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["NOT /_/*","/*"]}]}}

    אם השדה details ריק, צריך לוודא שציינתם את הקידומת של מזהה האפליקציה. חשוב לשים לב שהקידומת של מזהה האפליקציה לא בהכרח זהה למזהה הצוות.

  3. אופציונלי: משביתים את השימוש של ה-SDK של Dynamic Links בלוח של iOS.

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

    החיסרון הוא שהשימוש בלוח מעורר התראה ב-iOS 14 ואילך. לכן, בפעם הראשונה שמשתמשים פותחים את האפליקציה, אם לוח ההדבקה מכיל כתובת URL, הם יראו התראה על כך שהאפליקציה ניגשה ללוח ההדבקה, וזה עלול לבלבל אותם.

    כדי להשבית את ההתנהגות הזו, עורכים את הקובץ Info.plist של פרויקט Xcode ומגדירים את המפתח FirebaseDeepLinkPasteboardRetrievalEnabled לערך NO.

  1. בכרטיסייה Info בפרויקט Xcode של האפליקציה, יוצרים סוג חדש של כתובת URL שישמש ל-Dynamic Links. מגדירים את השדה Identifier לערך ייחודי ואת השדה URL scheme למזהה החבילה, שהוא סכמת ברירת המחדל של כתובת ה-URL שמשמשת את Dynamic Links.
  2. בכרטיסייה Capabilities (יכולות) בפרויקט Xcode של האפליקציה, מפעילים את האפשרות Associated Domains (דומיינים משויכים) ומוסיפים את הדומיינים הבאים לרשימה Associated Domains:
    applinks:your_dynamic_links_domain
  3. אם אתם רוצים לקבל Dynamic Links עם דומיין בהתאמה אישית מלאה, בקובץ Info.plist של הפרויקט ב-Xcode, צרו מפתח בשם FirebaseDynamicLinksCustomDomains והגדירו אותו לתחיליות של כתובות ה-URL של Dynamic Links באפליקציה. לדוגמה:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. מייבאים את המודול FirebaseCore אל UIApplicationDelegate, וגם כל מודול Firebase אחר שבו משתמש ה-app delegate. לדוגמה, כדי להשתמש ב-Cloud Firestore וב-Authentication:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. מגדירים מופע משותף של FirebaseApp ב-method‏ application(_:didFinishLaunchingWithOptions:) של הנציג של האפליקציה:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. אם אתם משתמשים ב-SwiftUI, אתם צריכים ליצור נציג של האפליקציה ולצרף אותו ל-struct של App באמצעות UIApplicationDelegateAdaptor או NSApplicationDelegateAdaptor. צריך גם להשבית את ה-swizzling של נציג האפליקציה. מידע נוסף זמין בהוראות של SwiftUI.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  7. בשלב הבא, בשיטה application:continueUserActivity:restorationHandler: , מטפלים בקישורים שמתקבלים בתור קישורים אוניברסליים כשהאפליקציה כבר מותקנת:

    Swift

    הערה: המוצר הזה לא זמין ביעדים של macOS,‏ Mac Catalyst,‏ tvOS או watchOS.
    func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
      let handled = DynamicLinks.dynamicLinks()
        .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in
          // ...
        }
    
      return handled
    }

    Objective-C

    הערה: המוצר הזה לא זמין ביעדים של macOS,‏ Mac Catalyst,‏ tvOS או watchOS.
    - (BOOL)application:(UIApplication *)application
    continueUserActivity:(nonnull NSUserActivity *)userActivity
     restorationHandler:
    #if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
    (nonnull void (^)(NSArray<id> *_Nullable))restorationHandler {
    #else
        (nonnull void (^)(NSArray *_Nullable))restorationHandler {
    #endif  // __IPHONE_12_0
      BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
                                                              completion:^(FIRDynamicLink * _Nullable dynamicLink,
                                                                           NSError * _Nullable error) {
                                                                // ...
                                                              }];
      return handled;
    }
  8. לבסוף, ב-application:openURL:options: מטפלים בקישורים שמתקבלים דרך סכימת כתובות ה-URL המותאמת אישית של האפליקציה. השיטה הזו נקראת כשהאפליקציה נפתחת בפעם הראשונה אחרי ההתקנה.

    אם ה-Dynamic Link לא נמצא בהפעלה הראשונה של האפליקציה, השיטה הזו תיקרא עם הערך nil ב-url של DynamicLink, כדי לציין שערכת ה-SDK לא הצליחה למצוא Dynamic Link תואם בהמתנה.

    Swift

    הערה: המוצר הזה לא זמין ביעדים של macOS,‏ Mac Catalyst,‏ tvOS או watchOS.
    @available(iOS 9.0, *)
    func application(_ app: UIApplication, open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
      return application(app, open: url,
                         sourceApplication: options[UIApplication.OpenURLOptionsKey
                           .sourceApplication] as? String,
                         annotation: "")
    }
    
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
                     annotation: Any) -> Bool {
      if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
        // Handle the deep link. For example, show the deep-linked content or
        // apply a promotional offer to the user's account.
        // ...
        return true
      }
      return false
    }

    Objective-C

    הערה: המוצר הזה לא זמין ביעדים של macOS,‏ Mac Catalyst,‏ tvOS או watchOS.
    - (BOOL)application:(UIApplication *)app
                openURL:(NSURL *)url
                options:(NSDictionary *)options {
      return [self application:app
                       openURL:url
             sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }
    
    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
      FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
    
      if (dynamicLink) {
        if (dynamicLink.url) {
          // Handle the deep link. For example, show the deep-linked content,
          // apply a promotional offer to the user's account or show customized onboarding view.
          // ...
        } else {
          // Dynamic link has empty deep link. This situation will happens if
          // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link,
          // but pending link is not available for this device/App combination.
          // At this point you may display default onboarding view.
        }
        return YES;
      }
      return NO;
    }