使用统一资源标识符(URI)连接到一个App中特定的位置,而不是简单地打开App。 用户未安装App的状况下,同样能够在用户安装App后从新还原用户以前预览的页面。常见的有如下2种实现方式。html
咱们一般只能使用scheme。这种方式须要经过safari中唤醒APP,可是这种方式须要提早判断系统中是否安装了可以响应此scheme的app,而且这种方式在微信等中是被禁用了的。若是没有安装app则该连接变成了无效连接。前端
设置info.plistgit
URL Schemes
填写的是
rrddl
,
Identifier
填写的是
renrendai.com
。那么我就能够在safari地址栏中输入
rrddl://renrendai.com
来打开咱们的app。
iPhone在安装应用时能够检测到info.plist
文件中是否有CFBundleURLTypes
,若是存在则将相应的schemes
注册到系统中,若有其它app经过github
UIApplication.shared.openURL(URL(string: "rrddl://renrendai.com")!)
复制代码
或者safari打开时,系统会查找已注册的Schemes来启动对应的app。web
若是不想被其它应用无故调起能够在AppDelegate
中open url
方法中经过host和path等条件加以限制。json
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的用户没有引导做用。api
2.没有惟一的应用标识,没法保证用户不会安装注册相同URL方案的第三方app。跨域
Universal Links就是一个通用连接,iOS9以上的用户,能够经过点击这个连接无缝的重定向到一个app应用,而不须要经过safari打开跳转。若是用户没有安装这个app,则会在safari中打开这个连接指向的网页。(现已被微信封禁)bash
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。
apple-app-site-association
,包含固定格式的json文件{
"applinks": {
"apps": [],
"details": [
{
"appID": "teamID.bundleId",
"paths": ["/deaplink","/wwdc/news/","*"]
}
]
}
}
复制代码
appID
的格式为teamID.bundleId
形式。
apple-app-site-association
不能带后缀名
1.文件配置完成以后,将其上传到你的服务器根目录或者.well-known
这个子目录下(iOS 9.3才能够)
2.确保使用https://yourdomain.com/apple-app-site-association
这个连接能够访问到,yourdomain.com
为你的服务器域名。
1.使用*
配置,则整个网站均可以使用。
2.使用特定的URL,例如/user/home
来指定某一个特殊的连接。
3.在特定URL后面添加*
,例如/user/*
, 来指定网站的某一部分。
4.除了使用*
来匹配任意字符,你也可使用 ?
来匹配单个字符,你能够在路径当中结合这两个字符使用,例如 /user/*/201?
。
进去登陆苹果开发者中心,在identifiers
下App IDs
打开Associated Domains
开关。
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的拦截。
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
}
复制代码
https://yourdomain.com/apple-app-site-association
长按这个连接,出如今XXXapp打开即为成功。(在信息里同理)apple-app-site-association
放置在服务器根目录或者.well-known
这个子目录下便可,在真机模拟是发如今iOS9.3-iOS12
请求的地址是在.well-known
下而非根目录下
最后惯例,欢迎你们star咱们的人人贷大前端团队博客,全部的文章还会同步更新到知乎专栏 和 掘金帐号,咱们每周都会分享几篇高质量的大前端技术文章。若是你喜欢这篇文章,但愿能动动小手给个赞。