iOS DeepLink 调研与实践

什么是DeepLink

使用统一资源标识符(URI)连接到一个App中特定的位置,而不是简单地打开App。 用户未安装App的状况下,同样能够在用户安装App后从新还原用户以前预览的页面。常见的有如下2种实现方式。html

URL Scheme (iOS8以上可用)

咱们一般只能使用scheme。这种方式须要经过safari中唤醒APP,可是这种方式须要提早判断系统中是否安装了可以响应此scheme的app,而且这种方式在微信等中是被禁用了的。若是没有安装app则该连接变成了无效连接。前端

1. 如何支持 URL Scheme

设置info.plistgit

假如我 URL Schemes填写的是 rrddlIdentifier填写的是 renrendai.com。那么我就能够在safari地址栏中输入 rrddl://renrendai.com来打开咱们的app。

2. 原理

iPhone在安装应用时能够检测到info.plist文件中是否有CFBundleURLTypes,若是存在则将相应的schemes注册到系统中,若有其它app经过github

UIApplication.shared.openURL(URL(string: "rrddl://renrendai.com")!)
复制代码

或者safari打开时,系统会查找已注册的Schemes来启动对应的app。web

3. 如何限制url打开app

若是不想被其它应用无故调起能够在AppDelegateopen 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

Universal Links就是一个通用连接,iOS9以上的用户,能够经过点击这个连接无缝的重定向到一个app应用,而不须要经过safari打开跳转。若是用户没有安装这个app,则会在safari中打开这个连接指向的网页。(现已被微信封禁)bash

1、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。

2、如何让app支持Universal Links

1.建立一个名字叫作apple-app-site-association,包含固定格式的json文件

{
"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 配置

进去登陆苹果开发者中心,在identifiersApp IDs 打开Associated Domains开关。

6. 项目配置

domains能够添加多个,前缀必须为 applinks:applinks:后为你的服务器的域名。值得注意的是要想触发Universal Link拦截必须跨域,假如Universal Link配置的是 wx.renrendai.com 这个域名,而且对这个域名下好比 /point /home /userurlPath进行了识别,也就是说只有当你访问 https://wx.renrendai.com/point/xxx 才会触发Universal Link拦截,而正经的Url https//www.renrendai.com/point/xxx 是不会触发Universal Link的拦截。

7. 项目中须要作的处理

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
}
复制代码

3、验证Universal Links配置是否成功

  1. 快捷验证,在备忘录中输入https://yourdomain.com/apple-app-site-association 长按这个连接,出如今XXXapp打开即为成功。(在信息里同理)
  2. 使用 苹果官方验证验证文件是否能被苹果请求到。

短链服务器端的相关实现

参考资料

苹果官方文档

好的文章

遇到问题:

  1. 官网说apple-app-site-association放置在服务器根目录或者.well-known这个子目录下便可,在真机模拟是发如今iOS9.3-iOS12 请求的地址是在.well-known下而非根目录下

广告时间

最后惯例,欢迎你们star咱们的人人贷大前端团队博客,全部的文章还会同步更新到知乎专栏掘金帐号,咱们每周都会分享几篇高质量的大前端技术文章。若是你喜欢这篇文章,但愿能动动小手给个赞。

相关文章
相关标签/搜索