您的位置:首页 > 移动开发 > IOS开发

iOS下的app和h5交互

2015-10-10 11:31 411 查看
在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 +‘¶m2='
+
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 = "";
              
 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IOS http native