iOS 配置通用链接(Universal Link)服务端和开发者后台都配置好了,还是跳转不到App

目录

一、什么是 Universal Link?

1.背景介绍

2.特点

3.运行机制原理&流程图

二、配置教程

1.第一步:开启 Associated Domains 服务

1.1 开通 Associated Domains

2.第二步:服务器配置 apple-app-site-association(AASA) 文件

2.1 创建 apple-app-site-association 文件

2.2 将 apple-app-site-association 文件上传到服务器

2.3 校验 AASA 文件的有效性

2.3.1 三方工具(推荐使用)

2.3.2 官网(不好用)

3.第三步:配置 Associated Domains(域名)

3.1 在 Xcode 中配置

3.2 在 HBuilderX 中配置

4.第四步:验证通用连接(Universal Link)是否配置正确


我按照大佬的操作都完成了,服务端给的地址也都验证通过,我前端配置也都ok,就是不跳转,最后发现是手机缓存问题,重启手机后,再重试就好了。

底部文章是来自一个大佬的博客总结的内容:

瑾瑾的技术分享博客

一、什么是 Universal Link?

1.背景介绍

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

  • 由于苹果 iOS 13 系统版本安全升级,微信 SDK1.8.6 版本要求支持 Universal Links 方式跳转,以便进行合法性校验,提升安全性。详情请参考微信官方文档 - iOS 接入指南

2.特点

  • Universal Link 可以无缝链接到 app 或网页,主要应用场景有内容分享广告投放。它有如下特点:

    • 如果安装了 app,会直接打开 app,并定位到内容页;
    • 如果没有安装 app,使用浏览器打开该链接;

3.运行机制原理&流程图

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

Universal Links流程

二、配置教程

1.第一步:开启 Associated Domains 服务

1.1 开通 Associated Domains
  • 登录苹果开发者中心,在“Certificates, Identifiers & Profiles(证书、标识符和描述文件)”页面选择“Identifiers(标识符)”

    证书、标识符和描述文件

  • 在“Identifiers(标识符)”选项下,添加或选择对应的 App ID

    添加或选择对应的 App ID

  • 勾选 Associated Domains 并保存,一定要确保开启 Associated Domains 服务

    重要提示:开启 Associated Domains 服务后,需要重新生成 profile 文件

    开启 Associated Domains 服务

2.第二步:服务器配置 apple-app-site-association(AASA) 文件

