iOS下JS与原生OC互相调用

来源:互联网 发布:青岛城阳灭门案 知乎 编辑:程序博客网 时间:2024/05/16 10:12

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];
0 0
原创粉丝点击