Odbieranie linków dynamicznych w iOS

Aby otrzymać Firebase Dynamic Links, który utworzyłeś, musisz dodać do aplikacji pakiet SDK Dynamic Links i wywoływać metody handleUniversalLink:dynamicLinkFromCustomSchemeURL:, gdy aplikacja się wczytuje, aby pobrać dane przekazane w parametry Dynamic Link.

Wymagania wstępne

Zanim zaczniesz, dodaj Firebase do swojego projektu na iOS.

Do instalacji zależności Firebase i zarządzania nimi możesz używać menedżera pakietów Swift.

  1. Po otwarciu projektu aplikacji w Xcode wybierz Plik > Dodaj pakiety.
  2. Gdy pojawi się prośba, dodaj repozytorium SDK platform Apple Platform SDK Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę Dynamic Links.
  5. Dodaj flagę -ObjC w sekcji Inne flagi linkera w ustawieniach kompilacji docelowej.
  6. Aby uzyskać optymalne wyniki w przypadku 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 zbieraniem identyfikatorów IDFA lub bez niego.
  7. Gdy to zrobisz, Xcode automatycznie zacznie wyszukiwać i pobierać zależności w tle.

Teraz wykonaj czynności konfiguracyjne:

  1. W konsoli Firebase otwórz sekcję Dynamic Links. Zaakceptuj warunki korzystania z usługi, jeśli pojawi się taka prośba.
  2. Sprawdź, czy identyfikator App Store i prefiks identyfikatora aplikacji są określone w ustawieniach aplikacji. Aby wyświetlić i zmienić ustawienia aplikacji, otwórz stronę Ustawienia projektu Firebase i wybierz aplikację na iOS.

    Aby sprawdzić, czy Twój projekt Firebase jest prawidłowo skonfigurowany do używania funkcji 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 odwołanie 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 podano prefiks identyfikatora aplikacji. Pamiętaj, że prefiks identyfikatora aplikacji może nie być taki sam jak identyfikator zespołu.

  3. Opcjonalnie: wyłącz korzystanie pakietu Dynamic Links SDK z Przystawki na iOS.

    Domyślnie pakiet SDK Dynamic Links używa schowka, aby zwiększyć niezawodność precyzyjnych linków po instalacji. Korzystając z paska, Dynamic Links może mieć pewność, że gdy użytkownik otworzy plik Dynamic Link, ale najpierw musi zainstalować Twoją aplikację, po pierwszym uruchomieniu aplikacji po jej zainstalowaniu może on od razu przejść do oryginalnej połączonej treści.

    Wadą jest to, że użycie schowka powoduje wyświetlenie powiadomienia w systemie iOS 14 lub nowszym. Dlatego gdy użytkownicy po raz pierwszy otworzą aplikację, jeśli schowek zawiera adres URL, zobaczą powiadomienie, że aplikacja uzyskała dostęp do schowka. Może to wywołać ich niepokój.

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

  1. Na karcie Info (Informacje) projektu Xcode aplikacji utwórz nowy typ adresu URL, który będzie używany na potrzeby Dynamic Links. W polu Identyfikator wpisz unikalną wartość, a w polu Schemat URL wpisz identyfikator pakietu, który jest domyślnym schematem URL używanym przez Dynamic Links.
  2. Na karcie Możliwości w projekcie Xcode aplikacji włącz opcję Powiązane domeny i dodaj do listy Powiązane domeny te informacje:
    applinks:your_dynamic_links_domain
  3. Jeśli chcesz otrzymywać Dynamic Linkspełną domeną niestandardową, w pliku Info.plist projektu Xcode utwórz klucz o nazwie FirebaseDynamicLinksCustomDomains i przypisz go do prefiksów URL-i Dynamic Links aplikacji. Przykład:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
  4. Zaimportuj moduł FirebaseCore w pliku UIApplicationDelegate, a także wszystkie inne moduły Firebase, których używa delegowany obiekt aplikacji. Aby na przykład użyć właściwości Cloud FirestoreAuthentication:

    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 współdzieloną instancję FirebaseApp w metodzie application(_:didFinishLaunchingWithOptions:) w delegacie 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ć przedstawiciela aplikacji i dołączyć go do struktury App za pomocą UIApplicationDelegateAdaptor lub NSApplicationDelegateAdaptor. Musisz też wyłączyć swizlowanie zastępników aplikacji. Więcej informacji znajdziesz w instrukcjach 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ługa linków otrzymanych jako linki uniwersalne, gdy aplikacja jest już zainstalowana:

    Swift

    Uwaga: ta usługa nie jest dostępna w przypadku systemów operacyjnych 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 w przypadku systemów operacyjnych 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<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. Na koniec w application:openURL:options: obsługuj linki otrzymane przez schemat niestandardowego adresu URL Twojej aplikacji. Ta metoda jest wywoływana przy pierwszym otwarciu aplikacji po instalacji.

    Jeśli Dynamic Link nie zostanie znaleziony przy pierwszym uruchomieniu aplikacji, ta metoda zostanie wywołana z wartością url url równą nil, co oznacza, że pakiet SDK nie znalazł pasującego oczekującego Dynamic Link.

    Swift

    Uwaga: ta usługa nie jest dostępna w przypadku systemów operacyjnych 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 w przypadku systemów operacyjnych macOS, Mac Catalyst, tvOS ani 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;
    }