锁屏图标跳转失败需先验证url scheme是否生效:android检查intent-filter配置及浏览器测试myapp://协议,ios需配置associated domains与apple-app-site-association文件;onlaunch中应解析options.query而非options.path;tabbar页必须用uni.switchtab且url不含参数;路径须严格匹配pages.json大小写,避免白屏。

锁屏界面图标点击后跳转不到目标页?先确认 URL Scheme 是否生效
锁屏界面(如 Android 的桌面快捷方式或 iOS 的 Widget)点击跳转,本质是通过系统唤起 App 并传入自定义协议(URL Scheme),不是直接调用 uni.navigateTo。如果点图标没反应或跳转失败,第一件事是验证 Scheme 是否注册成功且被系统识别。
常见错误是只在 manifest.json 里配了 schemes,但没在对应平台做额外配置:Android 需要 intent-filter 声明(HBuilderX 自动生成,但自定义打包时可能丢失);iOS 需启用 Associated Domains(Universal Links)才能支持更可靠的跳转,仅靠 Scheme 在 iOS 14+ 上受限(Safari 可能拦截、部分机型不触发)。
- 检查
manifest.json中app-plus → schemes是否为字符串数组,例如["myapp"],不能写成"myapp"(单字符串) - Android 端可手动测试:在浏览器地址栏输入
myapp://page/home,看能否拉起 App;若无响应,说明 Scheme 未生效或被系统屏蔽 - iOS 端需同时配置
apple-app-site-association文件并部署到 HTTPS 域名根目录,否则 Scheme 跳转大概率失败或弹出“无法打开”提示
onLaunch 中解析 options.path 失败?注意平台差异和路径格式
锁屏图标唤起 App 后,参数会进 App.vue 的 onLaunch 生命周期,但 options 结构因平台而异:options.path 在 App 和小程序平台不可用(仅 H5/微信小程序启动参数走 query),真正可靠的是 options.query 或 options.univeralLink(iOS Universal Links)。
典型误操作是直接取 options.path 当页面路径用,结果跳转白屏——因为该字段在大多数锁屏唤起场景下为空或非法。
- Android Scheme 唤起时,实际参数走
options.query,例如myapp://?page=home&id=123→options.query = { page: "home", id: "123" } - iOS Universal Links 唤起时,
options里会有univeralLink字段(注意拼写),值为完整 HTTPS 链接,需自己 parse path - 统一做法:在
onLaunch里先判断options.query.page,再拼出合法路径,如`/pages/${options.query.page}/${options.query.page}`,并确保该路径已在pages.json中注册
跳转目标页是 tabbar 页面?不能用 navigateTo
锁屏跳转常指向首页、活动页等常驻 tabbar 的页面,但 uni.navigateTo 对这类页面直接报错:“the page is not found”,即使路径完全正确。
这是因为 tabbar 页面必须用 uni.switchTab 打开,且该 API 不支持传参(query 参数会被忽略)。如果跳转逻辑里混用了普通页和 tabbar 页,运行时就会静默失败或跳到错误页面。
- 方案一:在
onLaunch解析出目标页后,先查pages.json的tabBar.list,若匹配则调用uni.switchTab({ url: targetPath });否则用uni.navigateTo - 方案二:所有锁屏跳转目标统一设为非 tabbar 的中转页(如
/pages/redirect/redirect),由该页根据 query 判断是否需switchTab或navigateTo,避免主逻辑耦合 - 注意:
uni.switchTab的url必须是绝对路径且不含参数,如/pages/tabbar/home,不能写/pages/tabbar/home?id=1
跳转后页面空白或白屏?检查 pages.json 注册与路径大小写
锁屏跳转失败最隐蔽的表现是页面白屏,控制台无报错,用户以为 App 崩溃了——其实只是目标页路径没注册或大小写不一致。
uni-app 对路径大小写极其敏感,pages/a/A.vue 和 pages/a/a.vue 是两个不同路径;pages.json 里写的是 "pages/a/a",但跳转时传了 "pages/A/a",就会白屏。
- 开发阶段务必用常量管理路径,例如
const TAB_PAGES = { home: "/pages/tabbar/home", mine: "/pages/tabbar/mine" },避免字符串硬编码 - 跳转前加一层校验:用
uni.getPages()(仅 App 平台支持)或人工比对pages.json内容,确保目标路径存在 - H5 平台锁屏跳转不适用(无锁屏概念),此逻辑需用
process.env.UNI_PLATFORM !== 'h5'包裹,避免 H5 报错
intent-filter 的 data 标签完整且 category 匹配 android.intent.category.DEFAULT。











