金刚娃谈UIWebView与JS交互

1.JS调用OC的方法

OC自定义一个协议 例如YBHTTP:。JS遵循这个协议,发出一个请求window.location.href=‘YBHTTP:http://www.baidu.com‘

OC在

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 这个代理方法中拦截该请求  并根据之前规定好的协议解析这个请求,这样就知道JS要OC做什么事情,然后OC在做相应的事。相关代码仅供参考

#define kJSCallOCRequestDataHeader @"YBHTTP:" //js调用oc方法请求数据的协议头

#define kJSCallOCWebSocketHeader @"websocket:" //js调用oc方法 websocket相关

先说明一下 kJSCallOCRequestDataHeader  kJSCallOCWebSocketHeader是定义好的宏   JSCallOCProtocol是我自己定义的一个模型  [JS_OC JSCallObjcWithJSCallOCProtocol:jsCallOCProtocol webView:webView]这个是我解析协议之后我OC要做的事

下面的代码解析了两个协议

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

{

NSString *url = [request.URL.absoluteString stringByRemovingPercentEncoding];

YBLog(@"%@", url);

if ([url hasPrefix:kJSCallOCRequestDataHeader])//判断url是否遵循了JS调用OC方法 请求数据协议

{

NSString *json = [url substringFromIndex:kJSCallOCRequestDataHeader.length];

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];

NSString *url = [jsonDict[@"url"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString *method = [jsonDict[@"method"] lowercaseString];

NSString *callback = jsonDict[@"callback"];

NSDictionary *parameters = jsonDict[@"parameters"];

JSCallOCProtocol *jsCallOCProtocol = [JSCallOCProtocol jsCallOCProtocolWithURL:url method:method callback:callback parameters:parameters];

[JS_OC JSCallObjcWithJSCallOCProtocol:jsCallOCProtocol webView:webView];//JS调用OC的方法  这个是我自己自定义的  方法

return NO;//禁止加载该页面

}

else if ([url hasPrefix:kJSCallOCWebSocketHeader])//js调用oc  websocket相关方法

{

NSString *json = [url substringFromIndex:kJSCallOCWebSocketHeader.length];

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];

NSString *type = jsonDict[@"type"];

NSString *callback = jsonDict[@"callback"]; //js的回调方法

if ([type isEqualToString:@"getCurrentMessageCount"])//JS获取聊天未读信息总条数

{

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@(%zi, ‘ios‘)", callback, self.currentMessageCount]];

}

else if ([type isEqualToString:@"loginOut"])//用户退出登录

{

[self closeWebSocket];//断开websocket连接

//把本地保存的用户名密码 注销掉  即密码清空

[UserTool registerCurrentUser];

}

else if ([type isEqualToString:@"messageCountSubOne"])//用户聊天条数减一

{

self.currentMessageCount--;

}

return NO;

}

return YES;

}

2.OC调用JS的方法

这个比较简单  只需JS定义一个全局的function函数  OC直接就可以调用  比如

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@(%@, ‘ios‘)", callback, jsonStr]];

这个方法就是调用JS的callback函数   并且该函数有两个参数 分别是jsonStr  和  ‘ios‘

3.OC拦截JS的Alert 和 Confirm

只需在OC里面新建一个UIWebView的分类,定义两个方法分别是

/**

*  拦截UIWebView中网页弹出的alert提示框

*

*  @param sender  UIWebView

*  @param message 提示信息

*/

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(CGRect)frame;

/**

*  拦截UIWebView中网页弹出的confirm提示框

*

*  @param sender  UIWebView

*  @param message 提示信息

*/

- (BOOL)webView:(UIWebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(CGRect)frame;

并且实现  代码如下

static BOOL diagStat = NO;

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(CGRect)frame {

UIAlertView* customAlert = [[UIAlertView alloc] initWithTitle:@"提示"

message:message

delegate:self

cancelButtonTitle:@"确定"

otherButtonTitles:nil];

[customAlert show];

}

- (BOOL)webView:(UIWebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(CGRect)frame

{

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示"

message:message

delegate:self

cancelButtonTitle:@"取消"

otherButtonTitles:@"确定", nil];

[alertView show];

while (alertView.hidden == NO && alertView.superview != nil) {

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01f]];

}

return diagStat;

}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

if (buttonIndex==0) {

diagStat=YES;

}else if(buttonIndex==1){

diagStat=NO;

}

}

创建好这个分类之后  然后在你加载UIWebView的UIVIewCotroller中导入这个分类即可  会自动拦截JS的alert和Confirm   实现我们OC自己的方法   这个通常用来替换JS的alert提示框

4.取消UIWebView加载的网页   长按会弹出提示框 为了使其更像原生态  可以禁止掉 代码如下

#pragma mark 取消webView长按弹出copy菜单

- (void)cancelWebViewPopCopyMenu

{

self.webView.dataDetectorTypes = UIDataDetectorTypeNone;

[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout=‘none‘;"];

[self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect=‘none‘;"];

}

时间: 2024-11-29 01:07:28

金刚娃谈UIWebView与JS交互的相关文章

UIWebView和Js交互

在日常的ios项目开发中,我们经常会在原生应用中嵌入web页面,通常我们只是进行一个展示,没有其它的一些功能.但是也有一些项目中需要web页面中的html和native进行交互.但是ios sdk 并没有相应的方法来让我们做到js代码来和原生进行交互.但是webview在加载前会调用其一个delegate方法,通过监听- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request na

ios的UIWebView与js交互的有关知识

一.UIWebView与JavaScript的交互 源地址:http://blog.sina.com.cn/s/blog_74e9d98d010199jc.html 总体概述:       实质上oc与js的通信交互就是发送消息,也即函数调用,只要在交互的过程正确的指定好对方需要调用的函数和参数就ok oc-->js  stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数.一句js代码或他们的组合)

UIWebview与js交互[转]

UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS中与UIWebView中的网页元素交互. stringByEvaluatingJavaScriptFromString 使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用.我们在界面上拖放一个UIWebView控件

iOS中UIWebView使用JS交互

iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html <!doctype html> <html> <head> </head> <body> <div> <img src="test.png"/> </div> </body> <

uiwebview与js交互

UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS中与UIWebView中的网页元素交互. stringByEvaluatingJavaScriptFromString 使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用.我们在界面上拖放一个UIWebView控件

浅谈webview与js交互

浅谈下webview与js的交互,项目中因为需要获取页面中的许多属性,所以用到了这些,让后端在方法中传了过来. 下面的demo是本地的html代码,具体可以仿写,都差不多,注重思想. 1:项目目录 2:jump的代码 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <script type="text/

iOS中UIWebView使用JS交互 - 机智的新手

iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html <!doctype html> <html> <head> </head> <body> <div> <img src="test.png"/> </div> </body> <

UIWebView,WKWebView 与js交互

现在越来越多的APP需要进行网页之间的交互了,而在iOS中,加载网页的方式为UIWebView与WKWebView这两个控件. 今天就来讲一讲这两个控件怎么进行js交互吧.至于这两个控件之间的区别应该都懂..那我就不说了. 1.UIWebView - (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; 在UIWebView中提供了这个方法,这个方法就是用来执行js的 <!DOCTYPE h

UIWebView与JS的深度交互

事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img > 标签自动加载,并把下载图片的操作放在native端来处理,并通过JS将图片在Cache中的地址返回给UIWebview. 之所以要把图片操作放在