Odbieranie linków dynamicznych w iOS

Aby otrzymać utworzone przez siebie Linki dynamiczne Firebase, musisz umieścić w aplikacji pakiet SDK Linków dynamicznych, a podczas wczytywania aplikacji wywoływać metody handleUniversalLink: i dynamicLinkFromCustomSchemeURL:, by przekazać dane w linku dynamicznym.

Wymagania wstępne

Zanim zaczniesz, dodaj Firebase do swojego projektu na iOS.

Użyj menedżera pakietów Swift, aby zainstalować zależności Firebase i nimi zarządzać.

  1. Po otwarciu projektu aplikacji przejdź w Xcode do File > Add Packages (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ę linków dynamicznych.
  5. Dodaj flagę -ObjC do sekcji Inne flagi łączące w ustawieniach kompilacji celu.
  6. Aby zapewnić optymalne działanie linków dynamicznych, włącz Google Analytics w projekcie Firebase i dodaj do aplikacji pakiet SDK Firebase dla Google Analytics. Możesz wybrać bibliotekę bez zbierania danych IDFA lub z zbieraniem identyfikatorów IDFA.
  7. Po zakończeniu Xcode automatycznie rozpocznie rozpoznawanie i pobieranie zależności w tle.

Teraz wykonaj kilka czynności konfiguracyjnych:

  1. W konsoli Firebase otwórz sekcję Połączenia dynamiczne. Jeśli pojawi się taka prośba, zaakceptuj warunki korzystania z usługi.
  2. Upewnij się, że w ustawieniach aplikacji podano identyfikator z App Store i jej prefiks. Aby wyświetlić i edytować ustawienia aplikacji, otwórz stronę Ustawienia w projekcie Firebase i wybierz swoją aplikację na iOS.

    Aby sprawdzić, czy projekt Firebase jest prawidłowo skonfigurowany do korzystania z linków dynamicznych w aplikacji na iOS, otwórz ten URL:

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

    Jeśli Twoja 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ź jeszcze raz, 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 możliwość korzystania przez pakiet SDK linków dynamicznych z wklejenia do iOS.

    Domyślnie pakiet SDK Linków dynamicznych korzysta z wklejenia, aby zwiększyć niezawodność precyzyjnych linków po instalacji. Korzystając z paskowania, linki dynamiczne pozwalają zapewnić, że gdy użytkownik otworzy link dynamiczny, ale najpierw musi zainstalować Twoją aplikację, po pierwszym otwarciu aplikacji po instalacji będzie mógł od razu przejść do oryginalnej treści powiązanej z linkiem.

    Wadą jest to, że użycie schowka powoduje wyświetlenie powiadomienia w systemie iOS 14 lub nowszym. Dlatego gdy po raz pierwszy użytkownicy otworzą Twoją aplikację, jeśli wklejony tekst zawiera adres URL, zobaczą powiadomienie o tym, że aplikacja uzyskała dostęp do tego obszaru, co może powodować dezorientację.

    Aby wyłączyć to zachowanie, edytuj 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 na potrzeby Linków dynamicznych. W polu Identyfikator ustaw unikalną wartość, a w polu Schemat adresu URL wpisz identyfikator pakietu, który jest domyślnym schematem adresu URL używanym przez Linki dynamiczne.
  2. Na karcie Capabilities (Możliwości) w projekcie Xcode aplikacji włącz powiązane domeny i dodaj te pozycje do listy Powiązane domeny:
    applinks:your_dynamic_links_domain
  3. Jeśli chcesz otrzymywać linki dynamiczne 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 linków dynamicznych swojej aplikacji. Przykład:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. Zaimportuj moduł FirebaseCore do obiektu UIApplicationDelegate, a także wszystkie inne moduły Firebase używane przez przedstawiciela aplikacji. Aby na przykład użyć Cloud Firestore i Uwierzytelniania:

    Certyfikat 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:) przedstawiciela aplikacji:

    Certyfikat 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ć przełączanie przekazywania dostępu do aplikacji. Więcej informacji znajdziesz w instrukcjach SwiftUI.

    Certyfikat 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 na urządzeniach docelowych z systemami macOS, Mac Catalyst, tvOS i 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 docelowych z systemami macOS, Mac Catalyst, tvOS i 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 przy pierwszym uruchomieniu aplikacji nie uda się znaleźć linku dynamicznego, ta metoda zostanie wywołana z wartością url DynamicLink ustawioną na nil, co oznacza, że pakiet SDK nie znalazł pasującego oczekującego linku dynamicznego.

    Swift

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