知识点1:
self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
后面的ocumentView.webView.mainFrame.javaScriptContext 这个似乎是固定的,可以写成为一个常量,以为在js代码执行的时候都会有这个内容;这个是在使用JSC(javascriptcore)时。
如果对这个变量进行修改,可能会发生错错误如下;
2017-07-26 11:30:14.524875+0800 testJavascriptCore[12808:3733652] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIWebView 0x102713c70> valueForUndefinedKey:]: this class is not key value coding-compliant for the key sudf.'
——————————————
知识点2:javascript中的JSContext传输数据可以有两种方式:block和JSExport协议
通过block可以直接讲某个功能的函数,注入给JSContext,使其调用,但要注意内存泄露
通过继承JSExport协议,可以将OC的方法,属性注入给JSContext,然后调用;
似乎使用JSExport的方法比较多
——————————————
知识点3: 内存管理(oc & js)
Objective-C的内存管理机制是引用计数,JavaScript的内存管理机制是垃圾回收。在大部分情况下,JavaScriptCore能做到在这两种内存管理机制之间无缝无错转换,但也有少数情况需要使用到JSManagedValue对象解决,后面会给出对应链接。
——————————————
知识点4:WKWebView
iOS 8 引入WKWebView, WKWebView 不支持JavaScriptCore的方式但提供message handler的方式为JavaScript 与Objective-C 通信.
——————————————
知识点5: WebViewJavascriptBridge 类中的js;解决js格式,可以换行
为了格式化,作者用了个宏#define wvjb_js_func(x) #x, 确实是个解决定义字符串不能换行问题的好办法. 结束的时候去掉宏定义: #undef wvjb_js_func
知识点6: ios实现js调用oc
格式,注入传入的方法名或者说是label也要是字符串
网友评论