首页/文章/前端

网页唤起 Android App 调试笔记(App Links)

2026-03-20
10744 分钟
...

 

在最近的项目中,我遇到了 网页访问特定 URL 应该唤起 Android App,但实际只打开网页 的问题。通过调试和排查,整理出以下经验和步骤。

1. 项目与环境信息(脱敏处理)

  • 网站域名:https://[your-domain].com

  • 唤起页面:/device-contract

  • Android App 包名:com.example.app

  • intent-filter 配置示例:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https"
        android:host="[your-domain].com"
        android:pathPrefix="/device-contract" />
</intent-filter>
  • assetlinks.json 已上线,包含 App 的 SHA256 签名指纹

2. 问题现象

  • 用户访问 /device-contract 页面时,网页打开了,但 App 没有唤起

  • 尝试在网页中使用:

    • window.location.href

    • 第三方库如 callapp-lib

  • 均未能触发 App 唤起

3. 分析原因

通过对比和调试,可能原因包括:

  1. assetlinks.json 与 App 的 SHA256 不匹配

    • Android 系统会验证 assetlinks.json 是否与安装的 App 匹配
  2. App Links 未通过系统验证

    • Android 12+ 要求 autoVerify,未验证成功不会自动唤起
  3. 安装顺序问题

    • App 在 assetlinks.json 上线前安装,可能无法通过验证
  4. 浏览器限制

    • 某些浏览器或内置 WebView 不支持自动 App Links

    • 微信、QQ、支付宝内置浏览器需要 fallback

4. 调试流程

4.1 安装 adb

在 Mac 上使用 Homebrew 安装:

brew install android-platform-tools

4.2 查看设备是否连接

adb devices
adb shell pm get-app-links com.example.app

输出示例:

com.example.app:
  Domain verification state:
    [your-domain].com: verified

verified 表示 Android 已通过 assetlinks.json 验证,可以自动唤起 App。

4.4 测试唤起

使用 adb 直接触发 URL:

adb shell am start -a android.intent.action.VIEW \
  -c android.intent.category.BROWSABLE \
  -d "https://[your-domain].com/device-contract?gpid=123"
  • 如果 App 弹出 → 系统配置正确

  • 如果未弹出 → 需要检查浏览器或 assetlinks.json 配置

5. 网页端处理建议

  • 支持 App Links 的浏览器 → 网页无需操作,系统自动唤起 App

  • 不支持的浏览器 → 提供 fallback:

<a href="exampleapp://device-contract?gpid=123">打开 App</a>
  • 页面示例(Next.js):
import { useEffect } from "react";

const DeviceContractPage = () => {
  useEffect(() => {
    const timeout = setTimeout(() => {
      window.location.href = "exampleapp://device-contract" + window.location.search;
    }, 500);
    return () => clearTimeout(timeout);
  }, []);

  return (
    <div style={{ textAlign: "center", marginTop: "100px" }}>
      <h2>正在启动 App…</h2>
      <p>如果没有自动打开,请点击下面按钮</p>
      <a
        href={"exampleapp://device-contract" + window.location.search}
        style={{
          display: "inline-block",
          padding: "10px 20px",
          backgroundColor: "#4CAF50",
          color: "#fff",
          borderRadius: "6px",
          textDecoration: "none",
          marginTop: "20px",
        }}
      >
        打开 App
      </a>
    </div>
  );
};

export default DeviceContractPage;

