如何在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.key
, example.com.pem
和intermediate.pem
是您的authentication机构提供给您的文件。
注意 :如果文件没有签名,它应该有一个Content-Type
的application/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分支
设置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主分支
注意:
- 一般来说,任何支持链接在Safari中,或在UIWebView / WKWebView的实例中应该打开应用程序。
- 对于iOS 9.2或更低版本,这只适用于设备。 iOS 9.3(写作时还处于testing阶段)也支持模拟器。
- iOS在打开通用链接时会记住用户的select。 如果他们点击右上方的面包屑以在Safari中打开链接,所有进一步的点击将把他们带到Safari,而不是应用程序。 通过在网站上的应用横幅中select打开,他们可以切换回默认打开应用。
完成。 这些都是关于Universal Links的。
参考
- 在您的iOS应用程序中支持通用链接
如果您完成了Vineet的所有post,但仍然无效,请尝试使用分发configuration文件。 我做了上面这个post的所有内容,但是必须发布一个分发configuration文件才能使其正常工作。
随着开发configuration文件的应用程序成功下载的AASA文件,但它从来没有打开我的应用程序,当我按下链接。
希望能帮助到你。