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

С помощью Firebase Dynamic Links Builder API можно создавать короткие или длинные Dynamic Links. Этот API принимает либо длинный URL Dynamic Link, либо объект, содержащий параметры Dynamic Link, и возвращает URL, подобные следующим:

https://example.com/link/WXYZ
https://example.page.link/WXYZ

Требования

Прежде всего добавьте 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. Если вы ещё не приняли условия использования и не задали префикс URI для Dynamic Links, сделайте это, когда появится запрос.

    Если у вас уже есть префикс URI Dynamic Links, запишите его. Его необходимо указывать при программном создании Dynamic Links.

  3. Рекомендуется указать шаблоны URL, которые разрешены в ссылках на контент и резервных ссылках. Это не позволит посторонним лицам создавать Dynamic Links, которые перенаправляют пользователей с вашего домена на сайты, которые вы не контролируете. Подробнее о том, как разрешить определенные шаблоны URL…
  4. Убедитесь, что в настройках приложения указаны его идентификатор в магазине приложений и префикс идентификатора. Чтобы посмотреть и изменить настройки приложения, перейдите на страницу настроек проекта Firebase и выберите приложение для iOS.

    Убедитесь, что проект Firebase правильно настроен для использования Dynamic Links в приложении iOS. Для этого откройте файл apple-app-site-association, размещенный в домене Dynamic Links. Firebase будет показывать файл apple-app-site-association из корневого каталога домена, а также подкаталога .well-known. Пример:

        https://example.com/apple-app-site-association
        https://example.com/.well-known/apple-app-site-association
        

    Если приложение подключено, файл apple-app-site-association содержит ссылку на префикс идентификатора приложения и идентификатор пакета. Пример:

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

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

Добавление Firebase в приложение

  1. Импортируйте модуль 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;
    // ...
          
  2. Настройте общий экземпляр 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];
  3. Если вы используете 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()
          }
        }
      }
    }
          

Используйте консоль Firebase

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

Как использовать iOS Builder API

Вы можете использовать iOS Builder API, чтобы создавать Dynamic Links на основе параметров или сокращать длинные Dynamic Link.

Чтобы создать Dynamic Link, создайте новый объект DynamicLinkComponents и укажите параметры Dynamic Link, задав соответствующие свойства объекта. Затем получите длинную ссылку из свойства url объекта или короткую ссылку, вызвав shorten().

В следующем примере создается длинная ссылка Dynamic Link на https://www.example.com/my-page, которая открывается в вашем приложении для iOS и в приложении com.example.android для Android:

Swift

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
guard let link = URL(string: "https://www.example.com/my-page") else { return }
let dynamicLinksDomainURIPrefix = "https://example.com/link"
let linkBuilder = DynamicLinkComponents(link: link, domainURIPrefix: dynamicLinksDomainURIPRefix)
linkBuilder.iOSParameters = DynamicLinkIOSParameters(bundleID: "com.example.ios")
linkBuilder.androidParameters = DynamicLinkAndroidParameters(packageName: "com.example.android")

guard let longDynamicLink = linkBuilder.url else { return }
print("The long URL is: \(longDynamicLink)")

Objective-C

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
NSURL *link = [[NSURL alloc] initWithString:@"https://www.example.com/my-page"];
NSString *dynamicLinksDomainURIPrefix = @"https://example.com/link";
FIRDynamicLinkComponents *linkBuilder = [[FIRDynamicLinkComponents alloc]
                                         initWithLink:link
                                               domainURIPrefix:dynamicLinksDomainURIPrefix];
linkBuilder.iOSParameters = [[FIRDynamicLinkIOSParameters alloc]
                             initWithBundleID:@"com.example.ios"];
linkBuilder.androidParameters = [[FIRDynamicLinkAndroidParameters alloc]
                                 initWithPackageName:@"com.example.android"];

NSLog(@"The long URL is: %@", linkBuilder.url);

Чтобы создать короткую ссылку Dynamic Link, создайте DynamicLinkComponents таким же образом, а затем вызовите shorten().

