创建动态链接 (iOS)

要创建 Firebase 动态链接,请在应用中添加 Dynamic Links SDK,并使用 FIRDynamicLinkComponents.url 参数。

前提条件

Firebase 动态链接要求使用 iOS 8 或更新版本的系统。您可以在应用中将 iOS 7 定为目标,但 Firebase Dynamic Links SDK 调用只对 iOS 8 或更高版本系统上运行的应用起作用。

设置 Firebase 和 Dynamic Links SDK

  1. 将 Firebase 添加到您的 iOS 项目。在您的 Podfile 中添加以下 Pod:
        pod 'Firebase/Core'
    pod 'Firebase/DynamicLinks'
        
  2. 运行 pod install 并打开已创建的 .xcworkspace 文件。
  3. Firebase 控制台中,打开 Dynamic Links(动态链接)部分。
    1. 如有提示,请接受服务条款。
    2. 记下项目的动态链接网域,它显示在“动态链接”页的顶部。您需要项目的动态链接网域才能以编程方式创建动态链接。动态链接网域的格式为:app_code.app.goo.gl

  4. 确保已在您的应用的设置中指定应用的 App Store ID 和应用 ID 前缀。要查看和修改应用的设置,请转到 Firebase 项目的“设置”页面,然后选择您的 iOS 应用。

    请打开以下网址,以确认您的 Firebase 项目已正确配置为在 iOS 应用中使用动态链接:

    https://app_code.app.goo.gl/apple-app-site-association

    如果您的应用已关联,则 apple-app-site-association 文件中包含对应用的 App Store ID 和软件包 ID 的引用。例如:

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

    如果 details 字段为空,请仔细检查您是否指定了您的应用 ID 前缀。请注意,应用 ID 前缀可能与团队 ID 不同。

将 Firebase 添加至您的应用

  1. UIApplicationDelegate 中导入 Firebase 模块:

    Swift

    import Firebase
    

    Objective-C

    @import Firebase;
    
  2. 配置一个 FirebaseApp 共享实例(通常在应用的 application:didFinishLaunchingWithOptions: 方法中配置):

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    

使用 Firebase 控制台

如果您想生成一个动态链接(无论是出于测试目的,还是为了让您的营销团队轻松创建可以在社交媒体帖子等地方使用的链接),最简单的方法就是访问 Firebase 控制台并按照分步说明手动创建一个。

使用 iOS Builder API

您可以使用 Firebase Dynamic Links iOS Builder API 创建短动态链接或长动态链接。此 API 接受一个长动态链接或一个包含动态链接参数的对象,并返回一个如下所示的网址:

https://abc123.app.goo.gl/WXYZ

利用参数创建长链接

您可以通过设置以下参数并获取 FIRDynamicLinkComponents.url 参数,以编程方式创建动态链接。

Swift

// general link params
guard let linkString = dictionary[.link]?.text else {
  print("Link can not be empty!")
  return
}

guard let link = URL(string: linkString) else { return }
let components = DynamicLinkComponents(link: link, domain: ViewController.DYNAMIC_LINK_DOMAIN)

// analytics params
let analyticsParams = DynamicLinkGoogleAnalyticsParameters(
    source: dictionary[.source]?.text ?? "", medium: dictionary[.medium]?.text ?? "",
    campaign: dictionary[.campaign]?.text ?? "")
analyticsParams.term = dictionary[.term]?.text
analyticsParams.content = dictionary[.content]?.text
components.analyticsParameters = analyticsParams

if let bundleID = dictionary[.bundleID]?.text {
  // iOS params
  let iOSParams = DynamicLinkIOSParameters(bundleID: bundleID)
  iOSParams.fallbackURL = dictionary[.fallbackURL]?.text.flatMap(URL.init)
  iOSParams.minimumAppVersion = dictionary[.minimumAppVersion]?.text
  iOSParams.customScheme = dictionary[.customScheme]?.text
  iOSParams.iPadBundleID = dictionary[.iPadBundleID]?.text
  iOSParams.iPadFallbackURL = dictionary[.iPadFallbackURL]?.text.flatMap(URL.init)
  iOSParams.appStoreID = dictionary[.appStoreID]?.text
  components.iOSParameters = iOSParams

  // iTunesConnect params
  let appStoreParams = DynamicLinkItunesConnectAnalyticsParameters()
  appStoreParams.affiliateToken = dictionary[.affiliateToken]?.text
  appStoreParams.campaignToken = dictionary[.campaignToken]?.text
  appStoreParams.providerToken = dictionary[.providerToken]?.text
  components.iTunesConnectParameters = appStoreParams
}

