1.背景
我们的项目是混合开发,最近需要将UIWebView替换成WKWebView,我基于WKWebView封装了本地的混合框架用来加载本地html结果发现很多请求拦截不到(比如定位,获取天气数据源等)
2.问题发现
由于UIWebView是可以通过JSContext来做交互的,比如可以通过JSContext来监听js方法并用JSValue来接收相关参数什么的,所以之前我们的UIWebView基于这个加载本地html对于一些相关请求是没问题的,但是当我使用拦截协议的时候发现UIWebView也不行.对此我发现只能拦截到单个url其他拦截不到,说明一些请求被取消了.
3.解决问题
我们的js在 created:function的时候同时发出了多个url请求 sdk.js里ums.send方法中进行多个url连续进行location 会导致一些location操作被取消 所以要自己自定义laodURL方法进行加载 这样就解决了一些协议拦截不到的问题 http://blog.devtang.com/2012/03/24/talk-about-uiwebview-and-phonegap/
加载URL采用的是document.location(没错连续加载会导致某一次的location操作被取消)所以采用自定义加载url的方法来解决
// Javascript 语言
// 通知 iPhone UIWebView 加载 url 对应的资源
// url 的格式为: gap:something
function loadURL(url) {
var iFrame;
iFrame = document.createElement("iframe");
iFrame.setAttribute("src", url);
iFrame.setAttribute("style", "display:none;");
iFrame.setAttribute("height", "0px");
iFrame.setAttribute("width", "0px");
iFrame.setAttribute("frameborder", "0");
document.body.appendChild(iFrame);
// 发起请求后这个 iFrame 就没用了,所以把它从 dom 上移除掉
iFrame.parentNode.removeChild(iFrame);
iFrame = null;
}