如何在 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.key
、example.com.pem
和 intermediate.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/
注:
- 通常,在 Safari 中或在 UIWebView/WKWebView 实例中单击任何受支持的 link 都应该打开该应用程序。
- 对于 iOS 9.2 及更低版本,这仅适用于设备。 iOS 9.3(撰写本文时仍处于测试阶段)也支持模拟器。
- iOS 记住用户打开通用链接时的选择。如果他们点击右上角的面包屑以在 Safari 中打开 link,则所有进一步的点击都会将他们带到 Safari,而不是应用程序。通过在网站上的应用横幅中选择“打开”,他们可以切换回默认打开应用。
完成。一切都与通用链接有关。
参考资料
如果您完成了 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
}
我如何在我的 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.key
、example.com.pem
和 intermediate.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/
注:
- 通常,在 Safari 中或在 UIWebView/WKWebView 实例中单击任何受支持的 link 都应该打开该应用程序。
- 对于 iOS 9.2 及更低版本,这仅适用于设备。 iOS 9.3(撰写本文时仍处于测试阶段)也支持模拟器。
- iOS 记住用户打开通用链接时的选择。如果他们点击右上角的面包屑以在 Safari 中打开 link,则所有进一步的点击都会将他们带到 Safari,而不是应用程序。通过在网站上的应用横幅中选择“打开”,他们可以切换回默认打开应用。
完成。一切都与通用链接有关。
参考资料
如果您完成了 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
}