摘要:在上有這樣一個(gè)項(xiàng)目可以拿到了上下文創(chuàng)建的事件,只不過也是改獲取方法也是蘋果的私有,原來項(xiàng)目中使用了這個(gè)庫(kù)上架蘋果應(yīng)用商店沒有問題,現(xiàn)在審核情況不太了解。
前言
動(dòng)態(tài)化是移動(dòng)開發(fā)技術(shù)中的重要的一部分 ,當(dāng)前普遍的動(dòng)態(tài)化方案 , 如 React Native 、Weex 、Hybrid部分解決方案及之前流行的熱修復(fù)框架 JSPatch ,背后都用到了 JavaScriptCore 框架 ,由它建立起 OC 跟 JS 語(yǔ)言溝通的橋梁 。
JavaScriptCore 介紹
JavaScriptCore 是 Safari 瀏覽器 JavaScript 引擎 ,它用來解釋和執(zhí)行 JavaScript 代碼 。
JavaScriptCore 框架是一個(gè)蘋果在 iOS7 引入的框架 ,該框架讓 Objective-C 和 JavaScript 代碼直接的交互變得更加的簡(jiǎn)單方便 ,其實(shí)就是基于 webkit 中以C/C++實(shí)現(xiàn)的 JavaScriptCore 的一個(gè) OC 版本的封裝 。
JavaScriptCore 和 JavaScriptCore 框架是不同的兩個(gè)概念 ,可以自己理解下 。
OC 調(diào)用 JS 代碼
// 直接執(zhí)行js代碼 JSContext *cxt = [JSContext new]; JSValue *val = [cxt evaluateScript:@"(function ocCallJS() { return "ocCallJS"})()"]; NSLog(@"%@",[val toString]); // ocCallJS // 注冊(cè)js方法,利用JSValue調(diào)用 JSContext *cxt = [JSContext new]; JSValue *jsFunction = [cxt evaluateScript:@" (function(arg) { return arg })"]; JSValue *val = [jsFunction callWithArguments:@[@"hello objc"]]; NSLog(@"%@",[val toString]); // hello objc
這里有幾個(gè)對(duì)象理解下
JSContext
JSContext 對(duì)象表示 JavaScript 執(zhí)行環(huán)境 ,所有 JavaScript 執(zhí)行發(fā)生在上下文 , 所有 JavaScript 值中與上下文聯(lián)系在一起 。
JSValue
JSValue 實(shí)例是對(duì) JavaScript 值的包裝 ( 引用 ) ,您可以使用 JSValue 類在 JavaScript 和 Objective-C 或 Swift 表示之間轉(zhuǎn)換基本值(例如數(shù)字和字符串),以便在本機(jī)代碼和 JavaScript 代碼之間傳遞數(shù)據(jù)。您還可以使用此類創(chuàng)建 JavaScript 對(duì)象,這些對(duì)象包含自定義類或 JavaScript 函數(shù)的本機(jī)對(duì)象,這些函數(shù)的實(shí)現(xiàn)由本機(jī)方法或塊提供。
JS 調(diào)用 OC 代碼
Block 方式
// 注冊(cè)一個(gè) oc 方法給 js 調(diào)用 JSContext *cxt = [JSContext new]; cxt[@"nativeMethod"] = ^(NSString *msg) { NSLog(@"%@",msg); // jsCallOC }; // js 調(diào)用 oc 的方法 [cxt evaluateScript:@"nativeMethod("jsCallOC")"];
JSExport方式
// 定義類 暴露給 js @protocol JSBridgeObjProtocol- (NSString *)fetchArticleContent; @end @interface JSBridgeObj : NSObject @property (nonatomic, copy) NSString *articleTitle; - (NSString *)fetchArticleContent; @end @implementation JSBridgeObj - (NSString *)fetchArticleContent { return @"js call oc"; } @end // js 調(diào)用 oc 方法 JSContext *cxt = [JSContext new]; cxt[@"jsBridge"] = [JSBridgeObj new]; JSValue *val = [cxt evaluateScript:@"jsBridge.fetchArticleContent()"]; NSLog(@"%@",[val toString]); // js call oc
JXExport 實(shí)現(xiàn)的協(xié)議將 OC 類及其實(shí)例方法,類方法和屬性導(dǎo)出到 JavaScript 代碼
這樣基于 JSContext 我們可以完成兩種語(yǔ)言間通信
Hybrid 中的應(yīng)用
APP 混合開發(fā)中 ,在 UIWebView 中獲取 JSContext 對(duì)象 ,該操作借用了蘋果的私有方法 。
// 獲取當(dāng)前 WebView 的 JS 上下文 JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
不過該方法獲取 JS 上下文有幾個(gè)問題:
1 ) 獲取 JS 上下文的時(shí)機(jī)不確定 ,比如創(chuàng)建 UIWebView 對(duì)象 ,UIWebView 不同代理回調(diào)方法中獲取到 JS 上下文都是不一樣的 ,而且每次加載一個(gè)新的 URL 時(shí) , 都會(huì)廢棄舊的 JS 上下文 ,創(chuàng)建新的 JS 上下文 。
因此獲取 JS 上下文的時(shí)間點(diǎn)很重要 ,也就是在剛剛創(chuàng)建好新的 JS 上下文那一刻 。
只不過蘋果并沒有在 iOS 的 SDK 中暴露出來 ,而 macOS 的 SDK 中有獲取創(chuàng)建好的 JS 上下文的代理方法。
webView:didCreateJavaScriptContext:forFrame:
在 GitHub 上有這樣一個(gè)項(xiàng)目 TS_JavaScriptContext 可以拿到了 JS 上下文創(chuàng)建的事件 ,只不過也是改獲取方法也是蘋果的私有 API , 原來項(xiàng)目中使用了這個(gè)庫(kù)上架蘋果應(yīng)用商店沒有問題 ,現(xiàn)在審核情況不太了解 。
2 ) WKWebView 目前我還沒有找到獲取 JS 上下文的方法
在 UIWebView 中獲取 JS 上下文的方法在 WKWebView 中是不起作用的 。
WKWebView 不支持 JavaScriptCore 的方式, 但提供 messagehandler 的方式為 JS 與 OC 通信 。關(guān)于 WKWebView 相關(guān)知識(shí) ,后續(xù)再聊 。
歡迎關(guān)注公眾號(hào):dreamlee,你的成長(zhǎng)我們一起見證!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/103839.html
摘要:可嵌入動(dòng)態(tài)文本于頁(yè)面,對(duì)瀏覽器事件作出響應(yīng),讀寫元素,控制等。年月,發(fā)布了一款面向普通用戶的新一代的瀏覽器版,市場(chǎng)份額一舉超過。網(wǎng)景將這門語(yǔ)言作為標(biāo)準(zhǔn)提交給了歐洲計(jì)算機(jī)制造協(xié)會(huì)。線程和的并發(fā)執(zhí)行都是線程安全的。后面會(huì)詳細(xì)講解對(duì)象類型的轉(zhuǎn)換。 本文由云+社區(qū)發(fā)表作者:殷源,專注移動(dòng)客戶端開發(fā),微軟Imagine Cup中國(guó)區(qū)特等獎(jiǎng)獲得者 JavaScript越來越多地出現(xiàn)在我們客戶端開...
摘要:代碼在本文最后,首先是,編譯出字節(jié)碼耗時(shí)約,運(yùn)行字節(jié)碼耗時(shí)約,。也有解釋過程,字節(jié)碼需要由虛擬機(jī)解釋執(zhí)行。而引擎的做法是更接近二哥的,在編譯階段的過程是源碼抽象語(yǔ)法樹字節(jié)碼中間代碼。于是大量的字節(jié)碼優(yōu)化措施被延后,比如。 簡(jiǎn)單性能測(cè)試 首先,我們先來做一個(gè)簡(jiǎn)單的性能測(cè)試,對(duì)比一下Java,JavaScript,PHP,Ruby這四門語(yǔ)言。這個(gè)性能測(cè)試,是計(jì)算斐波那契數(shù)列(兔子數(shù)列)。比...
閱讀 2874·2021-11-24 09:38
閱讀 3511·2021-11-23 09:51
閱讀 967·2021-09-09 11:52
閱讀 4032·2021-08-11 11:18
閱讀 1106·2019-08-30 14:05
閱讀 3228·2019-08-30 11:23
閱讀 1760·2019-08-29 17:02
閱讀 1123·2019-08-26 13:49