跨端兼容:技术驱动的无缝链接体验
|
凌晨告警。三点零七分,监控平台弹窗叠了四层,我盯着第十七条告警邮件里那个 302 跳转链最后卡在微信内嵌浏览器的 UA 判定逻辑上——不是它崩了,是它太准了,准得把我们自建的 SDK 当成“非标准 WebView”给降级了。DBA 老张刚挂掉电话,说他那边查完 Redis 缓存键,没动过,但“键名里带个 underscore 就被 iOS 17.5 的 WKWebView 当成私有字段拦截了一次”。我原以为是前端 polyfill 漏了,结果翻 Git 历史发现去年八月份那版兼容层压根就没进 prod,灰度只跑了三天,因为后端老陈说“测试环境测不出,先放着”。 空调嗡的一声,突然抽风式加大风量,冷风直冲我后颈。工位右前方那个穿拖鞋的兄弟今早换了一双——蓝灰格子,后跟有点塌,鞋带系得特别紧,像怕自己走太快。他手机响了一声没接,屏幕亮着,显示是“运维群@全体成员”,我没点开。优胜劣汰?对,就是这四个字——不是人挑技术,是设备挑人。你连真机列表都凑不齐:安卓厂商定制系统里,同一个 Chrome 内核,华为的 WebKit 补丁会吃掉 localStorage 的第三个 key;小米的 WebView 会在 DOMContentLoaded 后延迟 18 秒触发 resize 事件;OPPO?OPPO 不报错,它直接静默丢 requestIdleCallback。我敢打包票,OPPO Find X6 这代 Webview 里 document.hidden 切换时机比 Android 官方文档写的晚三百二十毫秒,不多不少。这个我说不准是不是 vendor 自行加的 debounce,但那个 delay,我录过十七遍,帧率曲线全一样。 咖啡洒在工牌上了。褐色圆渍,直径大概两厘米,边缘毛糙,像地图上的某片未命名海域。值班表贴在茶水间门背后,上周五我调休申请被驳回,理由是“跨端链路攻坚期”,可攻坚什么?攻坚让一个 H5 页面在 QQ 轻应用里点击跳转时,既不闪白屏、也不吞 history.state、还不触发 onpopstate 的第三种中间态?后来我们写了三套 fallback:第一套 fallback 到 appscheme(iOS 拦,安卓部分机型弹权限框),第二套 fallback 到 universal link(域名备案不一致,404),第三套 fallback 到短信短链(老板说“这不像技术方案”)。所以最后上线的是——啥也没 fallback,就硬等。等用户自己切出 App、切到 Safari、手动粘贴链接。结果 DAU 月活涨了 0.8%,老板觉得这叫“真实流量筛选”。 后端老陈昨儿下午甩过来一份 Nginx access log 截图,timestamp 从 22:47:03 开始,连续三百七十二条请求都带着 X-Wechat-Browser=10.0.0;但其中三百六十九条返回了 307 Temporary Redirect——而目标地址的 response header 里明晃晃写着 Vary: User-Agent,X-Wechat-Browser。他问我:“你确定我们 CDN 没缓存这个 Vary 组合?”我说“缓了”,他抬眼盯了我三秒,然后敲回车,跑了个 curl -H "X-Wechat-Browser:10.0.0" -I https://xxx.com/ ——返回 200。他没说话,但我看见他左手小指在键盘空格键上轻轻叩了两下,叩得特别匀。这种节奏,我见过三次:一次是他发现 Redis pipeline 里混进了 lua 脚本超时,一次是他手写二分查 nginx.conf 里 duplicate location 块,第三次,就是现在。 对面工位有人念叨“调休还剩四天半”,声音不大,但每个字都带气声。我不记得谁说过这句话,反正不是 DBA,他从不提调休。我原以为“跨端兼容”这事最后会卡在 CI/CD 流水线的 UA 字符串模拟上,结果卡在测试用例里写了“expect iOS webview to support IntersectionObserver v2.3”,但实际运行时——它支持,只是 intersectionRatio 返回值永远是 0.999999,而不是 1。我们改了五十分钟,最后把断言改成 >= 0.99999。没有报 bug,没人认领,就那样留着。就像去年八月份那个没进 prod 的兼容层——代码还在 Git 里,commit message 是“fix iOS 17.4 scroll freeze”,author 是我,co-authored-by 是个空值。没人提它,没人删它,但它在那儿,像个没拔管子的病人。
文章配图,仅供参考 冷风又来了。这次是从左斜后方吹的,把我桌上一张打印纸掀起来一角,上面是上个月崩溃率 Top5 的设备分布,前三名全是 OPPO 和 vivo 的某几款机型,型号后面跟着括号标注“webview version unknown”。我懒得去查,反正查了也修不动——厂商不发 patch,OS 不更新,webview 不开放调试接口,你连 devtools 都连不上。所以最后我们干了什么?我们把那段依赖 IntersectionObserver 的动画逻辑,在检测到“vivo Y76s + Android 13 + unknow webview”组合时,直接 return false。不报错,不提示,不记录 warn,就干干净净地跳过。用户看到的结果是:页面加载完成,图片轮播不动了。但他不会点“刷新”,他只会关掉 tab。这就是优胜劣汰。不是淘汰技术,是淘汰那个愿意为 Y76s 等三秒的人。我在想,要不要把这段 return false 的判断逻辑,也写进我们的外链策略里——比如,自动拒掉所有来自 vivo 自研浏览器的 referral traffic。试一下?今晚我就让爬虫跑一轮。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



