本人新手,使用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>

解决方案 »

  1.   

    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        JSContext *context =  [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // Undocumented access
        context[@"submitButton"] = ^(NSString *param1) {
            [self yourObjectiveCMethod:param1];
        };
    }
    要保证拿到的是当前页面的 Context。
      

  2.   

    我自己来解答了,网页加载完成后注入对象, 告诉前端网页加载完成后再给js对象赋值,要保证前端已经得到了你的js对象
      

  3.   

    楼主现在问题解决了吗,我现在遇到同样的问题,使用webviewJavaScriptBridge,也是在html5页面登录跳转后 js调不了OC方法,如果方便加Q请教。
      

  4.   

    '大神能详细说明一下吗?我是在finishload 里面
    JSContext *jscontext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        ParamsUtil *paramsUtil = [[ParamsUtil alloc] init];
        jscontext[@"ParamsUtil"] = paramsUtil;但是这样有一个问题,网页脚本中有页面加载前先执行的脚本,在这个脚本中调用 oc 对象就会出现错误,大神你是怎么处理了?
      

  5.   

    http://stackoverflow.com/questions/21714365/uiwebview-javascript-losing-reference-to-ios-jscontext-namespace-object
      

  6.   

    http://stackoverflow.com/questions/21714365/uiwebview-javascript-losing-reference-to-ios-jscontext-namespace-object
      

  7.   

    你只在UIWebView初始化注入了一次,如果页面刷新或跳转,JS同样被刷新了,新的页面中没有你注入的标识,所以调用不到,解决办法是把
    ParamsUtil *paramsUtil = [[ParamsUtil alloc] init];
        jscontext[@"ParamsUtil"] = paramsUtil;
    这两句写到webview的didfinishload中去,paramsUtil最好设置成成员属性
    参考:http://www.yusian.com/thread-11160-1-1.html 
      

  8.   

    楼主这里有你想要的答案https://github.com/axxapp/UIWebView-TS_JavaScriptContext可以在正确的时间点获取JavaScriptContex 获取这个值, 我亲测 跳转之后也可以获取。不知这100分还能给不,呵呵。
      

  9.   

    再补充一下 UIWebView 里面的 JavaScriptContext 这个对象, 每个页面一个,发生跳转的时候会把前页面的JavaScriptContext 释放掉,加载新页面,然后为新页面再创建一个JavaScriptContext。也就是 JavaScriptContext 与 UIWebView 对象无关,与当前加载的网页有关。JavaScriptContext 创建时机apple 没有在 UIWebViewDelegate 提供,一个 UIWebView 在第一次价载网页的时候,可以在webViewDidFinishLoad 等事件里赋值,js也可以获取的到,但在同一个UIWebView做跳转的化久显得有点诡异,明明获取了JavaScriptContext 并设置了我们的值,为神马js获取不到,这些都是apple没有公开JavaScriptContext创日记的原因,我们第二次获取的可能是前页面的,而不是新页面的。UIWebView多次页面跳转,有些资源是供用的,有些不是。JavaScriptContext 就不是,什么时候创建的不知道。 希望对你有帮助
      

  10.   

    我给的 github 需要改一个地方 ,不然有错误,就是非ui线程 操作 ui把 :  TSViewController.m 页面里面的, 因为 sayGoodbye 是从 js线程里面调用oc的方法,要操作ui需要切到ui主线程里面
    - (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];
        });
    }
      

  11.   


    你好,你发的git链接确实可以解决问题,但是有些看不懂
    UIWebView+TS_JavaScriptContext.m中的- (void) webView: (id) unused didCreateJavaScriptContext: (JSContext*) ctx forFrame: (id<TSWebFrame>) frame方法是谁调用的,是JS调用还是Native调用的,这方法是哪个框架里面的?JavaScriptCore吗
      

  12.   


    在JavaScriptCore找了一圈没发现有- (void) webView: (id) unused didCreateJavaScriptContext: (JSContext*) ctx forFrame: (id<TSWebFrame>) frame方法,我想知道原理,苦于技术能力有限,望aixiaoxiang2008给予指教,多谢!!!