先来说说它有哪些好处:
1、可以直接通过https链接在浏览器或wkwebview中打开app
2、浏览器不会弹出安全提示框
3、如果手机上没有安装app,浏览器则会直接打开对应的网页,如果有安装app,则会直接打开app
4、通用链的定义只能使用自己服务器定义的路径,别人无法篡改
再来说说如何使用:
1、创建一个名字叫apple-app-site-association的json文件(注意:扩展名不需要),内容如下:
{ "applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ] }, { "appID": "TeamID.BundleID2", "paths": [ "*" ] } ] } }
paths 用于设置可以打开app的页面路径, 如果是*,表示任何页面路径都可以用来打开app
注意:paths 路径是大小写敏感的
2、将apple-app-site-association文件上传到服务器
上传到服务器的根目录(或者在根目录下的.well-known文件夹下,注意:well-known前面加"点",表示隐藏文件夹)
校验apple-app-site-association是否有效,可以通过苹果提供的工具验证:点击这里进入验证
3、xcode中配置Associated Domains
打开xcode,选择添加Capabilities,添加用于打开app的通用链接域名
这里配置的作用是,app首次启动时会向这里配置的域名服务器的根目录或根目录的.well-known下下载apple-app-site-association文件
4、配置支持通用链接的交互(这里可以省略,如果你不需要任何交互)
在 AppDelegate 里实现如下方法
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb else { return false } if userActivity.webpageURL?.host == "www.domain.com" { // 根据自己的逻辑打开app对应的页面 return true } else { // 不被允许的域名,不做处理 return false } }
到此,通用链接配置就完成了。
当然在wkwebview中也是可以屏蔽通用链接打开app的,那微信为例,微信是不允许随便一个链接就能跳出微信打开app的,那么它是如何做到的呢 ?其实是在wkwebview的代理方法中做了手脚,代码如下:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { decisionHandler(WKNavigationActionPolicy(rawValue: WKNavigationActionPolicy.allow.rawValue + 2)!) }
就是这里WKNavigationActionPolicy.allow.rawValue + 2,加2的结果。