6. 总结

  1. 系统验证是核心

    • adb shell pm get-app-links 检查是否 verified

    • assetlinks.json 必须包含正确的 SHA256 签名

  2. 网页端无需 JS 强行跳转

    • App Links 自动唤起由系统处理

    • JS 仅作为 fallback 或不支持 App Links 的浏览器处理

  3. 浏览器兼容性

    • 内置浏览器(微信/支付宝/QQ)通常不支持 → 提供 scheme fallback
  4. 调试流程清晰

    • adb 查看 App Links → 直接 adb 测试 URL → 确认网页 fallback

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
前端2026-07-17
HTML Form 可以把 POST 响应加载进 iframe
在接入支付验证、身份认证或第三方授权页面时,我们经常会遇到这样的流程: 1. 后端返回一个第三方接口地址。 2. 这个地址必须通过 请求访问。 3. 接口返回 HTML,或者重定向到真正的验证页面。 4. 验证页面需要嵌入当前网站,而不是打开新标签页。 5. 验证完成后,当前页面继续执行后续业务。 第一次遇到这个需求,很容易想到: 但涉及第三方支付时,这种方式通常会遇到 CORS、Cookie、重定向和跨域页面读取限制。 实际上,HTM...
学习
前端2026-05-29
前端判断一个网页是否允许被 iframe 内嵌
前端 不能 100% 准确提前判断 一个网页是否允许被 iframe 内嵌,因为决定权主要在目标网站返回的 HTTP 响应头 里,而普通前端 JS 通常读不到跨域页面的响应头。 核心判断看这两个东西: 1. 老一点但仍常见。 表示完全不允许被 iframe 嵌入。 表示只允许同源页面 iframe 嵌入。 以前有这个,但现代浏览器支持很差,基本不建议依赖。 2. 现在更推荐看这个。 表示不允许任何页面嵌入。 表示只允许同源嵌入。 表示只...
学习
前端2026-03-02
深入理解 Cookie:安全属性、访问边界与渲染场景实践
本文系统梳理 Cookie 核心机制,聚焦 HttpOnly/SameSite 等安全属性 、 访问权限边界 、 CSR/SSR 差异 ,附关键代码示例与安全清单。适合开发查阅与知识沉淀。 一、Cookie 是什么?为什么需要它? HTTP 是无状态协议。Cookie 是服务端通过 响应头下发、浏览器自动存储并在后续 同源请求中携带 的小型文本数据(通常 ≤4KB),用于: 会话维持(Session ID) 用户偏好(语言/主题) 跨请...
学习
前端2026-03-02
退出登录时 Cookie 清除指南
核心结论 :登出 ≠ 单方面操作。HttpOnly 与非 HttpOnly Cookie 需 前后端协同清除 ,缺一不可。残留 Cookie = 安全隐患 + 用户体验漏洞。 🔒 为什么不能“一键清空”? 浏览器出于安全设计: 后端 :只能通过 响应头清除 自己设置过 的 Cookie(需属性完全匹配) 前端 JS :可读写非 HttpOnly Cookie,但 无法触碰 HttpOnly Cookie 无“清除全部”API :任何服...
学习
前端2025-12-15
懒加载图片在同一个 Item 中逐个出现的原因与解决方案
懒加载图片在同一个 Item 中逐个出现的原因与解决方案 适用场景 :使用原生 实现图片懒加载的动态列表,每个列表项(item)包含多张图片。 📌 问题描述 在开发一个动态渲染的列表时,每个 item 中包含三张图片,并使用 HTML 原生的懒加载属性: 观察到的现象: 开启懒加载时 :三张图片 不是同时出现 ,而是 从左到右(或从上到下)依次加载显示 ,有明显的时间差。 关闭懒加载(移除 )后 :三张图片 看起来是一起出现的 ,视觉...
学习
前端2025-11-26
📌 Vue Skeletor 要点
用途 :提供自适应的骨架屏加载组件,自动匹配现有组件的排版和样式,无需手动绘制方块或圆形。 安装 : 使用方式 : 局部注册 :在组件中 并注册。 全局注册 :在 中 。 插件模式 :可通过 全局配置,关闭闪烁动画。 提供 组合式 API,可在运行时修改全局配置。 属性支持 : / :支持数值或 CSS 字符串。设置 时骨架变为矩形。 :同时设置宽高,方便生成方形或圆形。 :布尔值,生成圆形骨架。 :布尔值,生成圆角矩形,适合按钮或芯片...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录