在客户端中嵌入一个 WebView 来引用网页非常常见。当前项目没有使用 phonegap,而是自己写了个 iframe 传递参数(原理与 phonegap 类似)。
如下代码,iOS5-7 是可以正常调用
<iframe src="http://qq.com" style="width:200px;"></iframe> <script> function foo(){ document.querySelector('iframe').src='bar://foo?json=' + JSON.stringify({a:1,b:'2'}); } </script> <br /> <br /> <br /> <a href="javascript:foo();">foo</a>
但是升级到 iOS8 之后,却忽然打不开了。Obj-C 层并没有拦截这个 bar:// 请求。
后来经过排查,是 bar:// 这段 URI 没有 URL 编码的缘故。解决办法是 encodeURIComponent JSON 参数即可,还可以保证 中文 的传输。
如下例子。
<iframe src="http://qq.com" style="width:200px;"></iframe> <script> function foo(){ document.querySelector('iframe').src='bar://foo?json=' + encodeURIComponent(JSON.stringify({a:1,b:'2'})); } </script> <br /> <br /> <br /> <a href="javascript:foo();">foo</a>
估计是 Apple 方面为了堵住什么安全漏洞所以要求 URL 编码的。