js(javascript)与OC(Objective-C)交互
2016-09-18 18:56
274 查看
实质上oc与js的通信交互就是发送消息,也即函数调用,iOS7以后官方公布JavaScriptCore framework中很方便我们对他们之间的相互调用。在以前我们只能通过UIWebView的UIWebViewDelegate协议来实现.
或者
oc–>js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数、一句js代码或他们的组合),当js函数有返回值或一句js代码有值返回可通过stringByEvaluatingJavaScriptFromString的返回值获取
js–>oc 利用webView的重定向原理(即重新在js中指定document.location的值,此为一url),只要在这个url字符串中按自定义的规则指定好所需调用oc中的函数和参数,然后通过OC中的shouldStartLoadWithRequest函数去捕获处理请求。
js里面直接调用方法
js里面通过对象调用方法
js里面直接调用方法
js里面通过对象调用方法
在这个方法中我们需要使用到
首先我们要自定义一个协议,添加头文件
在.m中实现
在weibview加载完成之后调用
1 | - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; |
1 | - (void)webViewDidStartLoad:(UIWebView *)webView; |
oc–>js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数、一句js代码或他们的组合),当js函数有返回值或一句js代码有值返回可通过stringByEvaluatingJavaScriptFromString的返回值获取
js–>oc 利用webView的重定向原理(即重新在js中指定document.location的值,此为一url),只要在这个url字符串中按自定义的规则指定好所需调用oc中的函数和参数,然后通过OC中的shouldStartLoadWithRequest函数去捕获处理请求。
一 JS调用OC
js调用iOS分两种情况js里面直接调用方法
js里面通过对象调用方法
js里面直接调用方法
12 | - (void)webViewDidStartLoad:(UIWebView *)webView{ //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext) JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //其中getCurrentUser就是js的方法名称,赋给是一个block 里面是iOS代码 context[@"getCurrentUser"] = ^() { //在block中写OC代码 return [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"]; }; context[@"encodeParam"] = ^() { NSArray *args = [JSContext currentArguments]; NSString *param = [NSString stringWithFormat:@"%@",args[0]]; NSString *result = [[[YXBaseRequestManager alloc]init]encryptUseAES:param key:@"1%7jhs#Zjasd&tr*"]; return result; }; } |
在这个方法中我们需要使用到
JSExport
JSExport是一个协议,自定义协议后,里面的声明变量等会对JS开放,我们即可调用。
首先我们要自定义一个协议,添加头文件
#import <JavaScriptCore/JavaScriptCore.h>,继承自
NSObject
12 | #import <Foundation/Foundation.h> #import <JavaScriptCore/JavaScriptCore.h> //首先创建一个实现了JSExport协议的协议 @protocol JSObjectText <JSExport> //此处我们测试几种参数的情况 -(void)JSObjectTextPush; @end //让我们创建的类实现上边的协议 @interface JSObject : NSObject<JSObjectText> @end |
12 | #import "JSObjectText.h" @implementation JSObjectText //本地储存Key,调用之后, 检查key是否存在则说明是否条用了原生方法 -(void)JSObjectTextPush { [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"]; } @end |
12 | -(void)webViewDidFinishLoad:(UIWebView *)webView { //网页加载完成调用此方法 //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext) JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //第二种情况,js是通过对象调用的,我们假设js里面有一个对象 testobject 在调用方法 //首先创建我们新建类的对象,将他赋值给js的对象 JSObjectText *text=[JSObjectText new]; context[@"testobject"]=text; //同样我们也用刚才的方式模拟一下js调用方法 NSString *jsStr=@"testobject.JSObjectTextPush()"; [context evaluateScript:jsStr]; } |
二 OC调用JS
方法很简单,在加载webview后,通过点击事件,或者 返回值,调用stringByEvaluatingJavaScriptFromString来实现调用JS代码
12 | /* * 点击事件 * 调用javaScript的方法postStr()并取得返回值 * 输出返回值到控制台 */ -(void)ocFromJs:(id)sender { NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr();"]; NSLog(@"JS返回值:%@",str); } |
相关文章推荐
- iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法
- 通过WebViewJavascriptBridge实现OC与JS交互
- OC与js的交互 - javascriptCore
- JS与OC的交互 WebViewJavaScriptBridge WEB微信支付
- WebViewJavascriptBridge源码探究--看OC和JS交互过程
- iOS中使用JSPatch框架使Objective-C与JavaScript代码交互
- iOS开发使用WebViewJavascriptBridge实现OC与JS交互
- OC与JS交互(JavaScriptCore框架入门介绍)
- js(javascript)与ios(Objective-C)相互通信交互
- IOS 开发 OC(Object_C)与前端页面JS(JavaScript)交互整理(一)
- [iOS] 使用WebViewJavascriptBridge实现OC与JS交互
- 通过WebViewJavascriptBridge实现OC与JS交互
- 通过WebViewJavascriptBridge实现OC与JS交互
- 使用javascriptcore实现oc与js的交互
- 通过WebViewJavascriptBridge实现OC与JS交互
- 使用WebViewJavascriptBridge实现OC与JS交互
- UIWebView 与 JS 交互(1):Objective-C 调用 Javascript
- iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇
- [iOS] 使用WebViewJavascriptBridge实现OC与JS交互
- [iOS] 使用WebViewJavascriptBridge实现OC与JS交互