Catch up on highlights from Firebase at Google I/O 2023. Learn more

Получение динамических ссылок на iOS

Чтобы получить созданные вами динамические ссылки Firebase, вы должны включить пакет SDK для динамических ссылок в свое приложение и вызвать методы handleUniversalLink: и dynamicLinkFromCustomSchemeURL: при загрузке приложения, чтобы получить данные, переданные в динамической ссылке.

Предпосылки

Прежде чем начать, обязательно добавьте Firebase в свой проект iOS .

Используйте диспетчер пакетов Swift для установки и управления зависимостями Firebase.

  1. В Xcode при открытом проекте приложения перейдите в File > Add Packages .
  2. При появлении запроса добавьте репозиторий SDK Firebase для платформ Apple:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Выберите библиотеку динамических ссылок.
  5. Для оптимальной работы с динамическими ссылками мы рекомендуем включить Google Analytics в вашем проекте Firebase и добавить Firebase SDK для Google Analytics в ваше приложение. Вы можете выбрать библиотеку без коллекции IDFA или с коллекцией IDFA.
  6. Когда закончите, Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.

Теперь выполните несколько шагов настройки:

  1. В консоли Firebase откройте раздел Dynamic Links . Примите условия обслуживания, если вам будет предложено это сделать.
  2. Убедитесь, что идентификатор вашего приложения в App Store и префикс идентификатора приложения указаны в настройках вашего приложения. Чтобы просмотреть и изменить настройки своего приложения, перейдите на страницу настроек вашего проекта Firebase и выберите свое приложение для iOS.

    Вы можете убедиться, что ваш проект Firebase правильно настроен для использования динамических ссылок в вашем приложении 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 пусто, еще раз проверьте, указали ли вы префикс идентификатора приложения. Обратите внимание, что ваш префикс идентификатора приложения может не совпадать с идентификатором вашей команды.

  3. Необязательно : отключите использование SDK Dynamic Links монтажного стола iOS.

    По умолчанию Dynamic Links SDK использует монтажный стол для повышения надежности глубоких ссылок после установки. Используя монтажный стол, динамические ссылки могут гарантировать, что когда пользователь открывает динамическую ссылку, но ему необходимо сначала установить ваше приложение, пользователь может сразу перейти к исходному связанному содержимому при открытии приложения в первый раз после установки.

    Недостатком этого является то, что использование монтажного стола вызывает уведомление на iOS 14 и более поздних версиях. Таким образом, когда пользователи впервые откроют ваше приложение, если монтажный стол содержит URL-адрес, они увидят уведомление о том, что ваше приложение получило доступ к монтажному столу, что может вызвать путаницу.

    Чтобы отключить это поведение, отредактируйте файл Info.plist вашего проекта Xcode и установите для ключа FirebaseDeepLinkPasteboardRetrievalEnabled NO .

  1. На вкладке «Информация» проекта Xcode вашего приложения создайте новый тип URL-адреса, который будет использоваться для динамических ссылок. Задайте для поля «Идентификатор» уникальное значение, а в поле «Схема URL-адресов» укажите идентификатор вашего пакета, который является схемой URL-адресов по умолчанию, используемой динамическими ссылками.
  2. На вкладке «Возможности» проекта Xcode вашего приложения включите «Связанные домены» и добавьте в список «Связанные домены» следующее:
    applinks:your_dynamic_links_domain
  3. Если вы хотите получать динамические ссылки с полностью настраиваемым доменом , в файле Info.plist вашего проекта Xcode создайте ключ с именем FirebaseDynamicLinksCustomDomains и задайте для него префиксы URL-адресов динамических ссылок вашего приложения. Например:
    FirebaseDynamicLinksCustomDomains
    
      https://example.com/promos
      https://example.com/links/share
    
    
  4. Импортируйте модуль FirebaseCore в свой UIApplicationDelegate , а также любые другие модули Firebase, которые использует ваш делегат приложения. Например, чтобы использовать Cloud Firestore и аутентификацию:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Быстрый

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Цель-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. Настройте общий экземпляр FirebaseApp в методе application application(_:didFinishLaunchingWithOptions:) вашего делегата приложения:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Быстрый

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Цель-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  6. Если вы используете SwiftUI, вы должны создать делегат приложения и прикрепить его к своей структуре App через UIApplicationDelegateAdaptor или NSApplicationDelegateAdaptor . Вы также должны отключить swizzling делегата приложения. Дополнительные сведения см. в инструкциях 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: обработайте ссылки, полученные как универсальные ссылки, когда приложение уже установлено:

    Быстрый

    Примечание. Этот продукт недоступен для целей 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
    }
    

    Цель-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 вашего приложения. Этот метод вызывается, когда ваше приложение открывается в первый раз после установки.

    Если динамическая ссылка не найдена при первом запуске вашего приложения, этот метод будет вызываться с url DynamicLink , установленным на nil , что указывает на то, что SDK не удалось найти соответствующую ожидающую динамическую ссылку.

    Быстрый

    Примечание. Этот продукт недоступен для целей 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
    }
    

    Цель-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;
    }