iOS下JS与原生OC互相调用
2017-03-21 17:15
363 查看
js调用原生oc
方式一
第一种方式是用js发起一个假的url请求, 然后利用UIWebView的代理方法拦截这次请求, 然后再做相应的处理.简单代码如下
<html> <header> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <script type="text/javascript"> function xlShowAlert(message) { alert(message); } function loadURL(url) { var iFrame; iFrame = document.createElement("iframe"); iFrame.setAttribute("src", url); iFrame.setAttribute("style", "display:none;"); iFrame.setAttribute("height", "0px"); iFrame.setAttribute("width", "0px"); iFrame.setAttribute("frameborder", "0"); document.body.appendChild(iFrame); // 发起请求后这个iFrame就没用了,所以把它dom上移除掉 iFrame.parentNode.removeChild(iFrame); iFrame = null; } function action() { loadURL("xlAction://..."); } </script> </header> <body> <h2>第一种方式</h2> <br/> <button type="button" onclick="action()">Click Me!</button> </body> </html>
然后在项目中的控制器实现UIWebView的代理方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = [request URL]; if ([[url scheme] isEqualToString:"Action"]) { NSArray *params = [url.query componentsSpeparateByString:@"&"]; NSMutableDictionary *tempDic = [NSMutableDictionary dictionary]; for (NSString *paramStr in params) { NSArray *dicArray = [paramStr componentsSeparatedByString:@"="]; if (dicArray.count > 1) { NSString *decodeValue = [dicArray[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [tempDic setObject:decodeValue forKey:dicArray[0]]; } } UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:@"" delegate:self cancelButtonTitle:@"" otherButtonTitles:nil]; [alertView show]; return NO; } return YES; }
方式二
首先导入JavaScriptCore库, 然后再OC中获取JS的上下文JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
然后定义好js需要调用的方法, 例如js需要调用shareAction方法:则可以在UIWebView加载url完成后, 在代理方法中添加要调用的share方法:
- (void)webViewDidFinishLoad:(UIWebView *)webView { JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // 定义好js需要调用的方法, shareAction就是调用的shareAction方法名 context[@"shareAction"] = ^() { NSArray *args = [JSContext currentArguments]; for (JSValue *jsVal in args) { } } }
OC调用JS篇
方式一
NSString *jsStr = [NSString stringWithFormat:@"showAlert('%@')", @""]; [_webView stringByEvaluatingJavaScriptFromString:jsStr]; // 注意:该方法会同步返回一个字符串, 因此是一个同步方法, 可能会阻塞UI
方式二
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; NSString *textJS = @""; [context evaluateScript:textJS];
相关文章推荐
- iOS下JS与原生OC互相调用(总结)
- iOS中JS与原生OC互相调用之问题总结二
- iOS下JS与原生OC互相调用(总结)
- iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)
- iOS下JS与原生OC互相调用
- iOS下JS与原生OC互相调用
- iOS下JS与原生OC互相调用(精品)
- iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)
- iOS下JS与原生OC互相调用
- [iOS js与oc原生互相调用] js调用oc的两种方式
- iOS中JS与原生OC互相调用之问题总结一
- iOS下JS与原生OC互相调用
- iOS下JS与原生OC互相调用(总结)
- iOS下JS与原生OC互相调用(总结)
- iOS下JS与原生OC互相调用(总结)
- iOS下JS与原生OC互相调用
- iOS下JS与原生OC互相调用
- iOS下JS与原生OC互相调用(总结)
- iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)
- iOS中JS与原生OC互相调用之JavaScriptCore