在h5和native的交互过程中,我知道的有两个非常好用的框架WebViewJavascriptBridge_iOS和phonegap

这两种方法都能非常好的处理二者的交互,特别phonegap网上有很多现成的插件支持,是一个非常强大而又方便的工具,如果应用是一个二者交互特别重的app,可以考虑导入这个框架。 WebViewJavascriptBridge_iOS则是一个非常轻量级的框架,但是,但是 如果没有一个安卓 ios js都熟悉的人员,这两个框架想要导入到项目中,都是一个艰难的过程,为啥,因为语言不通。

二者的原理其实很简单,就像说你好,他说hello一样,下面我们不考虑使用框架,讲讲如何在ios中直接进行二者的交互,而且在简单的项目中,没有必要使用上面的两个框架



1,最简单的就是拦截url,匹配出自己所需的url,获取交互参数



    window.location.href  在后面跟着我们需要传送的参数,一般都是自己定义一种协议,拦截特定的协议,如下


     window.location.href= ‘h5ToNative://methond?param1=' + param1 +‘&param2=' + param2; 此方法会触发url跳转


 即是会触发- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest: (NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType 




注意:在使用这种方法的时候,发现如果h5在跳转页面的时候,同事触发这个方法,由于两个跳转是同样的操作,后面的操作会阻断前面的操作,也就是h5跳转和h5传参只能有一个起作用。




2 ajax请求  phogap用的就是这种方式 


使用ajax请求,就要对 NSURLProtocol有了解,因为对ajax的拦截是在 NSURLProtocol的子类中进行,具体 NSURLProtocol是什么,或者怎么使用,不在这里讲解。


这种方法的核心代码就是ajax请求的发送,


functioniOSExec(code,json)
 
{
 
      varexecXhr = new XMLHttpRequest();
 
      execXhr.open('HEAD', (newDate())+"/!/h5ToNative://methond?param1="+ param1+ "¶m2="+ param2,true);//设置scheme
 
      varvcHeaderValue = /.*\((.*)\)/.exec(navigator.userAgent)[1];
 
      execXhr.setRequestHeader('rc',1);
 
      execXhr.send(null);
 
}


这种方法发送一个空的xmlhttpRuest请求,主要的就是url参数,在这里需要注意的是,因为我们需要对ajax请求拦截,并在canInitWithRequest返回YES,如果是同一个请求,再次请求的时候,是不能触发这个方法的,所以我们在请求的参数之前加了一个当前的时间newDate() 我们在进行解析的时候,可以完全忽略这个时间。




3 改变iframe,这种方法通过改变网页中一个隐藏的控件大小,触发- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest: (NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType方法,进行拦截处理  WebViewJavascriptBridge_iOS用的就是这种方式

function TestIOSJS()
 
{
 
        var messagingIframe;
 
        messagingIframe = document.createElement('iframe');
 
        messagingIframe.style.display = 'none';
 
        document.documentElement.appendChild(messagingIframe);
 
        messagingIframe.src = "";
 
              
 
 }