麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

OC與JS交互之JavaScriptCore

2019-11-09 15:13:12
字體:
來源:轉載
供稿:網友

轉載自:http://www.cnblogs.com/markstray/p/5757255.html

javaScriptCore提供了Javascript和Objective-C橋接的Obj-C API。JavaScriptCore提供了讓我們脫離UIWebView執行JavaScript腳本的能力,以及使用現代的Objective-C語法(例如Blocks和下標)在Objective-C和JavaScript之間無縫的傳遞值或者對象。借助JavaScriptCore,我們只需要很少的代碼就可以完成OC與JS的交互通信,下面讓我們一睹它的風采。同樣,這篇文章會用JavaScriptCore有關API重寫上一篇文章

一、JavaScriptCore概述

使用JavaScriptCore需要導入頭文件”#import

#import "JSContext.h"#import "JSValue.h"#import "JSManagedValue.h"#import "JSVirtualMachine.h"#import "JSExport.h"

JSContext: 代表JavaScript的運行環境,創建JSContext后,可以來執行JavaScript代碼。

JSValue: 代表JavaScript實體,一個JSValue可以是JavaScript中的任意類型:字符串和數字;數組、對象和方法;甚至錯誤和特殊的 JavaScript 值諸如 null 和 undefined。任何JSContext的值都被包裹在一個JSValue對象中。

JSManagedValue: 本質上是一個JSValue,用來處理內存管理中的一些特殊情形,它能幫助OC引用技術和JS垃圾回收這兩種內存管理機制之間進行正確的轉換。

JSExport: 這是一個協議,可以用這個協議來將原生對象導出給JavaScript,這樣原生對象的屬性或方法就成為了JavaScript的屬性或方法。

JSVirtualMachine: 代表一個對象空間,擁有自己的堆結構和垃圾回收機制,是運行JS代碼的基礎。大部分情況下不需要和它直接交互,除非要處理一些特殊的多線程或者內存管理問題。

回到頂部 二、JavaScriptCore深入

方法調用

a. OC調用JS

//使用UIWebView執行js腳本的方法- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;//使用JSContext執行js腳本的方法- (JSValue *)evaluateScript:(NSString *)script;//使用JSValuet執行js腳本的方法- (JSValue *)callWithArguments:(NSArray *)arguments;

b. JS調用OC

有兩種方式:block和JSExport協議

通過block可以直接講某個功能的函數,注入給JSContext,使其調用,但要注意內存泄露

通過繼承JSExport協議,可以將OC的方法,屬性注入給JSContext,然后調用

錯誤處理

當JavaScript運行時出現異常,會回調JSContext的exceptionHandler中設置的Block,然后在OC端進行錯誤處理

context.exceptionHandler = ^(JSContext *context, JSValue *exception) { NSLog(@"JS Error: %@", exception);};內存管理

Objective-C的內存管理機制是引用計數,JavaScript的內存管理機制是垃圾回收。在大部分情況下,JavaScriptCore能做到在這兩種內存管理機制之間無縫無錯轉換,但也有少數情況需要使用到JSManagedValue對象解決,后面會給出對應鏈接。

回到頂部 三、使用JavaScriptCore重寫

沿用之前的示例,其他地方均無改動,只修改了兩邊交互的相關代碼:

OC端:

初始化JScontextself.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];注入JS代碼__block typeof(self) weakSelf = self;//JS調用OC方法列表self.jsContext[@"showMobile"] = ^ { dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf showMsg:@"我是下面的小紅 手機號是:18870707070"]; });};self.jsContext[@"showName"] = ^ (NSString *name) { dispatch_async(dispatch_get_main_queue(), ^{ NSString *info = [NSString stringWithFormat:@"你好 %@, 很高興見到你",name]; [weakSelf showMsg:info]; });};void (^_showSendMsg) (NSString *num, NSString *msg) = ^ (NSString *num, NSString *msg) { dispatch_async(dispatch_get_main_queue(), ^{ NSString *info = [NSString stringWithFormat:@"這是我的手機號: %@, %@ !!",num,msg]; [self showMsg:info]; });};[self.jsContext setObject:_showSendMsg forKeyedSubscript:@"showSendMsg"];執行JS端代碼//OC調用JS方法列表- (IBAction)btnClick:(UIButton *)sender { if (sender.tag == 123) { //使用jsContext [self.jsContext evaluateScript:@"alertMobile()"]; } if (sender.tag == 234) { //使用webView [self.webView stringByEvaluatingJavaScriptFromString:@"alertName('小紅')"]; } if (sender.tag == 345) { //使用jsValue JSValue *jsValue = [self.jsContext objectForKeyedSubscript:@"alertSendMsg"]; [jsValue callWithArguments:@[@"18870707070",@"周末爬山真是件愉快的事情"]]; }}

