Objective-C和JS交互
2015-09-25 15:10
411 查看
一、核心原理
1. OC–>JS
stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数、一句js代码或他们的组合),当js函数有返回值或一句js代码有值返回可通过stringByEvaluatingJavaScriptFromString的返回值获取。2. JS–>OC
利用webView的重定向原理(即重新在js中指定document.location的值,此为一url),只要在这个url字符串中按自定义的规则指定好所需调用oc中的函数和参数,然后通过OC中的shouldStartLoadWithRequest函数去捕获处理请求。二、OC源代码
1. ViewController.h 实现
#import <UIKit/UIKit.h> @interface ViewController : UIViewController <UIWebViewDelegate> @end
2. ViewController.m实现
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 初始化UIWebView UIWebView *web = [[UIWebView alloc] initWithFrame:self.view.bounds]; web.delegate = self; [web setScalesPageToFit:YES]; [self.view addSubview:web]; //加载网页 NSURL *url = [NSURL URLWithString:@"http://192.192.102.111:8080/test.html"]; [web loadRequest:[NSURLRequest requestWithURL:url]]; } #pragma mark - UIWebViewDelegate实现 #pragma mark 开始加载网页 - (void)webViewDidStartLoad:(UIWebView *)webView { NSLog(@"开始加载网页"); } #pragma mark 网页加载完成 - (void)webViewDidFinishLoad:(UIWebView *)webView { NSLog(@"网页加载完成,调用JS代码\n--------------"); [webView stringByEvaluatingJavaScriptFromString:@"ocUICall('阳君')"]; } #pragma mark 网页加载出错 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { NSLog(@"网页加载出错:%@", error); } #pragma mark 网页监听 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // 过滤 NSString *requestString = [[request.URL absoluteString]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];; // 分割 NSArray *urlComps = [requestString componentsSeparatedByString:@"::"]; if ([urlComps count] == 3 && [@"ios" isEqualToString:[urlComps objectAtIndex:0]]) { //解析约定的指令 // 方法名 NSString *methods = [NSString stringWithFormat:@"%@:", [urlComps objectAtIndex:1]]; // 携带的参数 NSString *params = [urlComps objectAtIndex:2]; NSLog(@"JS调用OC代码->UIWebView\n方法名:%@,参数:%@", methods, params); SEL selector = NSSelectorFromString(methods); // 判断类是否有方法 if ( [ViewController instancesRespondToSelector:selector]) { // 执行方法,携带参数 [self performSelector:selector withObject:params]; } else { NSLog(@"没有提供调用的%@方法名",methods); } return NO; } return YES; } @end
三、JS源代码
// UIWebView调用 function ocUICall(params) { // 方法名 var method = "test"; // 组装请求数据 var url = "ios::" + method + "::" + params; // 发起请求 document.location = url; }
四、运行输出
相关文章推荐
- C++ 11 - STL - 函数对象(Function Object) (中)
- Objective-C---3---NSString的常用方法
- 设计模式之工厂方法模式(代码用Objective-C展示)
- Java学习笔记【Object】
- 【投稿】打造Objective-C安全的Collection类型
- Object-C 对象初始化
- Object-C 数组(一)(NSArray)
- Object-C 字符串对象
- object-c 字符串(NSString)
- 【IOS 开发学习总结-OC-18】★★objective-c面向对象之——OC的包装类与对象处理
- org.hibernate.NonUniqueObjectException的原因与解决方法
- 黑马程序员--Java基础学习笔记【Object类、String类】
- Object 转 Json (针对父类和数组)
- Objective C静态代码扫描和代码质量管理 OClint + SonarQube
- 2016校招记
- 操作JSONObject中的某一个bean
- 获取JSONObject里所有key
- 【IOS 开发学习总结-OC-17】★★objective-c面向对象之——多态
- Object-c 面向对象(四)
- Object-c 面向对象(三)