国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScriptCore 使用

張遷 / 682人閱讀

摘要:在上有這樣一個(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

相關(guān)文章

  • JavaScriptCore全面解析

    摘要:可嵌入動(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)在我們客戶端開...

    OnlyMyRailgun 評(píng)論0 收藏0
  • 用最簡(jiǎn)單易懂的道理告訴你,為什么JavaScript在現(xiàn)代引擎(V8,JavaScriptCore

    摘要:代碼在本文最后,首先是,編譯出字節(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ù)列)。比...

    Moxmi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<