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

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

什么是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.

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

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

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:

     

  1. 配置指定文件:创建一个内容为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所处理。星号的写法代表了可识 别域名下所有链接。

  2. 上传指定文件:上传该文件到你的域名所对应的根目录或者.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证书列表



 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 非常感谢您的问题!我是 ChatGPT,我会尽力回答您的问题。 关于您提到的在微信内如何通过 Universal Link 启动 App 的问题,这需要您的 App 支持 Universal Link,并且需要正确配置您的服务器和 App。具体而言,您需要在您的 App 中添加 Universal Link 支持,并在您的服务器上为该链接提供正确的 JSON 文件,以便微信可以正确地解析并启动您的 App。 如果您遇到了困难,建议您可以查阅相关的文档和教程,或者咨询开发人员寻求帮助。同时,如果您有其他问题需要帮助,欢迎随时向我提问,我会尽力为您解答。 ### 回答2: 在微信内如何通过Universal Link唤起appUniversal Link通用链接)是一种在iOS上使用的一种技术,可以通过点击链接直接打开指定的app而不是网页。下面是在微信内使用Universal Link唤起app的步骤: 1. 配置AppUniversal Link支持:首先,开发者需要在Xcode中对App进行配置,以支持Universal Link。这包括在App的Associated Domains中添加对应的域名,以及在AppDelegate中添加处理Universal Link的相关代码。 2. 注册并配置Domain Verification文件:开发者需要在对应的服务器上注册一个domain association file,该文件包含了App的Bundle ID以及对应的域名。并将该文件配置到服务器上。 3. 生成并验证证书:开发者需要生成并验证SSL证书,确保服务器上使用的所有域名都被正确认证。 4. 在微信公众平台上配置:开发者需要登录微信公众平台,在“移动应用”中找到对应App,并选择“应用链接”。然后,填写AppUniversal Link和对应的域名。并确认手机已安装了对应的App。 5. 发起唤起请求:在微信内,开发者可以通过链接的方式发送给用户。当用户点击此链接时,微信会先检查用户手机中是否已安装有对应的App。如已安装,会直接唤起App并打开指定的页面;如未安装,则会在微信内跳转到链接中指定的网页。 需要注意的是,微信只支持指定的部分域名,并且开发者需要保证App在用户手机中安装并且能够正常运行。 ### 回答3: 在微信内通过Universal Link唤起app需要以下几个步骤: 1. 首先,需要在微信开放平台注册并创建一个应用,获取到AppID。 2. 在自己的app内配置Universal Link。打开Xcode,在工程的Signing & Capabilities选项中,添加Associated Domains,然后添加一个格式为"applinks:yourdomain.com"的条目,其中yourdomain.com是你自己的域名。 3. 在你的服务器上配置Universal Link。在你的域名下创建一个名为apple-app-site-association的文件。这个文件要满足Apple的规定格式,并描述了应用和对应域名之间的关联关系。 4. 在微信开放平台的应用设置中,将"链接发送"选项设置为"开启",并在"完整链接"中填入你的Universal Link的网址。 5. 当用户在微信中点击发送给他人的链接时,微信会检测链接是否可以匹配到对应的Universal Link,如果可以,就会尝试唤起对应的app。 需要注意的是,为了保证唤起app的有效性,必须确保Universal Link的配置无误,并且已经发布到线上服务器上。此外,还需要确保用户的设备上已经安装了对应的app,否则无法唤起

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值