HarmonyOS 7 新特性(三十六)|App Linking 延迟链接全链路

用户从广告、社交分享或二维码点击一个内容链接时,应用可能还没有安装。普通深链会在安装阶段丢失目标,用户首次启动只能落到首页。HarmonyOS 7 配套的 App Linking 延迟链接能力,解决的是“点击—应用市场—安装—首次启动—还原目标内容”这一条跨阶段链路。
真正落地时,问题远不止取回一个 URL。链接必须可信、路由必须稳定、参数需要最小化、归因不能重复、首次启动要可恢复。本文给出一套从链接模型到验收指标的工程方案。
一、把安装前后的意图视为同一事务
用户点击时产生访问意图,安装只是中间步骤。建议为每次意图生成 linkId,服务端保存短生命周期目标和活动信息,客户端只接收可验证引用。
interface DeferredIntent {
linkId: string
target: 'ARTICLE' | 'PRODUCT' | 'CAMPAIGN'
targetId: string
campaignId?: string
issuedAt: number
expiresAt: number
nonce: string
}
不要把手机号、订单号或用户画像直接放在 URL 查询参数里。
二、基础链接、市场直达和延迟链接分层
应用已安装时,App Linking 直接拉起目标内容;未安装时,可进入应用市场;完成安装后,延迟链接恢复原目标。三条路径必须最终调用同一个路由解析器。
type LinkSource = 'APP_LINK' | 'DEFERRED_LINK' | 'PUSH' | 'QR'
interface RouteIntent {
route: string
params: Record<string, string>
source: LinkSource
linkId?: string
}
不要为延迟链接另写一套页面跳转逻辑,否则权限、登录和页面不存在等规则会分叉。
三、域名校验是安全边界
App Linking 使用 HTTPS 链接和域名关联提高可靠性。域名、应用标识和路径规则应纳入发布检查,避免测试域名或旧证书进入生产。
const allowedHosts = new Set(['link.example.com'])
const allowedRoutes = new Set(['/article', '/product', '/campaign'])
function validateUrl(url: URL): boolean {
return url.protocol === 'https:' &&
allowedHosts.has(url.host) &&
allowedRoutes.has(url.pathname)
}
即使系统完成域名关联,应用仍应校验路径和参数;服务器也要验证签名和有效期。

四、路由协议必须版本化
营销链接可能在应用多个版本中长期存在。路径和参数变化时要保持兼容,不能发布新版后让旧二维码全部失效。
interface LinkPayloadV2 {
v: 2
target: string
id: string
fallback?: string
}
function migratePayload(input: Record<string, string>): LinkPayloadV2 {
if (input.v === '2') return parseV2(input)
return { v: 2, target: input.type, id: input.contentId }
}
服务端短链最好只保存稳定 linkId,具体路由由可更新映射解析。
五、首次启动先完成基础初始化
延迟链接可能在首次启动最早阶段到达,而账号、数据库和路由容器尚未准备。不要立刻跳转,先进入有界队列,等必要服务就绪。
class LaunchIntentQueue {
private pending?: RouteIntent
private ready = false
push(intent: RouteIntent) {
this.pending = intent
this.flush()
}
markReady() {
this.ready = true
this.flush()
}
private flush() {
if (!this.ready || !this.pending) return
router.open(this.pending)
this.pending = undefined
}
}
队列只保存最新有效意图,进程重启时可使用加密存储恢复一次。
六、登录和权限是路由守卫
目标页可能要求登录、地区、会员或权限。链接解析器负责解释目标,路由守卫负责决定下一步。登录成功后应回到原目标,而不是固定回首页。
async function openWithGuards(intent: RouteIntent) {
const target = routeRegistry.resolve(intent)
if (target.requiresLogin && !session.isSignedIn()) {
return auth.start({ returnTo: intent })
}
if (!target.exists) return router.open('/link-expired')
return router.open(target.path, target.params)
}
敏感操作只能导航到确认页,不能通过链接直接完成支付、删除或授权。
七、消费语义必须幂等
首次启动回调、生命周期恢复和用户重复点击都可能多次返回同一个延迟链接。使用 linkId + accountId 建立消费记录。
async function consumeOnce(intent: DeferredIntent, accountId: string) {
const key = `${intent.linkId}:${accountId}`
if (await consumedStore.has(key)) return 'DUPLICATE'
await consumedStore.put(key, intent.expiresAt)
return 'FIRST'
}
内容浏览可以允许重复打开,但优惠领取和归因上报必须幂等。
八、归因和隐私分开设计
“用户成功到达内容”和“把转化归因给某活动”是两个事件。归因数据只保留活动、渠道、时间和匿名设备/账户标识,不应读取与转化无关的个人数据。
type AttributionEvent = {
linkId: string
campaignId?: string
stage: 'CLICK' | 'INSTALL' | 'OPEN' | 'TARGET_VIEW'
occurredAt: number
anonymousId: string
}
服务端处理乱序和重复事件,客户端不伪造完整漏斗。
九、链接失效也要有好体验
内容下架、活动结束、版本过低或链接过期时,返回明确页面,解释原因并推荐安全替代内容。不要跳空白页,也不要无限重试接口。
网络失败可展示目标摘要并提供重试。若参数校验失败,记录匿名错误码并回到安全首页,不显示内部堆栈。
十、测试跨越安装边界
测试不能只在已安装应用中点击链接。至少覆盖未安装点击、应用市场跳转、安装后首次启动、登录后返回、进程被杀、链接过期、旧版本协议、同一链接重复点击和多账号切换。
自动化记录每阶段时间戳,计算点击到目标页总耗时、目标到达率、错误路由率、重复归因率和登录后丢失率。
const stages = ['CLICK', 'MARKET', 'INSTALL', 'FIRST_OPEN', 'TARGET_VIEW'] as const
type Stage = typeof stages[number]
十一、上线清单
- 链接使用 HTTPS、受控域名和路径白名单;
- URL 不包含不必要的个人或订单敏感信息;
- 基础链接和延迟链接共用路由解析器;
- 路由协议支持版本迁移和旧链接;
- 首次启动使用队列等待依赖就绪;
- 登录后能回到原目标;
- 消费和归因具有幂等性;
- 过期、下架和弱网都有安全落地页;
- 完整安装链路在真实设备验证。

结语
延迟链接的本质不是“安装后拿到一个 URL”,而是跨越浏览器、应用市场和首次启动保持用户意图。用稳定链接 ID、版本化路由、一次性消费和明确回退串起整条链路,才能真正提升转化,而不是把首页换成另一个不可控入口。
官方参考
- App Linking Kit:https://developer.huawei.com/consumer/cn/agconnect/App-linking
- 使用 App Linking 实现应用间跳转:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/app-linking-startup-V14
- 2026 年 6 月开发者月刊:https://developer.huawei.com/consumer/cn/monthly/202606
更多推荐



所有评论(0)