Как получать динамические ссылки на iOS

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

Требования

Прежде всего добавьте Firebase в проект iOS.

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

  1. Откройте проект приложения в Xcode и перейдите в меню File (Файл) > Add Packages (Добавить пакеты).
  2. Когда появится запрос, добавьте хранилище Firebase SDK для платформ Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Выберите библиотеку Dynamic Links.
  5. Добавьте флаг -ObjC в раздел Other Linker Flags (Другие флаги компоновщика) в настройках сборки целевого объекта.
  6. Чтобы использовать все возможности Dynamic Links, рекомендуем включить Google Analytics в проекте Firebase и добавить в приложение Firebase SDK для Google Аналитики. Вы можете выбрать подходящую библиотеку в зависимости от того, нужно ли собирать IDFA. Ознакомьтесь с разделом часто задаваемых вопросов о последней организации модулей в Google Analytics для Firebase SDK.
  7. После этого Xcode автоматически начнет распознавать и скачивать зависимости в фоновом режиме.

Затем выполните настройку:

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

    Чтобы убедиться, что проект Firebase правильно настроен для использования Dynamic Links в приложении 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. Необязательно. Запретите Dynamic Links SDK использовать буфер обмена iOS.

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

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

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

  1. На вкладке Info (Информация) проекта Xcode создайте новый тип URL для Dynamic Links. В поле Identifier (Идентификатор) укажите уникальное значение, а в поле URL scheme (Схема URL) – идентификатор пакета, который является схемой URL по умолчанию для Dynamic Links.
  2. На вкладке Capabilities (Возможности) проекта Xcode включите параметр Associated Domains (Связанные домены) и добавьте в список Associated Domains (Связанные домены) следующее:
    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
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  5. Настройте общий экземпляр FirebaseApp в методе 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. Если вы используете SwiftUI, вам нужно создать делегат приложения и прикрепить его к структуре App с помощью UIApplicationDelegateAdaptor или NSApplicationDelegateAdaptor. Также необходимо отключить подмену делегата приложения. Дополнительную информацию можно найти в инструкциях по 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: обработайте ссылки, полученные как универсальные ссылки, когда приложение уже установлено:

    Swift

    Примечание. Этот продукт недоступен для 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> *_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 не будет найден, этот метод будет вызван с параметром DynamicLinkurl, для которого задано значение nil. Это означает, что SDK не удалось найти соответствующий ожидающий Dynamic Link.

    Swift

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