如何利用QR码实现未装APP跳转下载、已装APP跳转指定页面?
需求可行性确认
你的需求完全可以落地实现,整套方案不依赖二维码的特殊能力,核心通过iOS通用链接(Universal Link)、应用内路由、后端分发逻辑三者配合即可完成,下面分模块给出具体实现思路:
1. 二维码内容设计
二维码本身只需要存储一个你服务端可控的HTTPS链接即可,推荐格式如下:https://你的域名.com/qr-link?target=目标页面标识¶m1=业务参数1¶m2=业务参数2
其中target字段对应应用内/前端页面的唯一路由标识,其他字段按业务需要带参数即可,注意不要把链接做的太长,避免部分扫码工具识别失败。
2. 各端实现逻辑
后端服务层
所有扫码后的请求首先会到达该HTTPS链接对应的服务接口,第一层判断逻辑放在这里:
- 如果请求UA标识为移动端浏览器(说明应用未安装,系统没有通过通用链接拉起App):直接返回应用下载页的响应内容即可
- 如果是App通过通用链接发起的请求:直接返回页面参数的结构化结果,或者直接让App自行解析链接里的参数即可
iOS Flutter端
首先完成通用链接的基础配置:
- 在Xcode项目中开启Associated Domains能力,绑定你的服务域名
- 在你的域名根目录部署苹果要求的
apple-app-site-association配置文件,完成通用链接的匹配规则配置
之后在Flutter侧实现两个核心逻辑: - 监听通用链接拉起事件:接入对应的链路监听库,捕获到App被通用链接拉起时的完整链接,解析出
target和业务参数暂存 - 登录状态校验:拿到跳转参数后先查询本地存储的登录状态:
- 已登录状态:直接通过Flutter路由跳转到
target对应的应用内页面,传入对应的业务参数 - 未登录状态:先跳转登录页,等用户完成登录验证后,取出之前暂存的跳转参数,再跳转到对应的目标页面
- 已登录状态:直接通过Flutter路由跳转到
Web Vue端
如果需要兼容桌面端扫码的场景,可以加一层Web适配:服务端判断请求UA为桌面浏览器时,直接返回Web页面对应的资源,Vue侧拿到target参数后通过前端路由匹配到对应的页面即可。
常见踩坑提示
- iOS的
apple-app-site-association文件必须放在域名根目录或者.well-known目录下,格式必须符合官方要求,域名必须支持HTTPS - 未登录场景下的跳转参数要存在持久化存储里,避免App进程被杀后参数丢失
- 不要在二维码链接里放敏感信息,所有鉴权逻辑放在服务端和App内部处理
内容的提问来源于stack exchange,提问作者taha
相关产品推荐
相关产品推荐

