如何在iOS App中支持Universal Links并为其设置服务器?

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

支持通用链接

当您支持通用链接时,iOS 9用户可以点击指向您网站的链接,无需通过Safari即可无缝redirect到已安装的应用程序。 如果您的应用程序没有安装,点击链接到您的网站打开您的网站在Safari。

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


安装服务器

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

https:// {domain} / apple-app-site-association中 ,需要通过HTTPS访问apple-app-site-association文件,而不需要任何redirect。

该文件如下所示:

 { "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 :应该有一个空数组作为它的值,它必须存在。 这是苹果想要的。
details :是一个字典数组,每个iOS应用程序支持一个网站。 每个字典都包含有关应用程序,团队和软件包ID的信息。

有3种方法来定义path:
Static :整个受支持的path被硬编码以标识特定链接,例如/ static / terms
Wildcards :可以使用*来匹配dynamicpath,例如/ books / *可以匹配任何作者页面的path。 ? 在特定的path组件,例如书籍/ 1? 可用于匹配任何ID以1开头的图书。
Exclusions :在NOT前面加上一个path,就排除了匹配的path。

数组中提到path的顺序非常重要。 较早的指数具有较高的优先级。 一旦path匹配,评估停止,其他path被忽略。 每条path都区分大小写。

支持多个域

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

签署App-Site-Association文件

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

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

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

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

 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是您的authentication机构提供给您的文件。

注意 :如果文件没有签名,它应该有一个Content-Typeapplication/json 。 否则,应该是application/pkcs7-mime

使用Apple Appsearchvalidation工具validation您的服务器
testing您的网页的iOS 9searchAPI。 input一个URL,Applebot将抓取您的网页,并显示如何优化以获得最佳结果https://search.developer.apple.com/appsearch-validation-tool/

网站代码

网站代码可以在https://github.com/vineetchoudhary/iOS-Universal-Links/tree/gh-pages上findgh-pages分&#x652F;


设置iOS应用程序

应用程序将以iOS 9为目标,并将与Objective-C一起使用Xcode 7.2。

启用通用链接

应用程序端的设置需要两件事情:
1.configuration应用程序的权利,并启用通用链接。
2.处理AppDelegate传入链接。

1.configuration应用程序的权利,并启用通用链接。
configuration应用程序权利的第一步是为您的应用程序ID启用它。 在Apple Developer Member中心执行此操作。 点击证书,标识符和configuration文件,然后点击标识符。 select您的应用程序ID(如果需要,首先创build它),单击编辑并启用关联域权利。

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

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

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

例如:applinks:vineetchoudhary.github.io

这看起来像这样的示例应用程序:

注意 :确保您select了同一个团队,并input了与会员中心上注册的App ID相同的Bundle ID。 还要确保权利文件包含在Xcode中,方法是select文件,然后在文件检查器中确保检查目标。

处理AppDelegate中的传入链接

AppDelegate.m [UIApplicationDelegate application: continueUserActivity: restorationHandler:]方法处理传入链接。 您parsing此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应用程序代码

应用程序代码可以在https://github.com/vineetchoudhary/iOS-Universal-Links/find主分&#x652F;

注意:

  1. 一般来说,任何支持链接在Safari中,或在UIWebView / WKWebView的实例中应该打开应用程序。
  2. 对于iOS 9.2或更低版本,这只适用于设备。 iOS 9.3(写作时还处于testing阶段)也支持模拟器。
  3. iOS在打开通用链接时会记住用户的select。 如果他们点击右上方的面包屑以在Safari中打开链接,所有进一步的点击将把他们带到Safari,而不是应用程序。 通过在网站上的应用横幅中select打开,他们可以切换回默认打开应用。

完成。 这些都是关于Universal Links的。


参考

  1. 在您的iOS应用程序中支持通用链接

如果您完成了Vineet的所有post,但仍然无效,请尝试使用分发configuration文件。 我做了上面这个post的所有内容,但是必须发布一个分发configuration文件才能使其正常工作。

随着开发configuration文件的应用程序成功下载的AASA文件,但它从来没有打开我的应用程序,当我按下链接。

希望能帮助到你。