iOS 唤起APP之Universal Link(通用连接)

  • 包含Xcode11.0的配置方式和iOS13出现的问题。html

    什么是Universal Link(通用连接)

Universal Link(通用连接)是Apple在iOS9推出的一种可以方便的经过传统HTTPS连接来启动APP的功能,可使用相同的网址打开网址和APP。当你的应用支持Universal Link(通用连接),当用户点击一个连接是能够跳转到你的网站并得到无缝重定向到对应的APP,且不须要经过Safari浏览器。若是你的应用不支持的话,则会在Safari中打开该连接。在苹果开发者中能够看到对它的介绍是:前端

Seamlessly link to content inside your app, or on your website in iOS 9 or later. With universal links, you can always give users the most integrated mobile experience, even when your app isn’t installed on their device.web

如何理解Universal Link(通用连接)

Universal Link(通用连接):看起来就是一条普通的https连接,固然是咱们在该连接域名根目录配置过的一个连接,也能够在该连接中放置对应的H5页面。当用户的点击该连接,只要手机中安装了支持该连接的APP就会直接进入到APP中。若是没有安装APP则会跳转到Safari浏览器中,展现H5页面。对用户来讲则是一个无缝跳转的过程。json

Universal Link(通用连接)的应用场景

使用Universal Link(通用连接)可让用户在Safari浏览器或者其余APP的webview中拉起相应的APP,也能够在APP中使用相应的功能,从而来把用户引流到APP中。好比淘宝当在Safari浏览器中进入淘宝网页点击打开APP则会使用Universal Link(通用连接)来拉起淘宝APP。跨域

使用Universal Link(通用连接)跳转的好处

  • 惟一性: 不像自定义的URL Scheme,由于它使用标准的HTTPS协议连接到你的web站点,因此通常不会被其它的APP所声明。另外,URL scheme由于是自定义的协议,因此在没有安装 app 的状况下是没法直接打开的(在Safari中还会出现一个不可打开的弹窗),而Universal Link(通用连接)自己是一个HTTPS连接,因此有更好的兼容性;
  • 安全:当用户的手机上安装了你的APP,那么系统会去你配置的网站上去下载你上传上去的说明文件(这个说明文件声明了当前该HTTPS连接能够打开那些APP)。由于只有你本身才能上传文件到你网站的根目录,因此你的网站和你的APP之间的关联是安全的;
  • 可变:当用户手机上没有安装你的APP的时候,Universal Link(通用连接)也可以工做。若是你愿意,在没有安装你的app的时候,用户点击连接,会在safari中展现你网站的内容;
  • 简单:一个HTTPS的连接,能够同时做用于网站和APP;
  • 私有: 其它APP能够在不须要知道你的APP是否安装了的状况下和你的APP相互通讯。

支持Universal Link(通用连接)

  1. 先决条件:必须有一个支持HTTPS的域名,而且拥有该域名下的上传到根目录的权限(为了上传Apple指定文件)。
  2. 开发者中心配置:找到对应的App ID,在Application Services列表里有Associated Domains一条,把它变为Enabled就能够了。浏览器

    配置App ID支持Associated Domains:
    安全

  3. 工程配置:
    • Xcode 11.0版本
      工程配置中相应功能:targets->Signing&Capabilites->Capability->Associated Domains,在其中的Domains中填入你想支持的域名,也必须必须以applinks:为前缀。
      具体步骤以下图:


    • Xcode 11.0如下版本
      工程配置中相应功能:targets->Capabilites->Associated Domains,在其中的Domains中填入你想支持的域名,必须以applinks:为前缀。
      配置项目中的Associated Domains:
  4. 配置指定文件:建立一个内容为json格式的文件,苹果将会在合适的时候,从咱们在项目中填入的域名请求这个文件。这个文件名必须为apple-app-site-association,切记没有后缀名,文件内容大概是这样子:
    { "applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": [ "*" ] } ] } }服务器

    说明:微信

    appID:组成方式是 teamId.yourapp’s bundle identifier。如上面的 9JA89QQLNQ就是teamId。登录开发者中心,在Account -> Membership里面能够找到Team ID。网络

    paths:设定你的app支持的路径列表,只有这些指定的路径的连接,才能被app所处理。星号的写法表明了可识 别域名下全部连接。

  5. 上传指定文件:上传该文件到你的域名所对应的根目录或者.well-known目录下,这是为了苹果能获取到你上传的文件。上传完后,本身先访问一下,看看是否可以获取到,当你在浏览器中输入这个文件连接后,应该是直接下载apple-app-site-association文件。

Universal Link(通用连接)相关验证

在iOS设备中的备忘录中输入APP能识别的连接,而后直接点击此连接,就会直接跳转到你的app了。或是长按,在出现的弹出菜单中第二项是在’XXX’中打开,这也表明着成功:

或是你将要测试的网址在Safari中打开,在出现的网页上方下滑,能够看到有在”XX”应用中打开:

出现菜单:

