//html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=no;" />
<title>JavaScriptCore</title>
</head>
<body>
<div style="width:300px; margin: 0 auto;background:red;">
<input type="button" value="带两个参数的方法" onclick="Native.testMethodWithParam1Param2('param1_value', 'param2_value')" />
<br />
<input type="button" value="带两个参数的方法2" onclick="Native.testMethod(1111, '2222')" />
<br />
<input type="button" value="带一个参数的方法" onclick="Native.testLog('带一个参数')" />
<br />
<input type="button" value="参数为数组的方式" onclick="Native.testArray([1111, '2222'])" />
<br />
<input type="button" value="测试log" onclick="log('测试')" />
<br />
<input type="button" value="JS调用OC原生提示框" onclick="alert('alert')" />
<br />
<input type="button" value="添加视图" onclick="addSubView('view')" />
<br />
<div>
<span>输入一个整数:</span>
<input id="input" type="text" />
<br />
结果为:<p id="result"></p>
</div>
<input type="button" value="计算阶乘" onclick="Native.calculateForJS(input.value)" />
</div>
</body>
<script type="text/javascript">
function showResult(resultNumber) {
document.getElementById("result").innerText = resultNumber;
}
</script>
</html>
//oc中的代码 .h文件中
#import <UIKit/UIKit.h>
#import <JavaScriptCore/JavaScriptCore.h>
//主要是声明协议继承自JSEXport协议
@protocol JSOCExport <JSExport>
/** 带两个参数的方法 */
- (void)testMethodWithParam1:(NSString *)param1 Param2:(NSString *)param2;
/** 带两个参数的方法(2) */
- (void)test:(NSNumber *)param1 method:(NSString *)param2;
/** 带一个参数的方法 */
- (void)testLog:(NSString *)logText;
/** 参数以数组的方式 */
- (void)testArray:(NSArray *)dataArray;
- (void)calculateForJS:(NSNumber *)number;
@end
@interface SQViewController : UIViewController
@end
//.m文件
#import "SQViewController.h"
@interface SQViewController ()<UIWebViewDelegate, JSOCExport>
{
UIWebView *myWebView;
JSContext *context;
}
@end
@implementation SQViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"info.html"];
myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 375, 667)];
myWebView.delegate = self;
NSURL *URL = [NSURL URLWithString:path];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
[myWebView loadRequest:request];
[self.view addSubview:myWebView];
}
#pragma mark -- UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// 设置导航栏title
self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
// 设置页面元素
// [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.display = 'none'"];
context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 打印异常
context.exceptionHandler = ^(JSContext *context, JSValue *exceptions) {
context.exception = exceptions;
NSLog(@"%@", exceptions);
};
// 以 JSExport 协议 关联 Native
context[@"Native"] = self;
// 以block 形式关联 JS中的func
context[@"log"] = ^(NSString *str) {
NSLog(@"log = %@", str);
};
__weak UIViewController *vc = self;
context[@"ale"] = ^(NSString *str) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"msg from js" message:str preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:action];
[vc presentViewController:alert animated:YES completion:nil];
});
};
context[@"addSubView"] = ^{
//这句话是错误的 应该放在主线程中进行
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
v.backgroundColor = [UIColor redColor];
[v addSubview:[[UISwitch alloc] init]];
[vc.view addSubview:v];
};
// [context[@"showResult"] callWithArguments:@[@4]];
}
- (void)calculateForJS:(NSNumber *)number {
int sum = 1;
for (int i = 1; i <= [number intValue]; i++) {
sum *= i;
}
NSString *str = [NSString stringWithFormat:@"showResult('%d')", sum];
// [myWebView stringByEvaluatingJavaScriptFromString:str];
[context evaluateScript:str];
}
/** 带两个参数的方法 */
- (void)testMethodWithParam1:(NSString *)param1 Param2:(NSString *)param2 {
NSLog(@"testMethodWithParam1 = %@, param2 = %@", param1, param2);
}
/** 带两个参数的方法(2) */
- (void)test:(NSNumber *)param1 method:(NSString *)param2 {
NSLog(@"testParams = %@, method = %@", param1, param2);
}
/** 带一个参数的方法 */
- (void)testLog:(NSString *)logText {
NSLog(@"testLog = %@", logText);
}
/** 参数以数组的方式 */
- (void)testArray:(NSArray *)dataArray {
NSLog(@"testArray = %@", dataArray);
}
@end
javascript与oc的互相调用
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 参考:iOS下JS与OC互相调用(二)--WKWebView 拦截URLiOS下JS与原生OC互相调用(总结) 关...
- 导语 越来越多的iOS程序都内嵌了H5页面,微信也提供了公众平台方便第三方应用开发者以网页JS的形式向用户提供更丰...
- 最近因为项目催的紧,所以一些模块是用web做的,里边有一些和原生代码的交互和互相调用,所以就研究了一下WKWebV...