if let packageName = dictionary[.packageName]?.text {
  // Android params
  let androidParams = DynamicLinkAndroidParameters(packageName: packageName)
  androidParams.fallbackURL = dictionary[.androidFallbackURL]?.text.flatMap(URL.init)
  androidParams.minimumVersion = dictionary[.minimumVersion]?.text.flatMap {Int($0)} ?? 0
  components.androidParameters = androidParams
}

// social tag params
let socialParams = DynamicLinkSocialMetaTagParameters()
socialParams.title = dictionary[.title]?.text
socialParams.descriptionText = dictionary[.descriptionText]?.text
socialParams.imageURL = dictionary[.imageURL]?.text.flatMap(URL.init)
components.socialMetaTagParameters = socialParams

// OtherPlatform params
let otherPlatformParams = DynamicLinkOtherPlatformParameters()
otherPlatformParams.fallbackUrl = dictionary[.otherFallbackURL]?.text.flatMap(URL.init)
components.otherPlatformParameters = otherPlatformParams

longLink = components.url
print(longLink?.absoluteString ?? "")

Objective-C

// general link params
if (_dictionary[Link].text == nil) {
  NSLog(@"%@", @"Link can not be empty!");
  return;
}

NSURL *link = [NSURL URLWithString:_dictionary[Link].text];
FIRDynamicLinkComponents *components =
[FIRDynamicLinkComponents componentsWithLink:link
                                      domain:DYNAMIC_LINK_DOMAIN];

// analytics params
FIRDynamicLinkGoogleAnalyticsParameters *analyticsParams =
[FIRDynamicLinkGoogleAnalyticsParameters parametersWithSource:_dictionary[Source].text
                                                       medium:_dictionary[Medium].text
                                                     campaign:_dictionary[Campaign].text];
analyticsParams.term = _dictionary[Term].text;
analyticsParams.content = _dictionary[Content].text;
components.analyticsParameters = analyticsParams;

if (_dictionary[BundleID].text) {
  // iOS params
  FIRDynamicLinkIOSParameters *iOSParams = [FIRDynamicLinkIOSParameters parametersWithBundleID:_dictionary[BundleID].text];
  iOSParams.fallbackURL = [NSURL URLWithString:_dictionary[FallbackURL].text];
  iOSParams.minimumAppVersion = _dictionary[MinimumAppVersion].text;
  iOSParams.customScheme = _dictionary[CustomScheme].text;
  iOSParams.iPadBundleID = _dictionary[IPadBundleID].text;
  iOSParams.iPadFallbackURL = [NSURL URLWithString:_dictionary[IPadFallbackURL].text];
  iOSParams.appStoreID = _dictionary[AppStoreID].text;
  components.iOSParameters = iOSParams;

  // iTunesConnect params
  FIRDynamicLinkItunesConnectAnalyticsParameters *appStoreParams = [FIRDynamicLinkItunesConnectAnalyticsParameters parameters];
  appStoreParams.affiliateToken = _dictionary[AffiliateToken].text;
  appStoreParams.campaignToken = _dictionary[CampaignToken].text;
  appStoreParams.providerToken = _dictionary[ProviderToken].text;
  components.iTunesConnectParameters = appStoreParams;
}

if (_dictionary[PackageName].text) {
  // Android params
  FIRDynamicLinkAndroidParameters *androidParams = [FIRDynamicLinkAndroidParameters parametersWithPackageName: _dictionary[PackageName].text];
  androidParams.fallbackURL = [NSURL URLWithString:_dictionary[FallbackURL].text];
  androidParams.minimumVersion = (_dictionary[MinimumVersion].text).integerValue;
  components.androidParameters = androidParams;
}

