标签: iOS通用链接

  • UNIAPP一键生成iOS通用链接

    UNIAPP一键生成iOS通用链接

    背景介绍:

    Universal Link是苹果在WWDC 2015上提出的iOS 9的新特性之一。此特性类似于深层链接,并能够方便地通过打开一个Https链接来直接启动您的客户端应用(手机有安装App)。对比以往所使用的URLSheme, 这种新特性在实现web-app的无缝链接时,能够提供极佳的用户体验。 使用前请阅读苹果官方文档。

    由于苹果iOS 13系统版本安全升级,微信SDK1.8.6版本要求支持Universal Links方式跳转,以便进行合法性校验,提升安全性。更多详情请参考微信官方说明

    大白话:以前你的APP要打开其他APP是通过URLScheme实现,后来苹果提出用Https链接来启动,手机上对应的app(已安装),更方便与web-app的无缝对接。微信响应了这个方案。所以大家开发的APP无论是微信登录、微信支付,还是微信分享等一切会跳转到微信,再跳回来的场景,需要提供这个链接。要不然你的应用打开了微信,微信就打不开你的应用。

    如果不配置通用链接,使用新版本HX提交云端打包会失败,提示以下错误信息:

    Error code = -5000
    Error message: 
    Error: not set parameter 'UniversalLinks' @'oauth-weixin'
    

    复制代码

    传统方式配置通用链接需要:

    1. 在苹果开发者中心:开启Associated Domains服务
    2. 获取相关参数,手动创建apple-app-site-association文件
    3. 部署apple-app-site-association文件到自己的云服务器,配置SSL证书解析域名
    4. 然后手动在manifest.json中配置Associated Domains(域名)
    5. 粘贴通用链接到对应权限模块
    6. 在微信开放平台配置通用链接

    其中需要注意的细节较多,且调试起来困难繁琐,困扰了大量开发者。

    现在通过HBuilderX(3.1.9版起)云打包,支持自动生成apple-app-site-association文件,并自动托管到:自带cdn、ssl等服务的“免费”的云服务空间uniCloud的前端网页托管,自动完成manifest.json中的相关配置。用自动化技术替代了,如上所示传统方式令人苦恼的(2-5)4个步骤;只需如下三步直接搞定通用链接。

    #第一步:开启Associated Domains服务

    登录苹果开发者网站,在“Certificates, Identifiers & Profiles”页面选择“Identifiers”中选择对应的App ID,确保开启Associated Domains服务 

    开启Associated Domains服务后需要重新生成profile文件,提交云端打包时使用

    #第二步骤 自动生成通用连接(Universal Links)

    HBuilderX (3.2.0 版本起) 新增QQ互联和新浪微博开放平台的通用链接的设置。以微信模块为例,QQ与微博与之类似。

    打开项目的manifest.json文件,在“(App) SDK配置”项中的微信登录(微信分享、微信支付)下的“iOS平台通用链接(Universal Links)”中, 点击如图所示【自动生成】 

    • 注意您必须先开通”uniCloud(阿里云版)云服务空间和开通前端网页托管”点此查看开通教程,按提示完成操作即可。
    • 注意:通用链接默认域名仅供测试使用,访问频次限制60次/分钟,请勿在正式发行的项目中使用。正式项目,务必绑定自己的域名(顶级域名,二级域名均可)
    • 如何绑定自己的域名详情:https://uniapp.dcloud.io/uniCloud/hosting?id=domain

    #第三步:在第三方开放平台配置通用链接

    #微信

    打开微信开放平台,在“管理中心”页面的“移动应用”下找到已经申请的应用(没有申请应用请点击“创建移动应用”新建应用),点击“查看”打开应用详情页面。 在“开发信息”栏后点击修改,在“iOS应用”下的“Universal Links”项中配置应用的通用链接,如下图所示: 

    #QQ

    打开QQ开放平台,在“管理中心”页面的“移动应用”下找到已经申请的应用(没有申请应用请点击“创建移动应用”新建应用),点击“查看”打开应用详情页面。 在“开发信息”栏后点击修改,在“iOS应用”下的“Universal Links”项中配置应用的通用链接,如下图所示: 

    • 注意:QQ开放平台在填写时 只需要填写到host,后边的path QQ会自动生成,比如 HBuilder中一键生成 https://static-fa42aa5f-xxxxxxx-xxxxxxxx.bspapp.com/qq_conn/11111233333/ 只需要填写 https://static-fa42aa5f-xxxxxxx-xxxxxxxx.bspapp.com/,具体请查看 QQ 填写及校验universallinks

    #微博

    打开微博开放平台,在“我的应用”下找到已经申请的应用,点击“查看”打开应用详情页面。 在“应用信息”栏后点击修改,在“iOS应用”下的“Universal Links”项中配置应用的通用链接,如下图所示:

    至此,就已经完成了通用链接的配置全过程,云打包后生效。

    #其他相关

    #云资源消耗说明

    托管通用链接所资源消耗的云服务器资源量非常小,文件小于0.5kb,仅你的iOS版App在:安装、登录、分享、支付时才会被联网请求(且设备会缓存通用链接的文件内容,缓存有效期内不会再次联网请求)。而阿里云正式版-开发者版(免费版)的前端网页托管,免费额度为:1GB/月;普通项目的服务空间,如果仅托管“通用链接”使用免费版也够用。

    #通用链接迁移指南

    阿里云公测版即将下线,需要将通用链接文件迁移到新的正式版服务空间的用户参考以下步骤:

    uniCloud阿里云正式版-付费版,支持“一键迁移”(即将上线)可省略步骤3和4

    1. 解绑域名与旧服务空间的绑定关系在uniCloud web控制台打开旧的服务空间 -> 前端网页托管 -> 参数配置 -> 域名信息 配置网站域名 -> 点击删除
    2. 绑定域名到新服务空间在uniCloud web控制台打开新服务空间 -> 前端网页托管 -> 参数配置 -> 域名信息 配置网站域名 -> 添加域名(添加后CNAME的值不会马上出现,需要过一会后点击右上角的刷新按钮,直至出现) -> 解析域名
    3. 指定要生成通用链接的服务空间在HBuilderX中点击项目的 manifest.json -> App模块配置 OAuth(登录鉴权)-> 微信登录(其他模块同理),点击自动生成 -> 选择“新开通的服务空间“ -> 下一步 -> 自定义域名 -> 完成
    4. 自动生成与部署直接提交云打包即可。注意:提交云打包,只是为了触发:“生成新的通用文件并自动部署到新服务空间”,用户的客户端无需更新。

    #客户端处理通用链接。

    可通过5+ API的plus.runtime.launcher判断应用启动来源,如果其值为”uniLink”则表示通过通用链接启动应。这时可通过5+ API的plus.runtime.arguments获取启动参数,通用链接启动的情况将返回完整的通用链接地址。 例:HBuilderX中自带的默认真机运行基座HBuilderX注册的通用链接:https://demo.dcloud.net.cn/ulink/

    #通用链接生成原理:

    1. 选择云空间获取云空间的默认/自定义域名
    2. 按提前制定的规范(uni-universallinks/DCloud appid)拼接URL
    3. 根据现有参数自动生成通用链接相关参数到manifest.json
    4. 发起云打包时读取证书的profile文件生成apple-app-site-association并部署到前面选定的云空间根目录的.well-known目录下(请勿删除该文件,否则通用链接将失效)
    #注意事项:
    • 通用链接指向的路径可以为空,他只是一种信息传递方式。可以简单地理解为:通过解析URL的“/”后的参数到apple-app-site-association中找到指定的包名并唤醒对应的APP
    • 通用链接内容保存在manifest.json中”云打包后生效”,被手机读取的时机是应用被安装的时候。如果你的通用链接内容有变化,你需要重新提交云打包,并重新安装一次应用才能生效
    • 通用链接最终托管在服务端,如有变动注意缓存的清理,例如尝试重启手机等操作

    如果你是本地离线打包或者由于某种原因你需要用传统的方式:私有化部署服务器来托管apple-app-site-association文件创建通用链接。你仍然可以通过手动配置manifest.json实现。详情:https://ask.dcloud.net.cn/article/36393#unilink

    #常见问题

    1.为什么我打开通用链接提示:The requested file was not found on this server.

    这是正常现象。通用链接并不要求是一个有效的路径,换句话说这个链接指向的目录允许为空。原理是访问这个链接时,iphone检测到当前域名为通用链接对应的域名,就读取域名服务器下的apple-app-site-association,然后根据域名后面的路径名称,验证并解析出要打开的app包名并唤醒对应的app。

    2.如何验证通用链接已经生效,有什么表现或者测试方案

    你可以将通用链接输入到iphone自带Safari浏览器中,下拉即可看到通用链接对应到应用名称和一个打开按钮,点击按钮即可直接在浏览器打开对应的APP。详情:点此查看演示视频

    3.使用微信登录、分享、支付等功能时,用户非首次调起微信,仍然出现二次跳转app

    微信SDK要求通用链接apple-app-site-association文件中 path不能带query参数,且末尾必须添加通配符*号。如下:

    {
        "applinks": {
            "apps": [],
            "details": [
                {
                    "appID":"8ARUHGUQNH.com.AppSample",
                    "paths": [ "/AppSample/*"]
                }
            ]
        }
    }
    
    

  • iOS通用链接(UniversalLink)配置详细流程

    iOS通用链接(UniversalLink)配置详细流程

    简介

    Universal Links 是苹果自iOS9.0推出的用于应用之间跳转的一种安全认证机制,主要用来通过HTTPS链接来无缝启动APP。手机中如果安装了支持该链接的APP就会直接进入到APP中。如果没有安装APP则会跳转到Safari浏览器中,展示H5页面。

    一、Universal Links 配置过程

    1. 登录苹果账号后,点击创建的APP 的Bundle ID,跳转到APP 信息页面。
    2. 记录下Team ID 和Bundle ID 备用。
    3. 勾选上 功能列表上的 ”Associated Domains“选项。
    iOS通用链接(UniversalLink)配置详细流程

    配置苹果后台

    1. 创建一个text空文本文件,去掉文件后缀,命名为apple-app-site-association(不能修改,且不能添加后缀)。
    2. 文件内添加json格式数据,内容如下
    {
        "applinks": {
            "apps": [],
            "details": [
                {
                    "appID":"8ARUHGUQNH.com.YHKJ.AppSample",
                    "paths": [ "/AppSample/*"]
                }
            ]
        }
    }
    

    如果一个域名下面有多端APP,可写作

    {
        "applinks":{
            "apps":[],
            "details":[
                {
                    "appID":"8ARUHGUQNH.com.YHKJ.AppSample",
                    "paths":["/AppSample/*"]
                }
                {
                    "appID":"8ARUHGUQNH.com.YHKJ.appManage",
                    "paths":["/manageAppSample/*"]
                }
            ]
        }
    }
    

    apps:为必写且固定为[ ]
    appID是指:TeamID.BundleId的组成
    paths:是一个支持的路径列表字符串数组,可以是一个也可以是多个,用于过滤可以跳转到App的链接,支持通配符*,通配符表示允许该域名下的任意路径。
    details数组中可以配置多个APP的信息,如果有多个APP需要支持Universal,则可以直接添加多个。
    严格区分字母大小写

    1. apple-app-site-association文件创建好后 发给后台,让后台放到域名的服务器根目录下,也可以在根目录中添加.well-known文件夹,将文件上传到.well-known文件夹下(.点一定不能少),对应连接分别为
    https://xxx/apple-app-site-association
    https://xxx/.well-known/apple-app-site-association
    xxx为服务端的域名
    
    1. 打开你的iOS工程,如下添加“Associated Domains”功能 和 域名地址,
      applinks:域名地址,Domains中的域名必须是使用applinks开头。
    iOS通用链接(UniversalLink)配置详细流程

    添加Associated Domains

    iOS通用链接(UniversalLink)配置详细流程

    添加域名地址

    二、测试Universal Link链接

    苹果提供了一个网页来验证我们编写的这个apple-app-site-association文件是否合法有效,
    https://search.developer.apple.com/appsearch-validation-tool/

    如果 Universal Link 配置成功,在iOS自带Safari浏览器中,打开 Universal Link 链接,下拉会出现应用入口,点击“打开”可以跳转至原生App;如打开微信的 Universal Link : https://help.wechat.com/app/ 如下图

    iOS通用链接(UniversalLink)配置详细流程

    打开微信通用链接

    二 、Universal Link 的运行机制原理

    1. 当App初次安装后或者更新版本后的第一次启动(第二次启动就不会),向工程配置的applinks:的域名请求apple-app-site-association配置文件。
    2. App自动的将apple-app-site-association配置文件向iOS系统配置。
    3. 当任何WebView发起UniversalLink的url的时候,系统遍历注册过的通用链接,如果命中则直接打开App触发Delegate方法。
    4. 如果没命中,WebView继续跳转加载url。
      以上都是系统默默替你做的,我们要做的就是确保配置的正确性。

    三 、注意事项

    1. 服务器的域名地址必须是HTTPS的,并且SSL证书必须通过苹果信任。苹果支持的HTTPS证书列表。
    2. apple-app-site-association名称不能变,不能加后缀,只能放在上面说的服务器位置。但是 iOS 会先去请求.well-known 路径,如果apple-app-site-association文件请求不到,再去请求根目录,所以如果想要避免服务器接收过多GET请求,可以直接把apple-app-site-association文件放到well-known目录下。
    3. 服务器上apple-app-site-association的更新不会让iOS本地的apple-app-site-association同步更新,Universal Link的更新 只有在APP第一次安装 和 更新版本的时候,如果Universal Link有变更,只能重新打包发版,然后让用户更新版本或者卸载重装。
    4. 跨域问题,如果由当前网页跳转Universal Link打开APP,当前网页的域名和Universal Link 的域名必须 不能一致,否则不会跳转,只会在当前的WebView里面跳转。
    5. 由浏览器或其他app应用跳转进入我自己的APP时接收回调,要在AppDelegate.m/SceneDelegate.m中实现下面回调方法:
    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray> * _Nullable))restorationHandler {
        // NSUserActivityTypeBrowsingWeb 由Universal Links唤醒的APP
        if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
            return YES;
        }
        NSURL *jumpUrl = userActivity.webpageURL; // 这个URL就是你跳转的那个URL,下载页地址,想要传参数可以直接在URL后面拼接
        // TODO:在这里进行跳转具体页面的操作
        return YES;
    }
    

    四 、Universal Links 与 URL Scheme

    另一种 外部唤起App 的方式是URL Scheme,但是URL Scheme有一些弊端。

    1. Universal Links 具有唯一性,比较安全。它是使用标准的HTTPS协议链接到你的web站点,所以一般不会被其它的APP所声明。而URL Scheme是由开发者自定义的,没有限制,任何App都可以用同一个名字,有些钓鱼App可以 设置知名的APP 的URL Scheme 来欺骗用户。
    2. URL Scheme可以通过canOpenURL判断用户是否安装App,但是只有安装了APP才能跳转,未安装则没有效果。而Universal Links 如果安装了就跳转APP,如果未安装就跳转网页展示你网站的内容,比较灵活。
    3. 使用scheme跳转系统会弹框提示,替换成UL链接后可以实现无缝跳转。

    接入微信universal link微信校验不通过指南

    http://www.taodudu.cc/news/show-2894874.html?action=onClick

    IOS – 通用链接(UNIVERSAL LINK)范文指南

    https://www.freesion.com/article/4743243660/

    配置iOS通用链接(Universal Links)

    https://www.kancloud.cn/wangking/uniapp/1875048

    微信支付IOS UniversalLink接入指南

    iOS接入指南:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html