Odbieranie linków dynamicznych w iOS

Aby otrzymywać Firebase Dynamic Links utworzone przez Ciebie, musisz uwzględnić w aplikacji pakiet SDK Dynamic Links i wywołać metody handleUniversalLink: i dynamicLinkFromCustomSchemeURL: podczas ładowania aplikacji, aby uzyskać dane przekazywane w Dynamic Link.

Wymagania wstępne

Zanim zaczniesz, dodaj Firebase do projektu na iOS.

Do instalowania zależności Firebase i zarządzania nimi używaj menedżera pakietów Swift.

  1. W Xcode, gdy projekt aplikacji jest otwarty, kliknij File > Add Packages (Plik > Dodaj pakiety).
  2. Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę Dynamic Links.
  5. Dodaj flagę -ObjC do sekcji Other Linker Flags (Inne flagi łączące) w ustawieniach kompilacji celu.
  6. Aby zapewnić optymalne działanie Dynamic Links, zalecamy włączenie Google Analytics w projekcie Firebase i dodanie do aplikacji pakietu SDK Firebase dla Google Analytics. Możesz wybrać bibliotekę z gromadzeniem identyfikatorów IDFA lub bez niego. Zapoznaj się z najczęstszymi pytaniami dotyczącymi najnowszej organizacji modułów w pakiecie SDK Google Analytics dla Firebase.
  7. Gdy skończysz, Xcode zacznie automatycznie przetwarzać i pobierać zależności w tle.

Teraz wykonaj kilka czynności konfiguracyjnych:

  1. W konsoli Firebase otwórz sekcję Dynamic Links. Zaakceptuj warunki korzystania z usługi, jeśli pojawi się taka prośba.
  2. Upewnij się, że w ustawieniach aplikacji podany jest jej identyfikator w sklepie z aplikacjami i prefiks identyfikatora aplikacji. Aby wyświetlić i edytować ustawienia aplikacji, otwórz stronę ustawień projektu w Firebase i wybierz aplikację na iOS.

    Aby sprawdzić, czy projekt w Firebase jest prawidłowo skonfigurowany do używania Dynamic Links w aplikacji na iOS, otwórz ten adres URL:

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

    Jeśli aplikacja jest połączona, plik apple-app-site-association zawiera odniesienie do prefiksu identyfikatora aplikacji i identyfikatora pakietu. Przykład:

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

    Jeśli pole details jest puste, sprawdź, czy został podany prefiks identyfikatora aplikacji. Pamiętaj, że prefiks identyfikatora aplikacji może nie być taki sam jak identyfikator zespołu.

  3. Opcjonalnie: wyłącz korzystanie przez pakiet SDK Dynamic Links ze schowka iOS.

    Domyślnie pakiet SDK Dynamic Links używa schowka, aby zwiększyć niezawodność precyzyjnych linków po instalacji. Dzięki schowkowi Dynamic Links może mieć pewność, że gdy użytkownik otworzy Dynamic Link, ale najpierw musi zainstalować Twoją aplikację, po jej pierwszym uruchomieniu po instalacji będzie mógł od razu przejść do pierwotnie połączonych treści.

    Wadą tego rozwiązania jest to, że użycie schowka powoduje wyświetlenie powiadomienia w systemie iOS 14 i nowszych. Gdy użytkownicy po raz pierwszy otworzą aplikację, a w schowku będzie adres URL, zobaczą powiadomienie, że aplikacja uzyskała dostęp do schowka, co może ich zdezorientować.

    Aby wyłączyć to zachowanie, zmodyfikuj plik Info.plist projektu Xcode i ustaw klucz FirebaseDeepLinkPasteboardRetrievalEnabled na NO.

  1. Na karcie Informacje w projekcie Xcode aplikacji utwórz nowy typ adresu URL, który będzie używany w przypadku Dynamic Links. W polu Identyfikator ustaw unikalną wartość, a w polu Schemat URI adresu URL ustaw identyfikator pakietu, który jest domyślnym schematem URI adresu URL używanym przez Dynamic Links.
  2. Na karcie Możliwości w projekcie Xcode aplikacji włącz powiązane domeny i dodaj do listy Powiązane domeny te elementy:
    applinks:your_dynamic_links_domain
  3. Jeśli chcesz otrzymywać Dynamic Links z w pełni niestandardową domeną, w pliku Info.plist projektu Xcode utwórz klucz o nazwie FirebaseDynamicLinksCustomDomains i ustaw go na prefiksy adresów URL Dynamic Links aplikacji. Przykład:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. Zaimportuj moduł FirebaseCore do pliku UIApplicationDelegate oraz wszystkie inne moduły Firebase, których używa delegat aplikacji. Aby na przykład użyć właściwości Cloud Firestore i 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. Skonfiguruj udostępnioną instancję FirebaseApp w metodzie application(_:didFinishLaunchingWithOptions:) delegata aplikacji:

    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. Jeśli używasz SwiftUI, musisz utworzyć obiekt delegowany aplikacji i dołączyć go do struktury App za pomocą UIApplicationDelegateAdaptor lub NSApplicationDelegateAdaptor. Musisz też wyłączyć swizzling delegata aplikacji. Więcej informacji znajdziesz w instrukcjach dotyczących 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. Następnie w metodzie application:continueUserActivity:restorationHandler: obsłuż linki otrzymane jako uniwersalne linki, gdy aplikacja jest już zainstalowana:

    Swift

    Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem macOS, Mac Catalyst, tvOS ani 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

    Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem macOS, Mac Catalyst, tvOS ani 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. Na koniec w metodzie application:openURL:options: obsłuż linki otrzymane za pomocą niestandardowego schematu URI adresu URL aplikacji. Ta metoda jest wywoływana, gdy aplikacja jest otwierana po raz pierwszy po instalacji.

    Jeśli przy pierwszym uruchomieniu aplikacji nie zostanie znaleziony obiekt Dynamic Link, ta metoda zostanie wywołana z właściwością url obiektu DynamicLink ustawioną na nil, co oznacza, że pakiet SDK nie znalazł pasującego oczekującego obiektu Dynamic Link.

    Swift

    Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem macOS, Mac Catalyst, tvOS ani 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

    Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem macOS, Mac Catalyst, tvOS ani 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;
    }