wx-h5-demo: 新增场景3 分享深链验证(正确宿主页 + 复现首页 bug 的反面页),README 补验证步骤 (demo v26091001)

This commit is contained in:
2026-09-17 21:34:27 +08:00
parent 138f14e6de
commit f4610db21b
6 changed files with 275 additions and 3 deletions

View File

@@ -63,6 +63,24 @@
<div class="row"><span class="k">头像</span><span class="v"><span class="avatar" id="rAvatarWrap"><span id="rAvatarText">宝</span></span></span></div>
</div>
<div class="card">
<h2>场景3 · 分享深链验证(web-view 内 H5 分享)</h2>
<div class="row"><span class="k">当前页面</span><span class="v" id="shCur" style="word-break:break-all;text-align:right;max-width:62%">—</span></div>
<div class="row"><span class="k">深链标记</span><span class="v" id="shMark">(未设置)</span></div>
<button class="btn ghost" id="btnShMark">① 生成唯一深链标记(写入 hash 路由)</button>
<button class="btn main" id="btnShOk">② ✅ 正确分享:只 postMessage(本页不跳)</button>
<button class="btn ghost" id="btnShBad" style="color:#C4553A;border-color:#F0D8D2">③ ❌ 复现旧 bug:postMessage + navigateBack</button>
<p class="hint">
<b>判定标准</b>:点 ② 后本页<b>停留不动</b>,再点右上角「···」转发;接收者点开卡片,
打开的应是上面「当前页面」那个地址(含 hash 标记),<b>而不是小程序首页</b>。<br>
点 ③ 会立即退回上一页(旧版 <code>bridge.share()</code> 的 <code>navigateBack</code> 副作用)——
此时再点「···」转发,卡片会由上一页产出,接收者落到上一页:即线上 bug 的复现。<br>
⚠️ 仅在<b>小程序 web-view</b> 内有效(宿主页需按 <code>onShareAppMessage(options).webViewUrl</code> 拼深链,
见 <code>miniapp/scenario3-share-webview.js</code> / CRMEB <code>pages/annex/web_view</code>)。
微信浏览器/纯浏览器只能看 UI。
</p>
</div>
<p class="hint">
本页演示<b>共享授权规范</b>:<code>wx-auth.js</code>(<code>wxAuth.init/requestProfile/goMall/readAuth/isAuthorized</code>)。
授权流程:点「授权登录」→ <code>wx.miniProgram.navigateTo('/pages/annex/auth/index')</code> →
@@ -99,7 +117,7 @@
/* ============================================================
① 页面版本号(YYMMDD + 两位序号)—— 用于排查 webview 是否缓存了旧页面
============================================================ */
var VER = 26090901;
var VER = 26091001;
var verNoEl = el('verNo');
if (verNoEl) verNoEl.textContent = VER;
@@ -215,6 +233,26 @@
};
}
// 给 navigateBack 打补丁:旧版 bridge.share 用它「触发 postMessage 投递」,
// 副作用是把 web-view 页弹掉、转发被上一页接管(场景3 要复现的 bug)。
if (window.wx && window.wx.miniProgram && window.wx.miniProgram.navigateBack) {
var _back = window.wx.miniProgram.navigateBack.bind(window.wx.miniProgram);
window.wx.miniProgram.navigateBack = function (o) {
var opt = o || {};
dbg('navigateBack 调用 → delta=' + (opt.delta || 1), 'warn');
var _bfail = opt.fail, _bsucc = opt.success;
opt.fail = function (err) {
dbgErr('navigateBack fail: ' + ((err && err.errMsg) || '未知原因'));
if (_bfail) { try { _bfail(err); } catch (e) {} }
};
opt.success = function (res) {
dbg('navigateBack success(已退回上一页)', 'warn');
if (_bsucc) { try { _bsucc(res); } catch (e) {} }
};
try { _back(opt); } catch (ex) { dbgErr('navigateBack 抛异常: ' + (ex && ex.message ? ex.message : ex)); }
};
}
// 给 postMessage 打补丁:记录每一次调用 + 捕获异常
var origPost = (window.wx && window.wx.miniProgram && window.wx.miniProgram.postMessage) ? window.wx.miniProgram.postMessage.bind(window.wx.miniProgram) : null;
if (window.wx && window.wx.miniProgram) {
@@ -241,6 +279,51 @@
if (a.readAuth().avatar) { el('rAvatarWrap').innerHTML = '<img src="' + a.readAuth().avatar + '" alt="头像">'; }
}
/* ============================================================
④-b 场景3:分享深链验证
------------------------------------------------------------
规则:web-view 里的 H5 **不能**自己拉起分享面板,卡片只能由宿主小程序页
的 onShareAppMessage 产出。正确做法是 H5 只发 postMessage(传标题/图),
宿主用 options.webViewUrl(当前 web-view 真实地址,含 hash/SPA 路由)拼深链。
❌ 旧做法:postMessage 后调 navigateBack「触发投递」——会把 web-view 页弹掉,
转发被上一页接管,接收者落到首页(本页可复现)。
============================================================ */
function shRefresh() {
if (!el('shCur')) return;
el('shCur').textContent = location.href;
var m = (location.hash || '').replace(/^#\/?/, '');
el('shMark').textContent = m || '(未设置)';
}
function shMakeMarker() {
var n = Date.now().toString(36);
location.hash = '#/share-probe/' + n; // 模拟 H5 应用的 hash 深链(webview 不丢 hash)
shRefresh();
dbg('已写入深链标记 → #/share-probe/' + n, 'ok');
wxAuth.toast('深链标记:' + n);
}
function shRequest(useNavigateBack) {
var mp = window.wx && window.wx.miniProgram;
if (!mp || !mp.postMessage) {
dbgErr('不在小程序 web-view(无 wx.miniProgram),无法分享');
wxAuth.toast('请在小程序 web-view 中打开本页');
return;
}
mp.postMessage({ data: {
action: 'share',
title: 'wx-h5-demo · 分享深链验证',
href: location.href,
summary: '接收者应打开本页(含 hash 标记),而不是小程序首页',
imageUrl: 'https://mp.yizhezhe.com/mama-box/assets/resources/report.png'
} });
if (useNavigateBack) {
dbg('❌ 复现旧 bug:postMessage 后调用 navigateBack({delta:1}),会退出本 web-view 页', 'warn');
mp.navigateBack({ delta: 1, fail: function (err) { dbgErr('navigateBack fail: ' + ((err && err.errMsg) || '未知原因')); } });
} else {
dbg('✅ 已请求分享(本页未跳)。请点右上角「···」→ 转发;卡片链接应为:' + location.href, 'ok');
wxAuth.toast('请点右上角「···」→ 转发给朋友');
}
}
/* ============================================================
④ 初始化:环境检测 + 读取授权
============================================================ */
@@ -257,6 +340,14 @@
document.addEventListener('DOMContentLoaded', function () {
init();
// 场景3:分享深链验证
shRefresh();
window.addEventListener('hashchange', shRefresh);
el('btnShMark').addEventListener('click', function () { dbg('🖱️ 点击「生成深链标记」'); shMakeMarker(); });
el('btnShOk').addEventListener('click', function () { dbg('🖱️ 点击「✅ 正确分享」'); shRequest(false); });
el('btnShBad').addEventListener('click', function () { dbg('🖱️ 点击「❌ 复现旧 bug」'); shRequest(true); });
el('btnAuth').addEventListener('click', function () {
dbg('🖱️ 点击「授权登录」按钮');
if (!(window.wx && window.wx.miniProgram)) {