本人新手,使用OC进行原生开发。根据网络上的资料,使用javascriptcore 框架进行混合开发。
在首页上使用js调用OC代码已成功,但是页面跳转后,再次js调用OC方法失效,无反应。
即在html1页面中,可以正常弹出“aaaa”,但是在html2中就无法弹出,已经排除页面错误。
跪求大神给看看。在ViewController中初始化,代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//创建UIWebView
webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
[webView retain];
//webView.delegate =self;
//显示网页视图UIWebView
[self.view addSubview:webView];
//创建URL
NSURL *URL = [NSURL URLWithString:@"http://10.14.11.39/sinoWeb/jsp/genersoft/mobile/html1.html"];
//创建NSURLRequest
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL];
//加载
[webView loadRequest:request];
JSContext *jscontext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ParamsUtil *paramsUtil = [[ParamsUtil alloc] init];
jscontext[@"ParamsUtil"] = paramsUtil;
}ParamsUtil.h类的内容:
#import <Foundation/Foundation.h>
#import "ParamsUtilExport.h"
@interface ParamsUtil : NSObject<ParamsUtilExport>@end
ParamsUtil.m类的内容:
#import "ParamsUtil.h"@implementation ParamsUtil-(NSString *)getZzTree{
return @"aaaa";
}
@end页面html1:
<html>
<head>
<title>登录</title>
<body >
<div>
<div onClick="jump();">跳转</div>
</div>
</body>
<script type="text/javascript">
function jump() {
alert(window.ParamsUtil.getZzTree());
//document.location = 'html2.html';
window.location.href='html2.html';
}
</script>
</html>页面html2:<html>
<head>
<title>登录</title>
<body >
</body>
<script type="text/javascript">
alert(window.ParamsUtil.getZzTree());
</script>
</html>
在首页上使用js调用OC代码已成功,但是页面跳转后,再次js调用OC方法失效,无反应。
即在html1页面中,可以正常弹出“aaaa”,但是在html2中就无法弹出,已经排除页面错误。
跪求大神给看看。在ViewController中初始化,代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//创建UIWebView
webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
[webView retain];
//webView.delegate =self;
//显示网页视图UIWebView
[self.view addSubview:webView];
//创建URL
NSURL *URL = [NSURL URLWithString:@"http://10.14.11.39/sinoWeb/jsp/genersoft/mobile/html1.html"];
//创建NSURLRequest
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL];
//加载
[webView loadRequest:request];
JSContext *jscontext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ParamsUtil *paramsUtil = [[ParamsUtil alloc] init];
jscontext[@"ParamsUtil"] = paramsUtil;
}ParamsUtil.h类的内容:
#import <Foundation/Foundation.h>
#import "ParamsUtilExport.h"
@interface ParamsUtil : NSObject<ParamsUtilExport>@end
ParamsUtil.m类的内容:
#import "ParamsUtil.h"@implementation ParamsUtil-(NSString *)getZzTree{
return @"aaaa";
}
@end页面html1:
<html>
<head>
<title>登录</title>
<body >
<div>
<div onClick="jump();">跳转</div>
</div>
</body>
<script type="text/javascript">
function jump() {
alert(window.ParamsUtil.getZzTree());
//document.location = 'html2.html';
window.location.href='html2.html';
}
</script>
</html>页面html2:<html>
<head>
<title>登录</title>
<body >
</body>
<script type="text/javascript">
alert(window.ParamsUtil.getZzTree());
</script>
</html>
{
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // Undocumented access
context[@"submitButton"] = ^(NSString *param1) {
[self yourObjectiveCMethod:param1];
};
}
要保证拿到的是当前页面的 Context。
JSContext *jscontext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ParamsUtil *paramsUtil = [[ParamsUtil alloc] init];
jscontext[@"ParamsUtil"] = paramsUtil;但是这样有一个问题,网页脚本中有页面加载前先执行的脚本,在这个脚本中调用 oc 对象就会出现错误,大神你是怎么处理了?
ParamsUtil *paramsUtil = [[ParamsUtil alloc] init];
jscontext[@"ParamsUtil"] = paramsUtil;
这两句写到webview的didfinishload中去,paramsUtil最好设置成成员属性
参考:http://www.yusian.com/thread-11160-1-1.html
- (void) sayGoodbye
{
dispatch_async( dispatch_get_main_queue(), ^{
UIAlertView* av = [[UIAlertView alloc] initWithTitle: @"Goodbye, World!"
message: nil
delegate: nil
cancelButtonTitle: @"OK"
otherButtonTitles: nil];
[av show];
});
}
你好,你发的git链接确实可以解决问题,但是有些看不懂
UIWebView+TS_JavaScriptContext.m中的- (void) webView: (id) unused didCreateJavaScriptContext: (JSContext*) ctx forFrame: (id<TSWebFrame>) frame方法是谁调用的,是JS调用还是Native调用的,这方法是哪个框架里面的?JavaScriptCore吗
在JavaScriptCore找了一圈没发现有- (void) webView: (id) unused didCreateJavaScriptContext: (JSContext*) ctx forFrame: (id<TSWebFrame>) frame方法,我想知道原理,苦于技术能力有限,望aixiaoxiang2008给予指教,多谢!!!