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

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

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

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

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

  1. ב-Xcode, כשפרויקט האפליקציה פתוח, עוברים אל קובץ > הוספת חבילות.
  2. כשמופיעה בקשה, מוסיפים את המאגר של Firebase SDK לפלטפורמות של Apple:
  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.
  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 ריק, צריך לוודא שציינתם את הקידומת של מזהה האפליקציה. לתשומת ליבכם: התחילית של מזהה האפליקציה עשויה להיות שונה מ-Team ID.

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

    כברירת מחדל, Dynamic Links SDK משתמש בלוח העריכה כדי לשפר את האמינות של קישורי עומק לאחר ההתקנה. באמצעות הלוח, 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 עם דומיין מותאם אישית לחלוטין, יוצרים מפתח בשם FirebaseDynamicLinksCustomDomains בקובץ Info.plist של הפרויקט ב-Xcode ומגדירים אותו כתחילית של כתובות ה-URL מסוג Dynamic Links של האפליקציה. לדוגמה:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. מייבאים את המודול FirebaseCore ב-UIApplicationDelegate, וגם את כל המודולים האחרים של Firebase שבהם משתמש הנציג של האפליקציה. לדוגמה, כדי להשתמש ב-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, עליכם ליצור נציג מורשה לאפליקציה ולצרף אותו ל-build של App דרך UIApplicationDelegateAdaptor או באמצעות NSApplicationDelegateAdaptor. צריך גם להשבית את החלפת הקוד של נציג האפליקציה. מידע נוסף זמין בהוראות ל-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<UIUserActivityRestoring>> *_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 לא נמצא בהפעלה הראשונה של האפליקציה, תתבצע קריאה לשיטה הזו כאשר ה-url של DynamicLink מוגדר ל-nil, כדי לציין שה-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<NSString *, id> *)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;
    }