如何在 iOS 应用程序中支持通用链接并为其设置服务器?

How to support Universal Links in iOS App and setup server for it?

我如何在我的 iOS 应用程序中支持 Universal Links 并设置我的服务器以支持通用链接?

支持通用链接

当您支持通用 links 时,iOS 9 位用户可以点击 link 访问您的网站并无缝重定向到您安装的应用程序,而无需通过 Safari。如果您的应用程序未安装,点击 link 您的网站将在 Safari 中打开您的网站。

在这里,如何设置您自己的服务器,并在您的应用程序中处理相应的 link。


设置服务器

您需要有一个服务器运行在线。为了安全地将您的 iOS 应用程序与服务器相关联,Apple 要求您提供一个名为 apple-app-site-association 的配置文件。这是一个 JSON 文件,它描述了域和支持的路由。

apple-app-site-association 文件需要通过 HTTPS 访问,无需任何重定向,位于 https://{domain}/apple-app-site-association

文件如下所示:

{
"applinks": {
    "apps": [ ],
    "details": [
        {
            "appID": "{app_prefix}.{app_identifier}",
            "paths": [ "/path/to/content", "/path/to/other/*", "NOT /path/to/exclude" ]
        },
        {
            "appID": "TeamID.BundleID2",
            "paths": [ "*" ]
        }
    ]
}
}

注意 - 不要将 .json 附加到 apple-app-site-association 文件名。

按键如下:
apps:应该有一个空数组作为它的值,而且它必须存在。这就是Apple想要的。
details:是一个字典数组,每个iOS个网站支持的应用一个。每个字典都包含有关应用程序、团队和捆绑包 ID 的信息。

定义路径有3种方式:
Static:整个支持的路径被硬编码以标识特定的 link,例如/static/terms
Wildcards: * 可用于匹配动态路径,例如/books/* 可以匹配任何作者页面的路径。 ?在特定路径组件内,例如books/1?可用于匹配任何 ID 以 1 开头的图书。
Exclusions:在路径前加上 NOT 会排除该路径被匹配。

数组中提及路径的顺序很重要。较早的索引具有较高的优先级。一旦路径匹配,评估就会停止,其他路径将被忽略。每个路径都区分大小写。

支持多域

应用程序支持的每个域都需要提供自己的 apple-app-site-association 文件。如果每个域提供的内容不同,那么文件的内容也会改变以支持各自的路径。否则,可以使用相同的文件,但需要在每个支持的域中都可以访问它。

签署 App-Site-Association 文件

注意如果您的服务器使用HTTPS提供内容,您可以跳过这部分并跳转到应用程序设置指南。

如果您的应用以 iOS9 为目标并且您的服务器使用 HTTPS 来提供内容,则您不需要签署该文件。如果不是(例如,在 iOS 8 上支持 Handoff 时),则必须使用来自公认的证书颁发机构的 SSL 证书对其进行签名。

注意:这不是Apple提供的用于将您的应用程序提交到App Store的证书。它应该由第三方提供,建议使用与 HTTPS 服务器相同的证书(尽管不是必需的)。

要签署文件,请先创建并保存一个简单的 .txt 版本。接下来,在终端中,运行 以下命令:

cat <unsigned_file>.txt | openssl smime -sign -inkey example.com.key -signer example.com.pem -certfile intermediate.pem -noattr -nodetach -outform DER > apple-app-site-association

这将输出当前目录中的签名文件。 example.com.keyexample.com.pemintermediate.pem 是您的认证机构提供给您的文件。

注意:如果文件未签名,它的 Content-Type 应该是 application/json。否则,应该是application/pkcs7-mime.

使用 Apple App 搜索验证工具验证您的服务器
为 iOS 9 个搜索 API 测试您的网页。输入 URL,Applebot 将抓取您的网页并展示如何优化以获得最佳结果 https://search.developer.apple.com/appsearch-validation-tool/

网站代码

网站代码可以在gh-pages分支上找到 https://github.com/vineetchoudhary/iOS-Universal-Links/tree/gh-pages


设置iOS应用程序

应用程序将以 iOS 9 为目标,并将使用 Xcode 7.2 和 Objective-C

启用通用链接

应用程序端的设置需要两件事:
1.配置app权限,开启通用links.
2. 处理 AppDelegate.

中的传入链接

1.配置应用程序的授权,并启用通用 links.
配置应用程序权利的第一步是为您的 App ID 启用它。在 Apple Developer Member Center 中执行此操作。单击证书、标识符和配置文件,然后单击标识符。 Select 您的 App ID(如果需要,请先创建),单击“编辑”并启用关联域授权。

接下来,点击相应的App ID获取App ID前缀和后缀。

App ID 前缀和后缀应与 apple-app-site-association 文件中的匹配。

接下来在 Xcode、select 您的应用程序目标中,单击功能并将关联域切换为开。为您的应用支持的每个域添加一个条目,前缀为 applinks:.

例如:applinks:vineetchoudhary.github.io

示例应用程序如下所示:

注意:确保您select加入了同一个团队,并输入了与会员中心注册的App ID相同的Bundle ID。还要通过 selecting 文件确保权利文件被 Xcode 包含,并确保在文件检查器中检查您的目标。

在您的 AppDelegate 中处理传入链接

[UIApplicationDelegate application: continueUserActivity: restorationHandler:] AppDelegate.m 中的方法处理传入的 links。您解析此 URL 以确定应用程序中的正确操作。

例如,在示例应用中:

Objective-C

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
    if ([userActivity.activityType isEqualToString: NSUserActivityTypeBrowsingWeb]) {
        NSURL *url = userActivity.webpageURL;
        UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UINavigationController *navigationController = (UINavigationController *)_window.rootViewController;
        if ([url.pathComponents containsObject:@"home"]) {
            [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"HomeScreenId"] animated:YES];
        }else if ([url.pathComponents containsObject:@"about"]){
            [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"AboutScreenId"] animated:YES];
        }
    }
    return YES;
}  

Swift :

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
          let url = userActivity.webpageURL!
          //handle url
      }
      return true
  }

iOS 申请代码

应用代码可以在master分支找到 https://github.com/vineetchoudhary/iOS-Universal-Links/

注:

  1. 通常,在 Safari 中或在 UIWebView/WKWebView 实例中单击任何受支持的 link 都应该打开该应用程序。
  2. 对于 iOS 9.2 及更低版本,这仅适用于设备。 iOS 9.3(撰写本文时仍处于测试阶段)也支持模拟器。
  3. iOS 记住用户打开通用链接时的选择。如果他们点击右上角的面包屑以在 Safari 中打开 link,则所有进一步的点击都会将他们带到 Safari,而不是应用程序。通过在网站上的应用横幅中选择“打开”,他们可以切换回默认打开应用。

完成。一切都与通用链接有关。


参考资料

  1. Support Universal Links in your iOS App

如果您完成了 Vineet 的所有 post 但它仍然不起作用,请尝试使用分发配置文件。我做了上面 post 中的所有操作,但必须发布分发配置文件才能使其正常工作。

使用开发配置文件,应用程序成功下载了 AASA 文件,但是当我按下链接时它从未打开我的应用程序。

希望对您有所帮助。

这是 Swift 3+ 中处理通用链接的代码,基于 :

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let url = userActivity.webpageURL {
        //handle URL
    }

    return true
}