IOS 自带js交互(JavaScriptCore)

首先. IOS客户端经常需要和WEB一起集合,WEB的点击事件推出控制器的(虽然可以通过拦截做到)或者原生客户端需要把一些数据传给h5web端的,这时候就需要交互
1.比如h5的点击有两种写法 分别对应不同的代理方法.


方法一:
//对应代理方法一 ]
}


方法二 :对应代理方法二
  
这边注意的是 going和pushtextroom和TextRoomViewController主要这三个字段;

客户端需要这样在.h文件记得导入头文件

import

@protocol TestJSExport //制定协议 不同协议对应的代理方法名不一样
JSExportAs
(calculateForJS /** handleFactorialCalculateWithNumber 作为js方法的别名 */,

  • (void)handleFactorialCalculateWithNumber:(NSNumber *)number
    );//方法待参数
  • (void)pushtextroom:(NSString *)view;//这个view的参数就是你要推出控制器的参数
    这边得pushtextroom和h5上面按钮的要一致
    @end

@interface JSCallOCViewController : UIViewController //代理方法TextJSEport
@property (strong, nonatomic) JSContext *context;//中间交互的上下文
@end

.m
第二步//在webview加载成功的代理方法里面试下

  • (void)webViewDidFinishLoad:(UIWebView *)webView {

    self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];//固定写法

    // 打印异常
    self.context.exceptionHandler =
    ^(JSContext *context, JSValue *exceptionValue)
    {
    context.exception = exceptionValue;
    NSLog(@"%@", exceptionValue);
    };

      self.context[@"gonding"] = self;// 把自己设置为代理 扣号里面声明的要和h5的那个上面提到的一致
    

}

  • (void)handleFactorialCalculateWithNumber:(NSNumber *)number
    {

    NSNumber *result = @1000000;

    NSLog(@"%@", result);

    [self.context[@"showResult"] callWithArguments:@[result]];//result就是你要传的数据
    //这个代理方法是把数据传给h5端
    h5声明要用showrResult来接收
    h5端需要

    ......前面一些省略


    }
    另一个代理方法是推出控制器

  • (void)pushtextroom:(NSString *)view{
    NSLog(@"%@",view);

    Class second = NSClassFromString(view);
    id secondVC = [[second alloc]init];
    [self.navigationController pushViewController:secondVC animated:YES];

}

你可能感兴趣的:(IOS 自带js交互(JavaScriptCore))