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