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

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

Предпосылки

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

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

  1. В Xcode откройте проект приложения и перейдите в меню Файл > Добавить пакеты .
  2. При появлении соответствующего запроса добавьте репозиторий Firebase Apple platform SDK:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Выберите библиотеку Dynamic Links .
  5. Добавьте флаг -ObjC в раздел «Другие флаги компоновщика» настроек сборки вашей цели.
  6. Для оптимального опыта работы с Dynamic Links мы рекомендуем включить Google Analytics в вашем проекте Firebase и добавить Firebase SDK для Google Analytics в ваше приложение. Вы можете выбрать либо библиотеку без сбора IDFA, либо с сбором IDFA. Ознакомьтесь с нашими часто задаваемыми вопросами о последней организации модулей в Google Analytics для Firebase SDK .
  7. По завершении Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.

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

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

    Вы можете убедиться, что ваш проект Firebase правильно настроен для использования Dynamic Links в вашем приложении iOS, открыв следующий URL-адрес:

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

    Если ваше приложение подключено, файл apple-app-site-association содержит ссылку на префикс App ID вашего приложения и bundle ID. Например:

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

    Если поле details пустое, дважды проверьте, что вы указали префикс App ID. Обратите внимание, что префикс App ID может не совпадать с вашим Team ID.

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

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

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

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

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

    SwiftUI

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

    Быстрый

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-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()

    Objective-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
    }

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

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

    Быстрый

    Примечание: этот продукт недоступен на платформах 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
    }

    Objective-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;
    }