JS端:

//提供給OC調用JS的方法列表function alertMobile() { alert('我是上面的小黃 手機號是:13300001111')}function alertName(msg) { alert('你好 ' + msg + ', 我也很高興見到你')}function alertSendMsg(num,msg) { alert('這是我的手機號:' + num + ',' + msg + '!!')}//JS響應方法列表function btnClick1() { showMobile()}function btnClick2() { showName('xiaohuang')}function btnClick3() { showSendMsg('13300001111', 'Go Climbing This Weekend !!!')}

了解過JavaScriptCore的原理及核心文件,核心類的作用,再過來上手重寫,已經沒有什么什么阻礙了,但是仍然有需要注意的地方。因為JavaScript是單線程的,在JS調用OC的代碼都是在線程中執行的,所以和界面相關操作我們需要切換到主線程來刷新,其他流程和之前保持一致,學習這一部分參考了很多其他資料,文章后面給出了有關JavaScriptCore的介紹和實現原理解析的文章鏈接,有興趣的同學可以傳送之深入學習

四、后記

蘋果的技術每年都會更新,在JavaScript這一塊,每年也會出現新的驚喜,iOS8發布的時候,蘋果又推出了WKWebView,對之前的UIWebView進行了一次脫胎換骨的重構(將UIWebView和UIWebViewDelegate重構成了14個類和3個協議),功能也更加完善和強大,穩定性和性能也明顯提高。之前看到過一篇文章,詳細介紹了WKWebView的相關API,對我了解這一模塊提供了很大的幫助,后面我也系統的看完了整個WKWebView的API,受益匪淺,看的時候,我沒有直接過去看這篇文章,而是先自己通讀API然后對比這篇文章,查看理解方面的出入,同時也加深了印象,同學們也可以借鑒這種方式。下一篇文章,我們使用WKWebView的相關API來完成這個示例

戳這里:本文的DEMO地址歡迎star

參考資料(戳這里):

http://nshipster.cn/javascriptcore/

https://hjgitbook.gitbooks.io/ios/content/04-technical-research/04-javascriptcore-note.html

JavaScriptCore實現的原理解析系列


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美一级精品片在线看 | 一级做a爱片久久毛片a高清 | sesee99| 欧美福利视频一区二区 | 国产交换3p国产精品 | 黄色片网站免费在线观看 | 精品国产99久久久久久宅男i | 久草在线高清 | xxxⅹ96日本护士hd | 久久精品亚洲精品国产欧美kt∨ | 国产1区视频 | 亚洲婷婷日日综合婷婷噜噜噜 | 国产精品午夜未成人免费观看 | 婷婷一区二区三区 | 一区二区视 | 国产精品一区二区视频 | 国产成人精品一区在线播放 | 久久久国产精品视频 | aa国产视频一区二区 | 亚洲欧美在线视频免费 | 免费黄色在线观看网站 | 欧美国产日韩在线观看成人 | 日本不卡一区二区三区在线 | 欧美视频一级 | 欧美a v在线 | 久久免费毛片 | 国产女做a爱免费视频 | 黄视频网站免费 | 中文字幕国 | 久久最新视频 | 色天天综合网 | www日韩在线观看 | chinese中国真实乱对白 | 亚洲九色 | 一级电影免费 | 国产午夜精品久久久久久免费视 | 噜噜噜影院 | 欧美一级美国一级 | 视频一区二区三区在线播放 | 精品在线观看一区二区三区 | xxxⅹ96日本护士hd |