Для создания короткой ссылки требуется сетевой вызов, поэтому вместо прямого возврата ссылки shorten() принимает обработчик завершения, который вызывается по завершении запроса. Пример:

Swift

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
linkBuilder.shorten() { url, warnings, error in
  guard let url = url, error != nil else { return }
  print("The short URL is: \(url)")
}

Objective-C

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
[linkBuilder shortenWithCompletion:^(NSURL * _Nullable shortURL,
                                     NSArray<NSString *> * _Nullable warnings,
                                     NSError * _Nullable error) {
  if (error || shortURL == nil) { return; }
  NSLog(@"The short URL is: %@", shortURL);
}];
      

По умолчанию короткие Dynamic Links генерируются с суффиксами из 17 символов, поэтому угадать действительную Dynamic Link практически невозможно. Если в вашем случае нет ничего страшного в том, что кто-то угадает короткую ссылку, вы можете генерировать суффиксы, длина которых достаточна только для обеспечения уникальности. Для этого задайте свойство dynamicLinkComponentsOptions:

Swift

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
linkBuilder.options = DynamicLinkComponentsOptions()
linkBuilder.options.pathLength = .short
linkBuilder.shorten() { url, warnings, error in
  guard let url = url, error != nil else { return }
  print("The short URL is: \(url)")
}

Objective-C

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
linkBuilder.dynamicLinkComponentsOptions = [[FIRDynamicLinkComponentsOptions alloc] init];
linkBuilder.dynamicLinkComponentsOptions.pathLength = FIRShortDynamicLinkPathLengthShort;
[linkBuilder shortenWithCompletion:^(NSURL * _Nullable shortURL,
                                     NSArray<NSString *> * _Nullable warnings,
                                     NSError * _Nullable error) {
  if (error || shortURL == nil) { return; }
  NSLog(@"The short URL is: %@", shortURL);
}];
      

Вы можете использовать Dynamic Link Builder API, чтобы создавать Dynamic Links с любыми поддерживаемыми параметрами. Подробная информация приведена в документации по API.

В следующем примере создается объект Dynamic Link с несколькими общими параметрами:

Swift

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
guard let link = URL(string: "https://www.example.com/my-page") else { return }
let dynamicLinksDomainURIPrefix = "https://example.com/link"
let linkBuilder = DynamicLinkComponents(link: link, domainURIPRefix: dynamicLinksDomainURIPrefix)

linkBuilder.iOSParameters = DynamicLinkIOSParameters(bundleID: "com.example.ios")
linkBuilder.iOSParameters.appStoreID = "123456789"
linkBuilder.iOSParameters.minimumAppVersion = "1.2.3"

linkBuilder.androidParameters = DynamicLinkAndroidParameters(packageName: "com.example.android")
linkBuilder.androidParameters.minimumVersion = 123

linkBuilder.analyticsParameters = DynamicLinkGoogleAnalyticsParameters(source: "orkut",
                                                                       medium: "social",
                                                                       campaign: "example-promo")

linkBuilder.iTunesConnectParameters = DynamicLinkItunesConnectAnalyticsParameters()
linkBuilder.iTunesConnectParameters.providerToken = "123456"
linkBuilder.iTunesConnectParameters.campaignToken = "example-promo"

linkBuilder.socialMetaTagParameters = DynamicLinkSocialMetaTagParameters()
linkBuilder.socialMetaTagParameters.title = "Example of a Dynamic Link"
linkBuilder.socialMetaTagParameters.descriptionText = "This link works whether the app is installed or not!"
linkBuilder.socialMetaTagParameters.imageURL = "https://www.example.com/my-image.jpg"

guard let longDynamicLink = linkBuilder.url else { return }
print("The long URL is: \(longDynamicLink)")

Objective-C

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
NSURL *link = [[NSURL alloc] initWithString:@"https://www.example.com/my-page"];
NSString *dynamicLinksDomainURIPrefix = @"https://example.com/link";
FIRDynamicLinkComponents *linkBuilder = [[FIRDynamicLinkComponents alloc]
                                         initWithLink:link
                                         domainURIPrefix:dynamicLinksDomainURIPrefix];

