JS交互(js调oc,oc调js,js,oc互调,第三方库WebViewJavascriptBridge)

来源:互联网 发布:ni 6229数据手册 编辑:程序博客网 时间:2024/06/06 19:29

1. WebView协议

1.1.将html网页加载进入UIWebView容器中 在"-(void)viewDidLoad”方法中加入如下代码NSString*webPath=[[NSBundlemainBundle]pathForResource:@“HelloWord"ofType:@"html”];//获取文件路径NSURL *webURL = [NSURLfileURLWithPath:webPath];//通过文件路径字符串设置URLNSURLRequest *URLRequest =[NSURLRequestrequestWithURL:webURL];//设置请求提交的相关URL[self.webViewloadRequest:URLRequest];//提交请求1.2.加入UIWebViewDelegate委托(如果想要进行相应的数据交互必须添加相应的我委托)1.-(BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType//html页面的js动作触发时运行     NSLog(@"request:%@",request.URL.absoluteString);//获取每个点击事件//!!!: 方法一2.-(void)webViewDidFinishLoad:(UIWebView*)webView //html加载完后触发1.3.OC提交JS请求.运行JS方法[self.webViewstringByEvaluatingJavaScriptFromString:@”方法名(%@)",参数]];1.4.JS提交请求到OC在-(BOOL)webView:(UIWebView*)webViewshouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(UIWebViewNavigationType)navigationType中添加如下代码:NSString*requestString = [[requestURL]absoluteString];//获取请求的绝对路径.NSArray*components =[requestStringcomponentsSeparatedByString:@":”];//提交请求时候分割参数的分隔符if ([componentscount]>1 && [(NSString*)[components objectAtIndex:0]isEqualToString:@"testapp"]) {//过滤请求是否是我们需要的.不需要的请求不进入条件if([(NSString*)[components objectAtIndex:1]isEqualToString:@"change"]) {//所要执行的操作}returnNO;}returnYES;1.5.HTML中JS的写法.1.接收请求的方法写法functionfund(){//操作}2.提交请求的方法写法function sendCommand(cmd,param){var url="testapp:"+cmd+":"+param;//组合请求字符串document.location = url;//提交的请求}最后附上代码(传送阵): http://download.csdn.net/detail/fqcl992/6929375注:另外网上有用到stringByEvaluatingJavaScriptFromString的特性 详情参考:http://www.cnblogs.com/zhuqil/archive/2011/08/03/2126562.html

2 - 第三方库使用方法

著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:独奏 链接:https://www.zhihu.com/question/27730517/answer/37910968 来源:知乎

1. 放在controller比较好,一个bridge只用来控制一个webview和OC的交互,一般情况下一个viewcontroller对应一个webview。而且放在controller内也符合bridge的角色 2. WebViewJavascriptBridge已经封装好了实现细节,你只需要通过block的方式调用就好了 3.实际上WebViewJavascriptBridge会自动把数据转成相应的对象,比如会把OC的NSDictionary转成JS下的成员对象,会把JS的数组解析成OC的NSArray,你只需要直接使用就好了,并不需要特定的解析~5.要确定的话可以使用带有callback的方法来确定,比如OC给JS传数据oc代码如下:[_bridgecallHandler:@"testJavascriptHandler" data:data responseCallback:^(idresponse) {        NSLog(@"JS确定收到数据的回调: %@", response);  }]; JS的代码如下bridge.registerHandler('testJavascriptHandler',function(data, responseCallback) {  // 收到OC的消息,这里进行业务处理     // ...  varresponseData = { 'data':'data value' }    responseCallback(responseData)//这里可以直接callback到OC的responseCallback里面}) 只要你在JS中处理完成业务后调用 responseCallback 了,在OC中就会通过 responseCallback收到回调消息,从而确定执行完毕~另外,针对最后一个问题,其实webview的渲染是独立线程的,包括你运行的JS代码实际上都是异步的,所以不要用面向过程的思维来考虑代码是否执行完毕,一切都是通过callback来通信的,只要做到在需要的时候正确调用到相应的代码段就好了。更多用法其实你可以参考我的博文:http://honglu.me/2014/09/27/WebViewJavascriptBridge%E4%BD%BF%E7%94%A8/代码github地址:https://github.com/marcuswestin/WebViewJavascriptBridge
0 0
原创粉丝点击