您的位置:首页 > 移动开发 > IOS开发

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];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: