我如何在我的Universal Links应用程序中支持iOS
并设置我的服务器以支持Universal Links?
当您支持通用链接时,iOS 9用户可以点击指向您网站的链接,无需通过Safari即可无缝地重定向到已安装的应用程序。如果您的应用未安装,点击指向您网站的链接即可在Safari中打开您的网站。
在这里,如何设置自己的服务器,并处理您的应用程序中的相应链接。
您需要让服务器在线运行。为了安全地将您的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的信息。
有三种方法可以定义路径:
Static
:整个支持的路径被硬编码以识别特定链接,例如/静态/条款
Wildcards
:A *可用于匹配动态路径,例如: / books / *可以匹配任何作者页面的路径。 ?特定路径组件内部,例如,书籍/ 1?可用于匹配ID以1开头的任何书籍。
Exclusions
:在NOT前面添加一条路径,排除该路径的匹配。
数组中提到路径的顺序很重要。早期指数具有更高的优先级。路径匹配后,评估将停止,其他路径将被忽略。每条路径都区分大小写。
应用程序支持的每个域都需要提供自己的apple-app-site-association文件。如果每个域提供的内容不同,则文件的内容也将更改以支持相应的路径。否则,可以使用相同的文件,但需要在每个支持的域中访问它。
注意:如果服务器使用HTTPS
提供内容并跳转到“应用程序设置”指南,则可以跳过此部分。
如果您的应用针对iOS 9而您的服务器使用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.key
,example.com.pem
和intermediate.pem
是您的认证机构可以提供给您的文件。
注意:如果文件是无符号的,则应该有Content-Type
的application/json
。否则,它应该是application/pkcs7-mime
。
使用Apple App搜索验证工具验证您的服务器 测试您的网页是否有iOS 9搜索API。输入一个网址,Applebot将抓取您的网页,并展示如何优化以获得最佳效果https://search.developer.apple.com/appsearch-validation-tool/
网站代码可以在https://github.com/vineetchoudhary/iOS-Universal-Links/tree/gh-pages上找到gh-pages分支
应用程序将针对iOS 9,并将使用xcode 7.2和Objective-C
。
应用程序端的设置需要两件事:
1.配置应用程序的权利,并启用通用链接。
2.处理AppDelegate
中的传入链接。
1.配置应用程序的权利,并启用通用链接。 配置应用程序权利的第一步是为您的应用程序ID启用它。在Apple Developer Member Center中执行此操作。单击“证书”,“标识符和配置文件”,然后单击“标识符”。选择您的应用程序ID(如果需要,首先创建它),单击“编辑”并启用“关联域”权限。
接下来,通过单击相应的App ID获取App ID前缀和后缀。
App ID前缀和后缀应与apple-app-site-association文件中的前缀匹配。
接下来在Xcode
中,选择应用程序的目标,单击“功能”并将“关联域”切换为“打开”。为您的应用支持的每个域添加一个条目,前缀为applinks:。
例如:applinks:vineetchoudhary.github.io
对于示例应用程序,这看起来像这样:
注意:确保您已选择相同的团队并在成员中心输入与注册的App ID相同的Bundle ID。还要确保Xcode通过选择文件包含权利文件,并在文件检查器中确保选中目标。
[UIApplicationDelegate application: continueUserActivity: restorationHandler:]
中的AppDelegate.m
方法处理传入链接。您解析此URL以确定应用程序中的正确操作。
例如,在示例应用中:
-(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;
}
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
let url = userActivity.webpageURL!
//handle url
}
return true
}
应用程序代码可以在https://github.com/vineetchoudhary/iOS-Universal-Links/上找到master分支
如果您完成Vineet的所有帖子但仍然无效,请尝试使用分发配置文件。我从上面的帖子做了所有事情,但不得不发布分发配置文件以使其工作。
使用开发配置文件,应用程序成功下载了AASA文件,但在我按下链接时它从未打开我的应用程序。
希望能帮助到你。
以下是基于the answer by Vineet Choudhary在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
}