在使用微信内置浏览器打开网页时,我们无法使用普通的open方法打开非网页内容,例如下载apk文件、pdf文件等。一般,我们会引导用户选择外部浏览器打开网页。在实践中,我发现还是很多用户会不小心点击下载按钮。这种使用体验确实很不好,但也很无奈~。
其实,在文件下载方面,http有一个规范。若我们开发的网页没有遵循这个规范,在电脑端打开文件,有时也会自动打开文件而不是打开下载窗口!浏览器打开链接的时候,会根据“Content-Type”来决定文件类型。若文件是网页或支持在浏览器打开的,那么浏览器就会直接打开。有些人,为了能够让浏览器强制打开下载窗口,会配置“Content-Type: application/octet-stream”。其实,不用这个方法,我们也可以打开下载窗口。那就是“Content-Disposition”头部字段。
“Content-Disposition”该字段是用来描述文件的展现形式的。默认都是内联“inline”,即支持的文件都直接在浏览器打开。而对于我们需要下载的文件,则可以定义为附件“attachment”,即显示下载窗口来下载文件。定义为附件时,还可以定义保存的默认文件名“filename”。更多描述可以参考文档:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition

有以上规范后,在微信打开外部浏览器就有方法了。微信是遵循以上规范的。当打开的链接指明是附件时,微信会打开下载提示界面。这时用户只要点击“其它方式下载”就可以弹出外部浏览器选择窗口。当然,直接拉起外部浏览器的方法,目前我没有发现。以上方法只是按照正常http规范实现的折中方案。至少比点击下载没有反应要好。

有了上面的基础,跳转的方式就可以这样设计:
1、网页判断浏览器是不是微信,若是,链接指向一个跳转地址。该跳转地址返回附件的头部信息,内容什么的,可以不用例会。这样就可以显示下载界面,并选择外部浏览器打开方式
2、跳转地址在解析到浏览器不是微信时,直接重定位目标网页

跳转地址的设计可以按照需求开发,甚至写个cgi都可以。这是我自己在使用的跳转地址:
http://www.iot2ai.top/cgi-bin/wxit/open.html 这个接口就是按照以上跳转的方式设计的。跳转的目标网址作为请求参数。首先解析User-Agent是不是微信,若是,返回附件的头部描述信息,内容则是目标网址(这个其实无所谓,因为我们不是下载这个页面内容)。若不是,证明用户已经选择外部浏览器打开,使用301重定位目标网址。

例如:
http://www.iot2ai.top/cgi-bin/wxit/open.html?https://www.baidu.com/ 在微信打开,会提示下载。在外部浏览器打开,会重定位到参数指定的百度搜索网址。