当点击某个连接,直接能够进咱们的app了,可是咱们的目的是要可以获取到用户进来的连接,根据连接来展现给用户相应的内容。
咱们须要在工程里的实现AppDelegate里对应的方法:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
    {
        NSURL *url = userActivity.webpageURL;
        if (url是咱们但愿处理的)
        {
            //进行咱们的处理
        }
        else
        {
            [[UIApplication sharedApplication] openURL:url];
        }
    }
     
    return YES;
}

苹果为了方便开发者,提供了一个网页来验证咱们编写的这个apple-app-site-association是否合法有效,进入验证网址进行验证:

注意
前端开发常常面临跨域问题,必需要求跨域,若是不跨域,就不行。
只有当前webviewURL域名,与跳转目标URL域名不一致时,Universal Link(通用连接)才生效。

问题汇总

  • 按照上面写的配好了,怎么死活打不开呀???
    1. 支持HTTPS呀,必定要是符合苹果认证的HTTPS证书呀。
    2. 系统问题,确保iOS9.0以上
    3. 配置文件问题,apple-app-site-association文件中配置的path和测试用的通用连接不一致,注意是区分大小写的。
    4. 域名问题,Xcode中配置的域名一不当心写错了。
  • 为毛有的手机成功了,有的手机就不行呢???
    1. 上面也提到过,由于网络波动有可能会致使部分用户第一次安装时,没法下载apple-app-site-association文件,这个只能引导用户删除重装或者在迭代时修改Associated Domains配置告诉系统从新下载apple-app-site-association文件。
    2. 另一种多是苹果抽风致使,笔者今年年初一碰到过一个蛋疼的问题,从中午一直到下午4点发现重复的删除重装,app也不会请求服务器的apple-app-site-association文件,过了4点以后就行了。当时由于时间特殊并无深究究竟是什么缘由致使。
  • 服务器换域名了肿么办???
    当Associated Domains添加新的 Domains的以后,在app再次启动的时候抓包发现(不须要删除重装),苹果会给新添加的这个Domains发送一个请求,请求新Domain下的apple-app-site-association文件。

    也就是说Associated Domains发生改变的话,系统是会知道的,这样就能够在迭代的时候删除旧的域名,添加新的域名了。
    另外Domains的配置也可使用通配符,例如:applinks:*.mywebsite.com

  • 全都配置好了,项目也能唤起来了,web页面到底该怎么弄呀???通用连接指向的服务器的页面到底应该是哪一个?

    以前iOS和安卓用的是同一个网页,也就是说从APP内分享出去的网页,能够被苹果用户和安卓用户同时查看,在这里须要由web童鞋使用js判断当前所处的平台以及其系统。

    若是是安卓用户,则显示安卓相关提示页面。

    若是是苹果用户,那么分两种:

    1. 若是是9.0以上的系统,相关的“在APP内打开”按钮的连接配置的就是咱们的Universal Link(通用连接)了,且该通用连接地址指向的是一个APP下载引导页面,那么当用户安装了APP,便可经过通用连接唤醒APP;若是用户没有安装app,那么就会跳转到通用连接指向的APP下载引导页面,达到最大化的客户导流。
    2. 若是是9.0如下的系统,则相应的 “在APP内打开”的按钮就会发一个跳转到咱们APP URL Scheme的重定向,以实如今Safari中唤醒咱们的APP。
  • 当使用通用连接唤醒APP以后,手机右上角有一个小按钮?
    那个小按钮只有(在iOS10.0如下才有)是能够引导用户跳转到Safari中,名字叫bread crumbs button(面包屑),固然也去不掉;而且当用户点过这个按钮后,再点击Universal Link(通用连接)不会直接打开对应的APP。

  • 备忘录和safari中均可以打开app,怎么分享到其余app里面就不行了?

    未跨域致使的,如:分享到微信的连接是https://www.mydomain.com/share.html,而后该网页中的“在app内打开”按钮配置的通用连接为https://www.mydomain.com/index.html
    跨域的意思是说,通用连接 和 调用通用连接的网页不要使用同一域名。
    即若是通用连接域名为www.mydomain.com,则通用连接所处的网页域名就不能是www.mydomain.com

  • 微信已经禁用了Universal Link(通用连接)

  • iOS13中在safari中能够打开相应APP,可是从微信或其余APP中点击去safari怎么就打开了别的APP?
    在iOS13以前在其余APP去safari中打开Universal Link(通用连接)系统匹配域名是全匹配,而在iOS13以后规则发生了变化,猜想是包含关系。好比在iOS13以前,若是Universal Link(通用连接)为w.mydomain.com那么在微信或者其余APP访问www.mydomain.com而后点击去safari打开则不会拉起相应APP,而在iOS13则会拉起相应APP。
    而在safari中输入的连接则依然和iOS以前同样,只有www.mydomain.com才会提示打开相应APP。

参考连接:

  1. 官方文档
  2. 苹果验证通用连接是否可用的网站
  3. 通用连接文件存放的server须要支持HTTPS苹果支持的HTTPS证书列表

文章如有不对地方,欢迎批评指正

相关文章
相关标签/搜索