做小程序时,外部链接拉新和活动导流很常见。用户从短信、社群或外部落地页点进来,原本想继续看活动、完成操作,结果页面一跳出,体验就容易断。想把外部网页收进小程序,思路并不复杂:用小程序里的 web-view 组件,把外部链接变成小程序内部可展示的网页。

严格来说,这个做法不是把浏览器留在小程序里,而是把外部链接作为参数传给小程序,再由一个专门的承接页去加载它。这样做的好处是,用户始终处在小程序环境内,之后回首页、进功能页、完成转化,都更顺。
实现时,先给小程序准备一个承接页。一般会在 app.json 里注册 pages/webview/webview;如果产品上希望它成为底部导航项,也可以顺便配置 tabBar。比如:
{
"pages": [
"pages/index/index",
"pages/webview/webview"
],
"tabBar": {
"list": [
{
"pagePath": "pages/index/index",
"text": "首页"
},
{
"pagePath": "pages/webview/webview",
"text": "链接",
"iconPath": "icon/webview.png",
"selectedIconPath": "icon/webview_selected.png"
}
]
}
}

这里真正关键的是 pages 里注册了 webview 页面,tabBar 只是给它一个展示入口。如果这个页面只用来承接外部链接,不一定非要放到底部导航,普通页面就够用了。
承接页本身的逻辑很轻:从启动参数里取出 url,解码后放进页面数据里。
Page({
data: { url: '' },
onLoad(options) {
if (options.url) {
this.setData({ url: decodeURIComponent(options.url) });
}
}
});

wxml 里则只需要一个 web-view,把 url 绑到 src 上:
<web-view src="{{url}}"></web-view>
这样,外部链接带来的网址就能在小程序内部展示出来。实际项目里,最好再给 url 准备一个兜底值。否则参数没传进来时,用户可能只看到一片空白,这种问题还容易被忽略。
接下来,要在 app.js 里接住启动参数。小程序被外部链接拉起时,启动参数里可能带有 query.url。读到之后,就可以跳转到承接页:
App({
onLaunch(options) {
const url = options && options.query && options.query.url;
if (url) {
wx.reLaunch({
url: '/pages/webview/webview?url=' + encodeURIComponent(url)
});
}
}
});

这里有两个细节值得留意。一是 query 不一定每次都有,先判断是否存在,可以避免不少空值问题。二是 wx.reLaunch 会重置页面栈,适合“外部进入后直接落到承接页”的链路。另外,如果小程序已经在前台,外部链接再次唤起时,参数也可能出现在 onShow 里。因此,按实际投放场景把启动参数接收完整,会比只写 onLaunch 更稳。
还有一个容易忽略的前提:web-view 加载的网页域名,通常需要在小程序后台配置为业务域名。代码写对,不等于所有链接都能打开。域名没配、HTTPS 有问题、网页本身访问异常,都可能导致页面加载失败。遇到这类问题,先检查域名配置和网页可访问性,往往比反复改跳转逻辑更快。
把这些环节串起来,链路其实很清楚:外部链接带参数打开小程序,小程序启动时取到 url,再切到 web-view 页面加载网页。它解决的并不只是“能不能打开”的技术问题,更是把原本会跳出、会中断的链路重新收回小程序内。对用户来说,少一次切换;对业务来说,多一个完整的承接入口。
अभी लॉगिन करें