UIWebView和Object-C的互调
来源:互联网 发布:mac word里繁体变简体 编辑:程序博客网 时间:2024/06/06 05:40
原文地址:http://blog.csdn.net/jaywon/article/details/7019828
利用oc调用js很简单, 系统直接提供了方法stringByEvaluatingJavaScriptFromString
- [webView stringByEvaluatingJavaScriptFromString:@"document.location.href"];
- [webview stringByEvaluatingJavaScriptFromString:@"JsMethod()"];
webview提供了以下代理方法:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
方法很简单, 顾名思义! 将要开始请求/已经开始加载/完成加载/加载错误
利用shouldStartLoadWithRequest可以捕获到uiwebview的一切请求! 如果我们在js里面发送一个特定的请求, 里面包含将要调用的oc函数和请求参数, 这样我们利用这个代理方法捕捉到后加以匹配后手动调用不就可以达到目的了??? 是的, 这样完全行得通
举个例子, js里面可以这么写:
- function sendCommand(cmd,param){
- var url="protocol://"+cmd+":"+param;
- document.location = url;
- }
protocol是自己定义的一个协议, 只要不和http, https等国际通用协议头冲突都可以, 名字随便取;
cmd是要调用的oc的方法;
param是调用的参数
然后利用document.location来达到目的! 上面的"protocol://"+cmd+":"+param是自定义的一种请求格式, 这个格式你也可以变, 比如可以像下面这样
document.location="MyCustomProtocolName:functionName?param1=value1¶m2=value2...".
js里面怎么定义都可以, 怎么方便怎么来! 不过在shouldStartLoadWithRequest方法里面捕获到了这次请求后, 你要对应的解析, 判断是不是自己特定的请求!
- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
- {
- NSString* rurl=[[request URL] absoluteString];
- if ([rurl hasPrefix:@"protocol://"]) {
- //如果是自己定义的协议, 再截取协议中的方法和参数, 判断无误后在这里手动调用oc方法
- }
- return true;
- }
备注: stringByEvaluatingJavaScriptFromString这个方法有个地方需要注意, 算不上bug, 但确实有问题, 需要注意!
如果stringByEvaluatingJavaScriptFromString执行的是带参数的js函数, 这个参数里面如果带有(\r \n ')等等, js那边收不到这个值, 这些带\的需要转义, 如下这么写js才能收到完整的消息
message = [message stringByReplacingOccurrencesOfString:@"\n" withString:@"\\\\n"];
NSString *jsMethod = [NSString stringWithFormat:@"JsMethod(\"%@\")", message];
还有一个地方, 这2种写法看似一样, 实质不同, 如果是采用'引号, 如果message带有', 消息则传不过去! 所以最好采用"
NSString *jsMethod = [NSString stringWithFormat:@"JsMethod(\"%@\")", message];
NSString *jsMethod = [NSString stringWithFormat:@"JsMethod('%@')", message];
另外也有开源的js与webview通信的例子供用, 里面也有我上面提到的问题, 需要自己修改!
https://github.com/marcuswestin/WebViewJavascriptBridge
- UIWebView和Object-C的互调
- object-c学习 - object-c和c的布尔类型
- iOS 开发 Object-C和JavaScript交互详解之OC与JS交互在UIWebView中使用
- Object-C的委托和协议
- Object-C的委托和协议
- Object-C strong和weak的解释
- Object C 类的定义和实现
- Object-C Category和Extension的区别
- Object-c 对象的使用和定义
- object-c和Java的简单比较
- Object-C 和 lua的相互调用
- Object-C Category和Extension的区别
- Java 和 Object-c的区别
- swift和object-c的相互调用
- UIWebView和PhoneGap的总结
- UIWebview 和加载的圈
- UIWebView中Objective-C和JavaScript通信
- UIWebView和网页的交互(OC中调执行JS)
- 二分搜索
- drawRect与layoutSubviews的区别
- Intellj idea 最常用的快捷键
- 【BZOJ 1106】 [POI2007]立方体大作战tet
- 10个学习Android开发的网站推荐
- UIWebView和Object-C的互调
- android bitmap缓存机制(上)
- 2015年3月1日心情记录
- Coursera Machine Learning 学习笔记(五)
- HDOJ 1163 Eddy's digital Roots(简单数论)
- 如何打造一个伟大的产品1 - 引言
- Java类库 与用户互动
- 沙箱模型
- 查找和为0的三个数