微信重排版的坑

微信中访问 Web 页非常之坑,除了之前文章说过的缓存之外,还有就是今天要说的重排版的坑。

根据入口不同分两种情况讨论:

1. 从朋友圈进入

从朋友圈中分享的链接进入,会触发微信的一个非常恶心的审核机制,并对不合条件的页面进行重排版

Q:为什么要对网页重新排版?

A:对网页重新排版,是为了保障微信用户的阅读体验,不受到浮层广告、恶意营销骚扰。提供纯净的阅读环境。

Q:如何让我的网页不被重新排版?

A:如果你是网页的开发者,不想让自己的网页被重新排版,可以申请一个认证公众号并绑定此域名。

美其名曰“为了保障微信用户的阅读体验”,我也是呵呵哒,明明是变相强制收取保护费(公众号认证费)。

审核机制首先查询该页面的域名是否交了保护费,交了就放行,如果没交再看情况。如果是安卓,放行;如果是苹果,那进入重排版阶段吧。这个逻辑是不是很脑残,明显区别对待嘛,真佩服他们产品。

重排版的规则就有点有趣了。重排版后的页面顶部会出现重排版的提示、input 被去除、页面的 js 全部被去除。但是,去除 js 不代表没运行。个人感觉存在一个沙盒,需要重排版的页面会先在其中跑一下,运行完之后再去除 js 并添加提示。

举个例子:页面存在一个元素 A,通过 js 将其隐藏,最终重拍版后的页面 A 是隐藏的。

我在 js 使用了 setTimeout 也被执行了,至于这个沙盒会跑多久,那就不得而知了。

另外,重拍版后的页面会出现在 qbview.url.cn 这个域名下。

不是鹅厂的人,很多地方我都是靠摸索得知的,连蒙带猜。但是有一点我可以肯定,就是这么折腾一圈下来,不慢死才怪。这些可怜的页面在浏览器中都是瞬开的啊,比在微信中不知道快到哪里去了!

2. 从聊天页进入

当聊天对话中出现链接时,点击进入,此时页面没有重排版的危险。看看,又是区别对待,为啥这会就不用“保障微信用户的阅读体验”呢?我去年买了个表。最可气的是,就算不用重排版了,加载速度依然很慢,感觉审核的过程并没有少。这部分是哪个产品搞的?敢出来解释下吗?

如果微信总体上可以给张小龙打90分的话,在微信内访问 Web 页面这个细节上是绝对不及格的。

坑就在这,不爽也没办法,只能干。不想交保护费,却希望页面仍然能正常运转,可能吗?基本不可能。只能使用折中的方法,比如,在重排版后给出提示,让用户在浏览器中访问页面。

我的做法就是先写一个提示框,引导用户在浏览器访问页面。这个提示框通过样式隐藏。然后 js 判断如果是微信环境并且是 iOS 环境,则显示提示框。这种方法只有一种情况覆盖不了,就是 iOS 聊天中分享页面,这种情况不会重排版但是我们的提示框出现了(没事,反正留在微信体验也不好)。

有兴趣的同学可以看下我 Dialoger 这个项目是怎么处理的:仓库地址线上地址。如果能在微信打开这个页面看看的话是坠直观坠吼的(骗分享是什么意思,我还是个孩子我不懂)。

王大根

replace fucking with coding