解决 iOS 8 WebView 不能呼叫客户端的问题

在客户端中嵌入一个 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 编码的。

你可能感兴趣的:(解决 iOS 8 WebView 不能呼叫客户端的问题)