美文网首页
OC和JS交互

OC和JS交互

作者: 第1001号群众演员 | 来源:发表于2016-11-07 21:24 被阅读125次
    1.   OC和JS交互有三种方式:UIWebView(WKWebView)、JavaScriptCore、WebViewJavascriptBridge
      
    2.   UIWebView (WKWebView):
      

    a) UIWebView

                     i.           OC调用JS:实例化UIWebView,设置代理,loadRequest加载URL,实现代理方法:-(void)webViewDidFinishLoad:(UIWebView *)webView ,加载完成是调用,完之后调用该方法,执行JS        - (nullable NSString)stringByEvaluatingJavaScriptFromString:(NSString )script;
    
                    ii.           JS调用OC:拦截UIWebView上的所有网络请求:-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType; 判断request.URL.absoluteString;是否我们自定义的那个,然后解析URL执行不同的OC操作。
    

    b) WKWebView:是IOS8出来的,Xcode8之后,注定淘汰UIWebView,使用WKWebView。支持更多的HTML5特性,官方宣称达到60fps的滚动帧率,才分了UIWebView,更加容易使用,占用更小的内存(UIWebView内存占用超高,内存泄漏等问题)。WKUIDelegate和WKNavigationDelegate。WKNavigationDelegate主要处理一些跳转、加载处理操作,WKUIDelegate主要处理JS脚本,确认框,警告框等。WKWebView 来说是不支持直接与JavaScriptCore 交互的。通常采取 WKUserContentController 采用它的协议方法

    c) 常用方法:

                     i.           加载网页:[wkWebView loadRequest:request];
    
                    ii.           OC调用JS:- (void)evaluateJavaScript:(NSString*)javaScriptString completionHandler:(void (^ __nullable)(__nullable id,NSError * __nullable error))completionHandler;
    
                   iii.           JS调用OC:初始化的时候,设置config参数:
    
    1. WKWebViewConfiguration*config = [[WKWebViewConfiguration alloc] init]; //创建配置

    2. WKUserContentController*userContent = [[WKUserContentController alloc] init];//创建UserContentController(提供javaScript向webView发送消息的方法)

    3. [userContentaddScriptMessageHandler:self name:@"NativeMethod"];//添加消息处理,注意:self指代的是需要遵守WKScriptMessageHandler协议,结束时需要移除

    4. config.userContentController= userContent;//将UserContentController设置到配置文件

    5. _wkView =[[YXWKView alloc] initWithFrame:self.view.bounds configuration:config];//实例化WKWebView的时候传入config

    6. -(void)userContentController:(WKUserContentController *)userContentControllerdidReceiveScriptMessage:(WKScriptMessage *)message //js调用后,这里捕获

    7. JavaScriptCore:iOS7引入,把 WebKit 的JavaScript 引擎用 Objective-C 封装,提供了简单,快速以及安全的方式接入。(配合UIWebView使用)

    JS执行的环境,同时也通过JSVirtualMachine管理着所有对象的生命周期,每个JSValue都和JSContext相关联并且强引用context。

    import "JSContext.h"

    JS对象在JSVirtualMachine中的一个强引用,其实就是Hybird对象。我们对JS的操作都是通过它。并且每个JSValue都是强引用一个context。同时,OC和JS对象之间的转换也是通过它

    import "JSValue.h"

    JS和OC对象的内存管理辅助对象。由于JS内存管理是垃圾回收,并且JS中的对象都是强引用,而OC是引用计数。如果双方相互引用,势必会造成循环引用,而导致内存泄露。我们可以用JSManagedValue保存JSValue来避免。

    import "JSManagedValue.h"

    JS运行的虚拟机,有独立的堆空间和垃圾回收机制。

    import "JSVirtualMachine.h"

    一个协议,如果JS对象想直接调用OC对象里面的方法和属性,那么这个OC对象只要实现这个JSExport协议就可以了。

    import"JSExport.h"

    JS调用OC

    方法1: JS调用OC在加载完成的方法里通过JSContext来获取相应操作的key值.key值是html文件里点击方法的名字,并且调用你需要的操作

    JSContext*context = [self.webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    context[@"jsButton"] = ^{/操作/};

    方法2: JSExport 提供一个将OC 中的类、实例方法和属性等导出为 JavaScript 函数的方法。只有一个方法:JSExportAs(PropertyName, Selector)

    OC调用JS:

    方法1:[[JSContext currentContext] evaluateScript:jsStr];

    方法2:[context[@"payResult"]callWithArguments:@[@"支付弹窗"]];

    1. WebViewJavascriptBridge

    a) 创建UIWebView,不要设置代理,创建WebViewJavascriptBridge的时候代理赋值给它了

    b) 创建WebViewJavascriptBridge,

    c) 注册方法:- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler该方法有两个参数:第一个参数handlerName,是对这个功能起的一个别名;第二个参数handler,是个block,也就是Native实现的功能。JS要调用的Native 实现其实就是block 的 {} 内的代码功能。为了便于维护,我们可以将JS要调用的Native方法都集中到一起,然后单个功能再封装一个方法。

    d) HTML 中有一个必须要添加的JS 方法,然后需要自动调用一次该方法。该方法是:function setupWebViewJavascriptBridge(callback) {}这个方法的作用主要是在第一次加载HTML的时候起作用,目的是加载一次wvjbscheme://BRIDGE_LOADED,来触发往HTML中注入一些已经写好的JS方法。

    e) 调用OC代码:利用之前注入的JS方法callHandler 就可以调用Native 功能了。WebViewJavascriptBridge代码已经注入到JS了

    f) 调用JS代码:callHandler

    相关文章

      网友评论

          本文标题:OC和JS交互

          本文链接:https://www.haomeiwen.com/subject/dioouttx.html