// social tag params
FIRDynamicLinkSocialMetaTagParameters *socialParams = [FIRDynamicLinkSocialMetaTagParameters parameters];
socialParams.title = _dictionary[Title].text;
socialParams.descriptionText = _dictionary[DescriptionText].text;
socialParams.imageURL = [NSURL URLWithString:_dictionary[ImageURL].text];
components.socialMetaTagParameters = socialParams;

// OtherPlatform params
FIRDynamicLinkOtherPlatformParameters *otherPlatformParams =
[FIRDynamicLinkOtherPlatformParameters parameters];
otherPlatformParams.fallbackUrl = [NSURL URLWithString:_dictionary[OtherFallbackURL].text];
components.otherPlatformParameters = otherPlatformParams;

_longLink = components.url;
NSLog(@"Long URL: %@", _longLink.absoluteString);

设置短动态链接的长度

您还可以设置 pathLength 参数来指定如何生成短动态链接的路径部分。

Swift

let options = DynamicLinkComponentsOptions()
options.pathLength = .unguessable
components.options = options

Objective-C

FIRDynamicLinkComponentsOptions *options = [FIRDynamicLinkComponentsOptions options];
options.pathLength = FIRShortDynamicLinkPathLengthUnguessable;
components.options = options;

默认情况下,或在您将该参数设为 "UNGUESSABLE" 的情况下,路径部分将是一个包含 17 个字符的字符串,如下面的示例中所示:

https://abc123.app.goo.gl/UVWXYZuvwxyz12345

此类字符串由 base62 编码随机生成的 96 位数字创建。使用此设置可避免您的动态链接网址被猜到和抓取(这可能导致敏感信息暴露给原定接收者之外的人)。

如果您将该参数设为 "SHORT",那么路径部分将在保证独一无二的情况下尽可能简短,但不得短于 4 个字符。

https://abc123.app.goo.gl/WXYZ

如果短动态链接网址即使被猜到也不会暴露敏感信息,请使用此方法。

利用长链接创建短链接

您可以使用 Firebase Dynamic Links API 缩短长动态链接。为此,可调用:

Swift

components.shorten { (shortURL, warnings, error) in
  // Handle shortURL.
  if let error = error {
    print(error.localizedDescription)
    return
  }
  print(shortURL?.absoluteString ?? "")
  // ...
}

Objective-C

[components shortenWithCompletion:^(NSURL *_Nullable shortURL,
                                    NSArray *_Nullable warnings,
                                    NSError *_Nullable error) {
  // Handle shortURL or error.
  if (error) {
    NSLog(@"Error generating short link: %@", error.description);
    return;
  }
  NSLog(@"Short URL: %@", shortURL.absoluteString);
  // ...
}];

为动态链接指定自定义网址架构

默认情况下,动态链接使用您的应用的软件包标识符作为打开该应用所需的网址架构。我们建议您保留此默认值,以确保实现方式简单明了。

但是,如果开发者已出于其他原因使用自定义网址架构,则可能希望为其动态链接使用相同的自定义网址架构。如果您属于这种情况,则可以按照以下步骤为您的 Firebase 动态链接指定不同的网址架构:

  1. 设置您的应用时,请确保在配置 FirebaseApp 共享实例之前指定该应用将使用的默认网址架构:

    Swift

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
      // Set deepLinkURLScheme to the custom URL scheme you defined in your
      // Xcode project.
      FirebaseOptions.defaultOptions()?.deepLinkURLScheme = self.customURLScheme
      FirebaseApp.configure()
    
      return true
    }

    Objective-C

    - (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. 每当创建动态链接时,您都需要指定您的应用使用的自定义网址架构。您可以通过 Firebase 控制台执行此操作,并在 Builder API 中设置 customScheme,在网址中指定 ius 参数,或者将 iosCustomScheme 参数发送到 REST API。

后续步骤

现在您已创建动态链接,此时您需要设置您的应用以接收动态链接,并在用户打开动态链接时将用户引至您的应用中的相应位置。

要在您的应用中接收动态链接,请参阅适用于 iOSAndroidC++Unity 的文档。

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面