由于时间的关系,直接上代码
JSCallOC.html
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, target-densitydpi=device-dpi"/>
<title>JSCallOC</title>
<style>
*
{
//-webkit-tap-highlight-color: rgba(0,0,0,0);
text-decoration: none;
}
html,body
{
-webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */
-webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */
-webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */
}
#div-a
{
background:#FBA;
color:#FFF;
border-radius: 25px 5px;
}
</style>
<script type="text/javascript">
function showResult(resultNumber) {
//alert(resultNumber);
document.getElementById("result").innerText = resultNumber;
}
</script>
</head>
<body style="background:#CDE; color:#FFF">
<!--<div>
<font size="3" color="black">输入一个整数:</font>
<textarea id="input" style="font-size:10pt;color:black;"></textarea>
</div>
<br/>
<div>
<font size="3" color="black">结果: <b id="result"> </b> </font>
</div>
<br/>-->
<div>
<font size="3" color="black"> <b id="result"> </b> </font>
</div>
<br/>
<div id="div-a">
<center>
<br/>
<input type="button" value="带2个入参的方法测试" onclick="Native.testMethodWithParam1Param2('param1_value','param2_value');" />
<br/>
<br/>
<br/>
<input type="button" value="带2个入参的方法测试2" onclick="Native.testMethod(11111,'22222');" />
<br/>
<br/>
<br/>
<input type="button" value="参数为数组的方法测试" onclick="Native.testArray([11111,'22222']);" />
<br/>
<br/>
<input type="button" value="带一个参数的方法测试" onclick="Native.testLog('测试');" />
<br/>
<br/>
<input type="button" value="测试在HTML页面显示数据的" onclick="Native.testShowTextOnHtml('1234');" />
<br/>
<br/>
<!--<br/>
<input type="button" value="计算阶乘" onclick="native.calculateForJS(input.value);" />
<br/>
<br/>
<input type="button" value="测试log" onclick="log('测试');" />
<br/>
<br/>
<input type="button" value="oc原生Alert" onclick="alert('alert');" />
<br/>
<br/>
<input type="button" value="addSubView" onclick="addSubView('view');" />
<br/>
<br/>
<a id="push" href="#" onclick="native.pushViewControllerTitle('SecondViewController','secondPushedFromJS');">
push to second ViewController
</a>
<br/>-->
<br/>
</center>
</div>
</body>
</html>
----------------------------------------------------
JSDemoViewController.h
#import <UIKit/UIKit.h>
#import <JavaScriptCore/JavaScriptCore.h>
@protocol JSDemoExport <JSExport>
//JSExportAs
//(calculateForJS /** handleFactorialCalculateWithNumber 作为js方法的别名 */,
// - (void)handleFactorialCalculateWithNumber:(NSNumber *)number
//
// );
//
//- (void)pushViewController:(NSString *)view title:(NSString *)title;
-(void)testMethodWithParam1:(NSString *)param1 param2:(NSString *)param2;
-(void)testLog:(NSString *)logText;
-(void)testShowTextOnHtml:(NSString *)showText;
-(void)test:(NSNumber *)param1 method:(NSString *)param2;
-(void)testArray:(NSArray *)dataArray;
@end
@interface JSDemoViewController : UIViewController <UIWebViewDelegate, JSDemoExport>
{
UIWebView *myWebView;
JSContext *context;
}
@end
========================================================
#import "JSDemoViewController.h"
@interfaceJSDemoViewController ()
@end
@implementation JSDemoViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view.
NSString *path = [[[NSBundlemainBundle] bundlePath] stringByAppendingPathComponent:@"JSCallOC.html"];
// NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]];
// [self.webView loadRequest:request];
//NSLog(@"path >>>= %@",path);
myWebView = [[UIWebViewalloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, 400)];
myWebView.delegate = self;
NSURL *URL = [NSURL URLWithString:path];
NSURLRequest *requestww = [NSURLRequest requestWithURL:URL];
[myWebView loadRequest:requestww];
[self.view addSubview:myWebView];
//NSLog(@"webView.frame = %@",NSStringFromCGRect(webView.frame));
}
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView{
// 以 html title 设置 导航栏 title
self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
// 禁用 页面元素选择
//[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
// 禁用 长按弹出ActionSheet
//[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
// Undocumented access to UIWebView's JSContext
context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 打印异常
context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
NSLog(@"%@", exceptionValue);
};
context[@"Native"] = self; //以JSExport 协议关联 native 的方法
context[@"log"] = ^(NSString *str){//以block 形式关联 JavaScript function
NSLog(@"%@", str);
};
//
// 以 block 形式关联 JavaScript function
context[@"alert"] = ^(NSString *str) {
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"msg from js"message:str delegate:nilcancelButtonTitle:@"ok"otherButtonTitles:nil, nil];
[alert show];
};
//
__blocktypeof(self) weakSelf = self;
context[@"addSubView"] = ^(NSString *viewname) {
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(10, 500, 300, 100)];
view.backgroundColor = [UIColorredColor];
UISwitch *sw = [[UISwitch alloc]init];
[view addSubview:sw];
[weakSelf.view addSubview:view];
};
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)testArray:(NSArray *)dataArray{
NSLog(@"testArray = %@", dataArray);
}
-(void)test:(NSNumber *)param1 method:(NSString *)param2{
NSLog(@"test>>> param1 = %@, method=%@ ",param1, param2);
}
-(void)testMethodWithParam1:(NSString *)param1 param2:(NSString *)param2{
NSLog(@"testMethodWithParam1>>> param1 = %@, param2=%@ ",param1, param2);
}
-(void)testLog:(NSString *)logText{
NSLog(@"testLog>>> logText = %@ ", logText);
}
-(void)testShowTextOnHtml:(NSString *)showText{
NSString *resultText = [NSString stringWithFormat:@"%@ date=%@",showText, [NSDate date]];
NSLog(@"%@", resultText);
[context[@"showResult"] callWithArguments:@[resultText]];//回调JS的方法showResult(resultText);
}
@end
相关推荐
JavaScriptCore是iOS 7及更高版本中引入的一个框架,它使得开发者可以在Objective-C或Swift应用中直接执行JavaScript代码。这个框架极大地扩展了iOS应用的功能,特别是在处理数据、创建动态UI或者与Web服务交互时...
`JavaScriptCore-Demo-master.zip`是一个包含示例代码的压缩包,用于演示如何在iOS或macOS应用程序中使用JavaScriptCore框架。 在iOS或macOS开发中,JavaScriptCore提供了两个主要的接口:`JSContext`和`JSValue`。...
在 `ios-javascriptcore-demo` 示例应用中,可能会展示如何在用户界面(如 UIButton 或 UITableView)事件处理中使用 JavaScriptCore,或者如何将 JavaScript 作为数据处理或逻辑层的一部分。这样的设计可以简化应用...
JavaScriptCore是Apple为iOS和macOS提供的一种框架,它允许Objective-C(简称OC)应用程序与JavaScript代码进行交互。在iOS开发中,JavaScriptCore被广泛应用于实现动态内容加载、富文本编辑、以及App与Web页面之间...
这个"iOS与H5界面JSBridge交互Demo"提供了一个直观且易于理解的实例,帮助开发者快速掌握两者间的通信机制。 JSBridge是一种桥梁,它允许iOS应用中的Objective-C或Swift代码与网页中的JavaScript进行通信,实现数据...
本项目“iOS javascript engine demo project”专注于演示如何在iOS应用中集成并使用JavaScriptCore,这是Apple为iOS和macOS提供的内置JavaScript引擎。 JavaScriptCore是WebKit的一部分,它允许开发者在Objective-...
IOS7之前,接触 JS 更多的是处理UIWebView的时候,如:...但IOS7引入了JS框架<JavaScriptCore/JavaScriptCore.h>,给了“纯IOS程序员”一个枯木逢春的契机~学习强大的 JavaScript。
ios7之后,ios中加入了JavaScriptCore框架。该框架让Objective-C和JavaScript代码直接的交互变得更加的简单方便。ios 原生与js交互,demo代码,其中包括利用JSBinding简单使用!
JavaScript 与 iOS 交互 ,采用iOS 7之后 自带 JavaScriptCore实现 ,使用简单无需第三方库 Demo地址:https://github.com/GesanTung/JS2iOS
"jsdemo_iOS原生h5交互_源码"是一个示例项目,旨在展示如何实现这种交互。在这个项目中,开发者可以找到已编写好的代码,帮助理解并应用到自己的项目中。 首先,我们要了解iOS原生应用与H5交互的基本原理。通常,这...
2. **iOS7之后的JavaScriptCore.framework** 自iOS7起,Apple引入了`JavaScriptCore`框架,这是一个更强大、更安全的JS与OC交互机制。`WKWebView`替代了`UIWebView`,并提供了`WKUserContentController`来管理用户...
自iOS 7起,苹果将其引入到iPhone平台上,极大地简化了Objective-C(简称OC)与JavaScript之间的交互。这个框架使得原生应用能够直接调用JavaScript代码,反之亦然,从而在两者之间建立了一座桥梁。 首先,为了实现...
"webview学习demo"是一个专为iOS开发者设计的学习资源,它涵盖了如何在iOS应用中使用WebView以及如何实现iOS与JavaScript之间的双向通信。这个示例项目经过测试,可以免费直接运行,对于理解WebView的使用具有很高的...
这个demo为学习和实践这两种语言的交互提供了基础,对于希望进行混合应用开发的iOS开发者来说,这是一个非常有价值的参考资料。通过学习和理解这个demo,开发者可以更好地掌握如何在iOS应用中集成JavaScript,提升...
**JSPatch** 是一种动态运行时技术,它允许开发者使用 JavaScript 编写 Objective-C 的代码,并在 iOS 应用中实时执行。这种技术极大地提高了开发效率,因为它使得开发者能够在不发布新版本的情况下修复程序中的问题...
在Swift中使用ECharts通常涉及到几个关键步骤,包括引入JavaScriptCore框架、加载ECharts的JavaScript代码、处理用户交互和数据更新。 1. **引入JavaScriptCore框架**: 在Swift项目中使用ECharts,首先需要引入...
在iOS开发中,创建具有独特视觉效果的UI组件可以极大地提升...7. Web端圆形进度条实现:可能使用SVG或canvas。 了解并掌握这些知识点,开发者可以创建出富有个性和互动性的圆形进度条,提高应用程序的用户界面质量。
4. **更好的JavaScript性能**:使用独立的JavaScriptCore引擎,使得JavaScript执行效率更高。 **Hybrid开发与WKWebView的集成** Hybrid开发通常涉及以下几个关键步骤: 1. **WKWebView的初始化**:首先需要在代码...
在iOS中,JavaScriptCore是苹果提供的一个框架,允许原生应用执行JavaScript代码,并与JavaScript环境交互。它是WebKit的一部分,使得JavaScript与Objective-C或Swift的交互成为可能。在JavaScript调用OC方法时,...
10. **jsCallOC.zip**:JavaScript与Objective-C交互的示例,可能包括WKWebView的使用、JavaScriptCore框架的应用,帮助开发者理解如何在iOS中实现Web与原生代码的桥接。 通过这些源码的学习,你可以深化对iOS开发...