原生与js交互有两种方法:代理、JsContent
一、UIWebviewDelegate 代理交互
代理交互原理较为简单,也比较强大,但是代码书代码量可能比较大。
_webView.delegate=self;
NSString *path = [[NSBundle mainBundle] pathForResource:@"First" ofType:@"html"];
NSURLRequest*request = [[NSURLRequestalloc]initWithURL:[NSURLURLWithString:path]];
[_webViewloadRequest:request];
#pragma mark - UIWebviewDelegate
- (void)webViewDidFinishLoad:(UIWebView*)webView {
// 原生调用js
[webView stringByEvaluatingJavaScriptFromString:@""];
}
- (void)webViewDidStartLoad:(UIWebView*)webView {
}
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType(UIWebViewNavigationType)navigationType {
// js调用原生。原生通过过滤请求的字符串(可能为url,也可能是自定义协议),调用原生的方法。
NSString*string = request.URL.absoluteString;
NSLog(@"shouldStartLoadWithRequest:%@", string);
return YES;
}
二、JSContext,JSContext是js会话。
1、原生调用js
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *textJS = @"showAlert('这里是JS中alert弹出的message')";
[context evaluateScript: textJS];
2、js调用原生
//定义好JS要调用的方法, share就是调用的share方法名
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"share"] = ^() {
NSArray*args = [JSContext currentArguments];
for(JSValue * jsVal in args) {
NSLog(@"%@", jsVal . toString);
}
UIAlertView*alertView = [[UIAlertViewalloc]initWithTitle:@"方式二"message:@"这是OC原生的弹出窗"delegate:selfcancelButtonTitle:@"收到"otherButtonTitles:nil];
[alertViewshow];
};
网友评论