linkBuilder.iOSParameters = [[FIRDynamicLinkIOSParameters alloc]
                             initWithBundleID:@"com.example.ios"];
linkBuilder.iOSParameters.appStoreID = @"123456789";
linkBuilder.iOSParameters.minimumAppVersion = @"1.2.3";

linkBuilder.androidParameters = [[FIRDynamicLinkAndroidParameters alloc]
                                 initWithPackageName:@"com.example.android"];
linkBuilder.androidParameters.minimumVersion = 123;

linkBuilder.analyticsParameters = [[FIRDynamicLinkGoogleAnalyticsParameters alloc]
                                   initWithSource:@"orkut"
                                           medium:@"social"
                                         campaign:@"example-promo"];

linkBuilder.iTunesConnectParameters = [[FIRDynamicLinkItunesConnectAnalyticsParameters alloc] init];
linkBuilder.iTunesConnectParameters.providerToken = @"123456";
linkBuilder.iTunesConnectParameters.campaignToken = @"example-promo";

linkBuilder.socialMetaTagParameters = [[FIRDynamicLinkSocialMetaTagParameters alloc] init];
linkBuilder.socialMetaTagParameters.title = @"Example of a Dynamic Link";
linkBuilder.socialMetaTagParameters.descriptionText = @"This link works whether the app is installed or not!";
linkBuilder.socialMetaTagParameters.imageURL = @"https://www.example.com/my-image.jpg";

NSLog(@"The long URL is: %@", linkBuilder.url);

Вы можете задать параметры Dynamic Link с помощью следующих объектов и свойств:

DynamicLinkComponents
ссылка

Ссылка, которая будет открываться в приложении. Укажите URL, который может обрабатывать ваше приложение (обычно это контент или полезная нагрузка приложения), чтобы инициировать логику приложения (например, предоставить пользователю купон или показать экран приветствия). Ссылка должна быть правильно отформатированным URL, закодированным надлежащим образом, использовать протокол HTTP или HTTPS и не быть другой динамической ссылкой.

domainURIPrefix Префикс URL Dynamic Link, который можно найти в консоли Firebase. Примеры доменов Dynamic Link:
https://example.com/link
https://example.page.link
DynamicLinkAndroidParameters
fallbackURL Ссылка, которая открывается, если приложение не установлено. Укажите это значение, если хотите, чтобы при отсутствии приложения выполнялось другое действие, например открывалась мобильная версия сайта или рекламная страница приложения.
minimumVersion versionCode минимальной версии приложения, в которой можно открыть ссылку. Если на устройстве установлена более ранняя версия приложения, пользователь будет перенаправлен в Google Play, чтобы обновить его.
DynamicLinkIOSParameters
appStoreID Идентификатор приложения в App Store, который используется для перенаправления пользователей в App Store, если приложение не установлено.
fallbackURL Ссылка, которая открывается, если приложение не установлено. Укажите это значение, чтобы при отсутствии приложения выполнялось другое действие, например открывалась мобильная версия контента или рекламная страница приложения.
customScheme Специальная схема URL вашего приложения, если она отличается от идентификатора пакета приложения.
iPadFallbackURL Ссылка, которая будет открываться на iPad, если приложение не установлено. Укажите этот параметр, чтобы при отсутствии приложения, установленного из магазина приложений, выполнялось другое действие, например открывалась веб-версия контента или рекламная страница приложения.
iPadBundleID Идентификатор пакета приложения для iOS, которое будет использоваться на устройствах iPad для открытия ссылки. Приложение должно быть подключено к вашему проекту на обзорной странице в консоли Firebase.
minimumAppVersion Номер минимальной версии приложения, которая может открыть ссылку. Этот флаг передается в приложение при его открытии, и приложение должно решить, что с ним делать.
DynamicLinkNavigationInfoParameters
forcedRedirectEnabled Если задано значение 1, то при открытии Dynamic Link страница предварительного просмотра приложения будет пропущена и пользователь будет перенаправлен в приложение или магазин. Страница предварительного просмотра приложения (включена по умолчанию) позволяет более надежно направлять пользователей в наиболее подходящее место назначения, когда они открывают Dynamic Links в приложениях. Однако если вы ожидаете, что Dynamic Link будет открываться только в приложениях, которые могут надежно открывать Dynamic Links без этой страницы, вы можете отключить ее с помощью этого параметра. Этот параметр влияет на поведение Dynamic Link только на устройствах iOS.
DynamicLinkSocialMetaTagParameters
название Заголовок, который будет использоваться, когда Dynamic Link будет опубликован в сообщении в социальной сети.
descriptionText Описание, которое будет использоваться, когда Dynamic Link будет опубликовано в сообщении в социальной сети.
imageURL URL изображения, связанного с этой ссылкой. Размер изображения должен быть не менее 300 x 200 пикселей, а размер файла – не более 300 КБ.
DynamicLinkGoogleAnalyticsParameters
source
medium
campaign
term
content
Параметры аналитики Google Play. Эти параметры (utm_source, utm_medium, utm_campaign, utm_term, utm_content) передаются в Google Play и добавляются в полезную нагрузку ссылки.
DynamicLinkItunesConnectAnalyticsParameters
providerToken
affiliateToken
campaignToken
Параметры аналитики iTunes Connect. Эти параметры (pt, at, ct) передаются в магазин приложений.

