Odbieranie linków dynamicznych w iOS

Aby otrzymać Linki dynamiczne Firebase, które utworzonej przez siebie, musisz umieścić w aplikacji pakiet SDK Linków dynamicznych i wywołać metodę handleUniversalLink: i dynamicLinkFromCustomSchemeURL: podczas wczytywania aplikacji, by pobrać dane przekazywane w linku dynamicznym.

Wymagania wstępne

Zanim zaczniesz, dodaj Firebase do swojego systemu iOS projekt.

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

  1. W Xcode po otwarciu projektu aplikacji przejdź do File > 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, zalecamy włączenie Google Analytics, w projekcie Firebase i dodając do aplikacji pakiet SDK Firebase dla Google Analytics. Dostępne opcje wybrać bibliotekę bez zbierania danych IDFA lub z zbieraniem danych IDFA.
  7. Po zakończeniu Xcode automatycznie rozpocznie rozpoznawanie i pobieranie lub zależności w tle.

Teraz wykonaj kilka czynności konfiguracyjnych:

  1. W konsoli Firebase otwórz Linki dynamiczne. . Jeśli pojawi się taka prośba, zaakceptuj warunki korzystania z usługi.
  2. Upewnij się, że identyfikator aplikacji w sklepie App Store oraz jej prefiks to w ustawieniach aplikacji. Aby wyświetlić i edytować ustawienia aplikacji, wejdź na do właściwości Twojego projektu Firebase stronę Ustawienia i wybierz aplikację na iOS.

    Możesz sprawdzić, czy Twój projekt Firebase jest prawidłowo skonfigurowany do używania Linki dynamiczne w aplikacji na iOS przez otwarcie tego adresu 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 aplikacji. Przykład:

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

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

  3. Opcjonalnie: wyłącz używanie iOS przez pakiet SDK Linków dynamicznych i wklejenie do tablicy.

    Domyślnie pakiet Dynamic Links SDK korzysta z polecanego tekstu, aby ulepszać niezawodności precyzyjnych linków po instalacji. Linki dynamiczne może sprawić, że gdy użytkownik otworzy link dynamiczny, ale będzie musiał zainstalować aplikacji, użytkownik może od razu przejść do pierwotnie uruchomienia aplikacji po raz pierwszy po jej zainstalowaniu.

    Wadą tego rozwiązania jest fakt, że korzystanie ze schowka powoduje na urządzeniach z iOS 14 i nowszych. Gdy więc pierwszy raz użytkownicy otworzą aplikację, jeśli wklejony adres URL zawiera adres URL, użytkownik zobaczy powiadomienie o tym, aplikacja uzyskała dostęp do schowka, co mogło powodować dezorientację.

    Aby wyłączyć to zachowanie, zmodyfikuj parametr Info.plist i ustaw wartość FirebaseDeepLinkPasteboardRetrievalEnabled klawisz do NO

  1. Na karcie Info (Informacje) w projekcie Xcode swojej aplikacji utwórz nowy obiekt. Typ adresu URL dla linków dynamicznych. Ustaw parametr pola Identyfikator na niepowtarzalną wartość, a pola Schemat adresu URL, na identyfikator pakietu, który jest domyślnym schematem URL-a używanym przez Linki dynamiczne.
  2. Na karcie Capabilities (Możliwości) w projekcie Xcode aplikacji włącz powiązane domeny i dodaj następujące elementy do powiązanych Lista domen:
    applinks:your_dynamic_links_domain
  3. Jeśli chcesz otrzymywać linki dynamiczne z parametrem full-custom domain (w pełni niestandardowa domena) pliku Info.plist projektu Xcode, utwórz klucz o nazwie FirebaseDynamicLinksCustomDomains i ustaw go na Prefiksy adresu URL Linków dynamicznych. Na przykład:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. Zaimportuj moduł FirebaseCore do UIApplicationDelegate, jak i wszelkie inne Moduły Firebase używane przez przedstawiciela aplikacji. Aby na przykład użyć Cloud Firestore i Uwierzytelniania:

    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 FirebaseApp współdzielonej instancji w uprawnieniach przedstawiciela aplikacji Metoda 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. Jeśli używasz SwiftUI, musisz utworzyć i dołączyć przedstawiciela aplikacji. do struktury App za pomocą UIApplicationDelegateAdaptor lub NSApplicationDelegateAdaptor Musisz też wyłączyć przełączanie przekazywania dostępu do aplikacji. Dla: 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, jeśli 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. Wreszcie w linkach nickujących w usłudze application:openURL:options: ze schematu niestandardowego adresu URL aplikacji. Ta metoda jest wywoływana, gdy aplikacja jest otwierana po raz pierwszy po instalacji.

    Jeśli przy pierwszym uruchomieniu aplikacji nie uda się znaleźć linku dynamicznego, ta metoda zostanie wywołana z poleceniem Wartość url w DynamicLink ma wartość nil, co oznacza, że pakiet SDK nie udało się znaleźć 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;
    }