AASA(apple-app-site-association)文件是一个位于 根目录 或 /.well-known 文件夹下面的 json 文件 (例如: https://your_domain/apple-app-site-association 或 https://your_domain/.well-known/apple-app-site-association),里面描述了目标 app 的信息。AASA 文件和 entitlements 为网站和 app 提供了互相认证的机制。

2.1 创建 apple-app-site-association 文件
  • 需要创建一个 apple-app-site-association 文件,必须命名为 apple-app-site-association,切记没有后缀,有些人的电脑是隐藏文件后缀的,务必把 .json 后缀去掉!

    1
    
    touch apple-app-site-association
    
  • 文件内添加 json 格式数据,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    {"applinks": {"apps": [], // apps:是限制只能在这几个app中使用,基本上不填写,所以是空数组"details": [// 可以配置一个,也可配置多个{"appID": "9JA89QQLNQ.com.apple.wwdc", // appID:是由TeamId + . + BundleId组成"paths": ["*"] // paths:设定你的app支持的路径列表,只有这些指定路径的链接,才能被app所处理。"*"的写法代表了可识别域名下所有链接},{"appID": "ABCD1234.com.apple.wwdc","paths": ["/app/*", "/qq_conn/appid/*"] // "/app/*"是自己定义的路径;"/qq_conn/appid/*"需要根据QQ互联平台设置,appid是QQ互联后台对应应用的APPID}]}
    }
    
2.2 将 apple-app-site-association 文件上传到服务器
  • 你的服务器必须支持 HTTPS 协议,并且拥有该域名下上传到根目录的权限;

  • 将这个文件上传到你的服务器,可以将这个文件放到服务器的 根目录 下,也可以放到 .well-known 这个子目录下,这是为了苹果能获取到你上传的文件;

  • 该文件的 content-type 需要设置成 application/json,可以直接在 oss 上进行修改;

    修改 Http 头

  • 上传完成后,对应的链接分别为https://xxx/apple-app-site-associationhttps://xxx/.well-known/apple-app-site-association(xxx 为服务端的域名),然后试着访问一下,看看是否能够获取到,当你在浏览器中输入这个文件链接后,出现下图就可以了:

    预览 AASA

2.3 校验 AASA 文件的有效性
  • AASA 文件的格式和命名会直接影响到 iOS 系统能否正常拉取、识别里面的内容,现在有一些工具可以校验 AASA 文件有效性:
2.3.1 三方工具(推荐使用)

aasa-validator 校验

2.3.2 官网(不好用)

3.第三步:配置 Associated Domains(域名)

3.1 在 Xcode 中配置

Xcode 版本:Version 14.2 (14C18)

  • 在 Xcode 中打开项目,选择目录中的 xxx.xcodeproj(xxx 通常为项目名称),在 xxx.xcodeproj -> Signing&Capabilites -> Capability -> Associated Domains 这个路径下进行配置;

    Xcode 配置 Associated Domains 图1

  • 然后双击 Associated Domains,即可在 Xcode 中对 Associated Domains 进行配置,如果 Capability 中已经存在 Associated Domains,那么直接配置即可;

    Xcode 配置 Associated Domains 图2

  • 在 Associated Domains 里面配置的 Universal Links,必须以 applinks: 为前缀,格式为:applinks:+配置的域名,例如:applinks:test.com

    Xcode 配置 Associated Domains 图3

3.2 在 HBuilderX 中配置

HBuilderX 版本:3.8.4

  • 打开 HBuilderX 并选择对应的项目,找到 manifest.json,在 App常用其它设置 中找到“iOS 设置”下的 关联域(Associated Domains)进行配置;

    HBuilderX 配置 Associated Domains

  • 或者打开项目的 manifest.json 文件,切换到“源码视图”项,在 uni-app 项目在 app-plus -> distribute -> ios -> capabilities -> entitlements 节点下添加 com.apple.developer.associated-domains 字段,字段值为字符串数组,每个字符串为要关联的域名;

    1
    2
    3
    4
    5
    6
    7
    
    "capabilities": {"entitlements": {"com.apple.developer.associated-domains": ["applinks:xxx.xxx.com"] // xxx.xxx.com 是应用通用链接的域名(这里不要包含path),请修改为自己应用要使用的域名}
    }
    
  • 保存后提交云端打包生效;

注意:在 Associated Domains 里面配置的 Universal Links 必须要以 applinks: 开头,后面写上域名,例如:applinks:test.com

4.第四步:验证通用连接(Universal Link)是否配置正确

注意:测试时,手机上必须安装你需要跳转的应用并配置 Associated Domains

  • 在这个链接的页面顶部能看到“在 xxx APP 中打开”字样,点击“打开”按钮可以打开 app;

Safari 校验

  • 如果输入的 Universal Links 是能识别的链接,那么点击链接看看是否可以直接跳转到 app;
  • 或者长按该链接,看看弹出的菜单中是否有“在 xxx 中打开”,这都代表着成功了;

备忘录校验

注意:服务器上 apple-app-site-association 的更新不会让 iOS 本地的 apple-app-site-association 同步更新,即 iOS 一般只会在 APP 下载完后初次启动才会下载这个文件,所以如果修改了 apple-app-site-association 文件,请删除 APP 后重新下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/117219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【makedown使用介绍】

如何使用makedown 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必…

pd19虚拟机软件 Parallels Desktop 19 mac中文停用功能

Parallels Desktop 19 mac是一款功能强大的虚拟机软件,它允许用户在Mac电脑上同时运行Windows、Linux和其他操作系统。Parallels Desktop提供了直观易用的界面,使用户可以轻松创建、配置和管理虚拟机。 Parallels Desktop 19 for Mac停用功能 从Paralle…

深圳世有伯乐教育科技有限公司——LJ培训

今天来吐槽一波 深圳世有伯乐教育科技有限公司就是一个垃圾的培训机构,不,说是培训机构都是扭曲事实了,因为它根本就没有国家认可的办学许可证。光说没法让人信服,以下是企查查的截图: 世有伯乐的工商信息图片 续上&…

交换机基础(四):MSTP负载均衡配置案例

如图所示是某个企业内部核心网络的结构图,目前企业中有20个VLAN, 编号为VLAN1~VLAN20, 为了确保内部网络的可靠性,使用 了冗余链路和MSTP 协议。为了能更好地利用网络资源和带宽,现管理员希望通过配置MSTP 的负载均衡实现网络带宽…

TX Text Control.NET For WPF 32.0 Crack

TX Text Control 支持VISUAL STUDIO 2022、.NET 5 和 .NET 6 支持 .NET WPF 应用程序的文档处理 将文档编辑、创建和 PDF 生成添加到您的 WPF 应用程序中。 视窗用户界面 功能齐全的文档编辑器 TX Text Control 是一款完全可编程的丰富编辑控件,它在专为 Visual Stu…

软考高级系统架构 上午真题错题总结

目录 前言一、2022年真题(√)二、2021年真题三、2020年真题(√)四、2019年真题(√)五、2018年真题(√)六、2017年真题(√)七、2016年真题(√&…

【Linux】IP协议

文章目录 📖 前言1. 网络层2. IP协议格式3. IP报文分片和组装3.1 如何分片和组装:3.2 组装的衍生问题: 4. 网段划分(重点)4.1 子网掩码:4.2 IP地址的数量限制:4.3 私有IP地址和公网IP地址&#…

JVM——堆内存调优(Jprofiler使用)Jprofile下载和安装很容易,故没有记录,如有需要,在评论区留言)

堆内存调优 当遇到OOM时,可以进行调参 1、尝试扩大堆内存看结果 2、分析内存,看哪个地方出现了问题(专业工具) 调整初始分配内存为1024M,调整最大分配内存为1024M,打印GC细节(如何添加JVM操…

本地FTP YUM源报错处理

一、问题描述 某次OS升级到Anolis 8.6后,但是还需要centos 6.5的yum源,恢复回去后,yum更新,报如下错误: Errors during downloading metadata for repository ‘base’: Curl error (8): Weird server reply for ftp…

python sqlalchemy(ORM)- 02 表关系

文章目录 表关系ORM表示 1v1ORM表示 1vm 表关系 1:1,表A 中的一条记录,仅对应表B中的一条记录;表B的一条记录,仅对应表A的一条记录。1:m,表A中的一条记录,对应表B中的多条记录,表B中的一条记录…

AJAX: 对话框大全

AJAX:$.ajax({url: "/admin/cutting/getDataWeek",type: "GET",data:{},dataType:json,success: function (res) {if (res.code 1) {}},error:function (error) {console.log(请求失败);console.log(error);}}); $(.sub).unbind(click).click(funct…

【转】多台服务器共享session问题

多台服务器共享 session 问题 现在的大型网站中,如何实现多台服务器中的 session 数据共享呢? 当使用多台服务器架设成集群之后,我们通过负载均衡的方式,同一个用户(或者 ip)访问时被分配到不同的服务器上…

css之Flex弹性布局(子项常见属性)

文章目录 🎀前言:本篇博客介绍弹性布局flex容器中子项的常见用法🪀flex:子项目占得份数 (划分不同子项的比例)🎇align-self 控制单独一个子项在侧轴的排列方式🧸order属性定义子项的排列顺序 &a…

2018年亚太杯APMCM数学建模大赛A题老年人平衡能力的实时训练模型求解全过程文档及程序

2018年亚太杯APMCM数学建模大赛 A题 老年人平衡能力的实时训练模型 原题再现 跌倒在老年人中很常见。跌倒可能会导致老年人出现许多并发症,因为他们的康复能力通常较差,因此副作用可能会使人衰弱,从而加速身体衰竭。此外,对跌倒…

Android12 启动页适配

印象中,在2022年末接到了一个针对Android12启动页适配的需求,当时也使用了一些适配方案,也写了一个Demo,但是最终没有付诸适配行动;当然并不是适配失败,而是根据官方适配方案适配后太丑了… 1024纪念文章&a…

SAP BW 常用知识点

SAP BW(Business Information Warehouse)是一种强大的数据仓库解决方案,它可以帮助企业收集、处理和分析海量数据,以支持更明智的商业决策。以下是一些关于SAP BW的重要知识点: 数据集成:SAP BW能够从各种…

CSP-J2023入门组第二轮T4:旅游巴士

题目描述 小 Z 打算在国庆假期期间搭乘旅游巴士去一处他向往已久的景点旅游。 旅游景点的地图共有 n n n 处地点,在这些地点之间连有 m m m 条道路。其中 1 1

Dockerfile 镜像创建

目录 一、创建镜像的三种方法: 二、基于已有镜像创建: 1.启动一个镜像: ​编辑 2.将修改后的容器提交为新的镜像: 三、基于本地模板创建: 1.下载模板: 2.导入为镜像: 四、基于Dockerfile 创…

Spring Cloud 之 Sentinel简介与GATEWAY整合实现

简介 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 熔断 …

【QT】QTableWidget

新建项目 制作流程 代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// tableWidget的使用// 第一步,设置列数ui->tableWidget->setColu…