Чтобы сократить длинную Dynamic Link, передайте ееDynamic Link в shortenURL(url:options:) вместе с объектом DynamicLinkComponentsOptions, если вы хотите создать ссылку с коротким суффиксом:

Swift

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
DynamicLinkComponents.shortenURL(url: longLinkUrl, options: nil) { url, warnings, error in
  guard let url = url, error != nil else { return }
  print("The short URL is: \(url)")
}

Objective-C

Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
[FIRDynamicLinkComponents shortenURL:longLinkUrl
                             options:nil
                          completion:^(NSURL * _Nullable shortURL,
                                       NSArray<NSString *> * _Nullable warnings,
                                       NSError * _Nullable error) {
  if (error || shortURL == nil) { return; }
  NSLog(@"The short URL is: %@", shortURL);
}];

По умолчанию Dynamic Links использует идентификатор пакета приложения в качестве схемы URL, необходимой для открытия приложения. Рекомендуем оставить значение по умолчанию, чтобы упростить реализацию.

Однако разработчики, которые уже используют специальную схему URL для других целей, могут захотеть использовать ее и для Dynamic Links. В этом случае вы можете указать другую схему URL для Firebase Dynamic Links, выполнив следующие действия:

  1. При настройке приложения укажите схему URL по умолчанию, которая будет использоваться приложением, прежде чем настраивать общий экземпляр FirebaseApp:

    Swift

    Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication
                       .LaunchOptionsKey: Any]?) -> Bool {
      // Set deepLinkURLScheme to the custom URL scheme you defined in your
      // Xcode project.
      FirebaseOptions.defaultOptions()?.deepLinkURLScheme = customURLScheme
      FirebaseApp.configure()
    
      return true
    }

    Objective-C

    Примечание. Этот продукт Firebase недоступен для macOS, Mac Catalyst, tvOS и watchOS.
    - (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      // Set deepLinkURLScheme to the custom URL scheme you defined in your
      // Xcode project.
      [FIROptions defaultOptions].deepLinkURLScheme = CUSTOM_URL_SCHEME;
      [FIRApp configure];
    
      return YES;
    }
  2. При создании Dynamic Link необходимо указать специальную схему URL, которая используется в вашем приложении. Это можно сделать в консоли Firebase, задав customScheme в Builder API, указав параметр ius в URL или отправив параметр iosCustomScheme в REST API.

Дальнейшие действия

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

Чтобы получать Dynamic Links в приложении, ознакомьтесь с документацией для iOS, Android, C++ и Unity.