我该如何在我的应用程序中支持通用链接,以及如何设置我的服务器以支持通用链接?
当你支持通用链接时,iOS 9 用户可以点击指向你网站的链接,并且无缝重定向到已安装的应用程序,而不需要经过 Safari。如果用户没有安装该应用程序,则单击指向你网站的链接将在 Safari 中打开你的网站。
以下是如何设置自己的服务器,并处理应用程序中相应的链接。
你需要拥有一个在线运行的服务器。为了安全地将你的 iOS 应用程序与服务器关联起来,苹果要求你提供一个名为 apple-app-site-association
的配置文件。这是一个描述域和支持路由的 JSON
文件。
apple-app-site-association
文件需要通过 https://{domain}/apple-app-site-association 访问,不带任何重定向,并使用 HTTPS
协议。
文件内容如下:
{
"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 的信息。
有三种定义路径的方式:
静态
: 支持的整个路径已硬编码以标识特定链接,例如 /static/terms
通配符
: 可使用 * 匹配动态路径,例如 /books/* 可匹配到任何作者页面的路径组合,? 在特定路径组件内使用,例如 books/1? 可用于匹配以 1 开头的任何书籍的 ID。
排除
: 在路径前面添加 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。
使用苹果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 9,并将使用Xcode 7.2与Objective-C。
在应用程序端进行设置需要两件事:
1.配置应用程序的权限,并启用通用链接。
2.处理您的AppDelegate中的传入链接。
1.配置应用程序的权限,并启用通用链接。
配置应用程序权限的第一步是为您的App ID启用它。在Apple开发人员成员中心完成此操作。单击证书,标识符和资料文件,然后选择标识符。选择您的App ID(如果需要,请先创建),单击编辑并启用相关域权限。
接下来,通过单击相应的App ID获取App ID前缀和后缀。
App ID前缀和后缀应与苹果应用程序网站关联文件中的前缀和后缀匹配。
接下来,在Xcode中选择您的应用程序目标,单击功能,将相关域切换为打开状态。为应用程序支持的每个域添加一个以applinks:为前缀的条目。
例如:applinks:vineetchoudhary.github.io
以下是示例应用程序的外观:
注意:确保您选择了与成员中心注册的应用程序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/的主分支中找到。
以下是基于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
}
applinks:
关键字。 - abhimuralidharanfunc application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool
- Aviv Ben Shabat