iOS DeepLink 调研与实践
原文链接:iOS DeepLink调研与实践
什么是DeepLink
使用统一资源标识符(URI)链接到一个App中特定的位置,而不是简单地打开App。 用户未安装App的情况下,一样可以在用户安装App后重新还原用户之前预览的页面。常见的有以下2种实现方式。
URL Scheme (iOS8以上可用)
我们通常只能使用scheme。这种方式需要通过safari中唤醒APP,但是这种方式需要提前判断系统中是否安装了能够响应此scheme的app,并且这种方式在微信等中是被禁用了的。如果没有安装app则该链接变成了无效链接。
1. 如何支持 URL Scheme
设置info.plist
假如我URL Schemes
填写的是rrddl
,Identifier
填写的是 renrendai.com
。那么我就可以在safari地址栏中输入rrddl://renrendai.com
来打开我们的app。
2. 原理
iPhone在安装应用时可以检测到info.plist
文件中是否有CFBundleURLTypes
,如果存在则将相应的schemes
注册到系统中,如有其它app通过
1
2
UIApplication.shared.openURL(URL(string: "rrddl://renrendai.com")!)
复制代码
或者safari打开时,系统会查找已注册的Schemes来启动对应的app。
3. 如何限制url打开app
如果不想被其它应用无端调起可以在AppDelegate
中open url
方法中通过host和path等条件加以限制。
1
2
3
4
5
6
7
8
9
10
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let components = URLComponents(string: url.absoluteString)
let pathPool = ["dl", "h5", "tab"]
if pathPool.contains(components?.path ?? "") {
JumpManager.handel(url) //处理url跳转
return true
}
return false
}
复制代码
缺点
1.不能检测用户是否安装了app,对没有安装app的用户没有引导作用。
2.没有唯一的应用标识,无法保证用户不会安装注册相同URL方案的第三方app。
Universal Links
Universal Links就是一个通用链接,iOS9以上的用户,可以通过点击这个链接无缝的重定向到一个app应用,而不需要通过safari打开跳转。如果用户没有安装这个app,则会在safari中打开这个链接指向的网页。(现已被微信封禁)
一、Universal Link的基本运作流程
1 app第一次安装或者版本更新后第一次启动,app向工程里配置的域名发起Get请求拉取apple-app-association
这个Json文件。
2 app将apple-app-association
注册给系统。
3 由iPhone上的任意webView
发起跳转的url(在webKit做了处理),如果是apple-app-association
注册的通用链接则打开App,触发Universal Link delegate
;没命中,webView
继续跳转url。
二、如何让app支持Universal Links
1.创建一个名字叫做apple-app-site-association
,包含固定格式的json文件
1
2
3
4
5
6
7
8
9
10
11
12
{
"applinks": {
"apps": [],
"details": [
{
"appID": "teamID.bundleId",
"paths": ["/deaplink","/wwdc/news/","*"]
}
]
}
}
复制代码
注意:
appID
的格式为teamID.bundleId
形式。
apple-app-site-association
不能带后缀名
2. apple-app-site-association放置位置
1.文件配置完成之后,将其上传到你的服务器根目录或者.well-known
这个子目录下(iOS 9.3才可以)
2.确保使用https://yourdomain.com/apple-app-site-association
这个链接可以访问到,yourdomain.com
为你的服务器域名。
3. 在哪里获取TeamID?
4. paths规则
1.使用*
配置,则整个网站都可以使用。
2.使用特定的URL,例如/user/home
来指定某一个特殊的链接。
3.在特定URL后面添加*
,例如/user/*
, 来指定网站的某一部分。
4.除了使用*
来匹配任意字符,你也可以使用 ?
来匹配单个字符,你可以在路径当中结合这两个字符使用,例如 /user/*/201?
。
5. app IDs 配置
进去登录苹果开发者中心,在identifiers
下App IDs
打开Associated Domains
开关。
6. 项目配置
domains
可以添加多个,前缀必须为applinks:
,applinks:
后为你的服务器的域名。值得注意的是要想触发Universal Link拦截必须跨域,假如Universal Link配置的是 wx.renrendai.com
这个域名,并且对这个域名下比如/point /home /user
等urlPath
进行了识别,也就是说只有当你访问 https://wx.renrendai.com/point/xxx
才会触发Universal Link拦截,而正经的Url https//www.renrendai.com/point/xxx
是不会触发Universal Link的拦截。
7. 项目中需要做的处理
1
2
3
4
5
6
7
8
9
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if userActivity.activityType == "NSUserActivityTypeBrowsingWeb" {
let url = userActivity.webpageURL
JumpManager.handel(url) //处理url跳转
return true
}
return false
}
复制代码
三、验证Universal Links配置是否成功
- 快捷验证,在备忘录中输入
https://yourdomain.com/apple-app-site-association
长按这个链接,出现在XXXapp打开即为成功。(在信息里同理) - 使用 苹果官方验证验证文件是否能被苹果请求到。
短链服务器端的相关实现
参考资料
遇到问题:
-
官网说
apple-app-site-association
放置在服务器根目录或者.well-known
这个子目录下即可,在真机模拟是发现在iOS9.3-iOS12
请求的地址是在.well-known
下而非根目录下
广告时间
最后惯例,欢迎大家star我们的人人贷大前端团队博客,所有的文章还会同步更新到知乎专栏 和 掘金账号,我们每周都会分享几篇高质量的大前端技术文章。如果你喜欢这篇文章,希望能动动小手给个赞。