Object-C与JavaScript通信

2016-07-11  本文已影响30人  program袁

关于JS与OC互调的方法,用的较多的有以下两种方式:

一、简单的:

1)OC调用JS:

OC提供了系统方法:

NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"testJS();"];

2)JS调用OC

通过改变document.locations=“”,然后回调UIWebview的

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

函数,在上面这个函数中,通过截取NSURLRequest解析js中传递过来的参数,再根据参数来选择早已定义好的方法。

二、iOS7之后的新方法---JavaScriptCore

1.导入framework

点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework

选中JavaScriptCore.framework后 点击右下角Add 添加完成

2.导入头文件

OC调用JS比较简单,下面直接可以

JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //获取执行环境

NSString*jsFunctStr=@"cc()"; //JS内部的方法,OC可以调用JS

[context evaluateScript:jsFunctStr];

JS调用OC有两种方法,方法的不同影响后台JS代码的写法不同

第一种:js里面直接调用方法

JSContext *context = [self.webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //获取执行环境

context[@"log"] = ^() { //定义一个log方法,JS可以调用这个log方法

};

js代码直接调用:

getVipId()

第二种:js里面通过对象调用方法

首先创建一个类   并且规定一个协议

@protocolInviteFriendsActivityProtocol

- (NSString*)getMemberID;

@end

@interfaceInviteFriendsActivity :OWBaseViewController

@property(nonatomic,strong)JSContext*context;

@property(nonatomic,strong)NSString*navTitle;

@property(nonatomic,strong)NSString*url;

@end

.m 类的实现

- (void)getMemberID

{

NSLog(@"getMemberID");

}

webView调用时:

- (void)webViewDidFinishLoad:(UIWebView*)webView

{

self.context= [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

}

self.context[@"InviteFriendsActivity"]=self;

js代码需通过类调用:

InviteFriendsActivity.getMemberID();

上一篇下一篇

猜你喜欢

热点阅读