亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

OC與JS交互之JavaScriptCore

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

轉載自: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實現的原理解析系列


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产一区av| 这里只有精品久久| 久久精品91久久香蕉加勒比| 一区二区三区四区视频| 91精品国产综合久久男男| 亚洲电影免费观看高清完整版在线观看| 国产精品久久久久久久久久东京| 国产自产女人91一区在线观看| 欧美在线一区二区三区四| 欧美黄色片在线观看| 亚洲iv一区二区三区| 久久男人的天堂| 亚洲最大成人在线| 久久久久久久久久国产| 5566成人精品视频免费| 51色欧美片视频在线观看| 国产精品久久久久久久久久免费| 国产精品自产拍高潮在线观看| 欧美成人精品一区二区| 久久国产天堂福利天堂| 日韩精品免费综合视频在线播放| 久久精品国产一区二区三区| 日本高清视频一区| 97婷婷大伊香蕉精品视频| 久久精视频免费在线久久完整在线看| 欧美午夜美女看片| 日韩欧美在线看| 亚洲视频第一页| 97超级碰碰人国产在线观看| 国产一区二区三区毛片| 欧美激情在线一区| 日韩午夜在线视频| 国内精品视频一区| 亚洲欧美日韩另类| 91精品国产综合久久香蕉922| 欧美性xxxxxxxxx| 国产精品亚洲视频在线观看| 欧美主播福利视频| 欧美区在线播放| 国产精品亚洲一区二区三区| 亚洲午夜性刺激影院| 欧美激情在线播放| 国产精品pans私拍| 视频直播国产精品| 亚洲女在线观看| 国产精品极品尤物在线观看| 国产精品久久久久av| 精品久久久久久中文字幕大豆网| 欧美中文字幕在线播放| 欧美另类69精品久久久久9999| 亚洲一区二区久久久| 亚洲午夜av电影| 国产精品免费视频久久久| 日韩在线免费视频| 91色精品视频在线| 国产精品日韩欧美| 国产精品久久久久久久一区探花| 欧美在线观看网址综合| 亚洲高清av在线| 亚洲视频在线看| 日韩在线免费av| 4438全国成人免费| 久久久www成人免费精品| 日韩黄色av网站| 日韩专区在线播放| 日韩av在线免费观看| 国产一区二区视频在线观看| zzijzzij亚洲日本成熟少妇| 91精品久久久久久久久久久| 国产精品aaa| 538国产精品一区二区在线| 成人精品视频久久久久| 91在线直播亚洲| 国产精品视频在线播放| 中文字幕亚洲在线| 欧美精品videos| 精品色蜜蜜精品视频在线观看| 永久免费毛片在线播放不卡| 国产一区二区三区免费视频| 久久久亚洲欧洲日产国码aⅴ| 国产精品88a∨| 国产精品黄色影片导航在线观看| 一本色道久久88精品综合| 亚洲精品久久久久中文字幕二区| 久久男人av资源网站| 久久免费视频这里只有精品| 亚洲va久久久噜噜噜久久天堂| 亚洲影院在线看| 91wwwcom在线观看| 亚洲国产日韩欧美综合久久| 草民午夜欧美限制a级福利片| 欧美性猛交xxxxx水多| 久久99久国产精品黄毛片入口| 国产亚洲精品美女久久久久| 日韩在线观看你懂的| 色999日韩欧美国产| 亚洲精品久久久久中文字幕欢迎你| 亚洲国产精品悠悠久久琪琪| 国内伊人久久久久久网站视频| 亚洲老板91色精品久久| 亚洲国产一区二区三区四区| 欧美大片欧美激情性色a∨久久| 亚洲香蕉av在线一区二区三区| 欧美视频中文字幕在线| 亚洲精品视频二区| 97在线看免费观看视频在线观看| 欧美精品免费播放| 久久伊人精品视频| 91久久久久久久久久久久久| 国产精品看片资源| 亚洲精品中文字| 国外成人免费在线播放| 成人国产精品av| 日韩av免费在线| 色噜噜狠狠色综合网图区| 国产日韩精品综合网站| 98精品国产自产在线观看| 在线观看成人黄色| 中文字幕日韩专区| 成人国产精品av| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美特级www| 久久精品青青大伊人av| 欧美日韩日本国产| 国产狼人综合免费视频| 美女啪啪无遮挡免费久久网站| 91福利视频在线观看| 色综合91久久精品中文字幕| 欧美成人久久久| 成人激情春色网| 日韩av影片在线观看| 尤物tv国产一区| 久久精品国产精品亚洲| 国产成人精品在线播放| 日本高清不卡在线| 在线视频日韩精品| 亚洲人成人99网站| 欧美剧在线观看| 成人激情在线观看| 国模精品视频一区二区三区| 亚洲男人的天堂在线| 日韩欧美在线第一页| 亚洲aⅴ日韩av电影在线观看| 高跟丝袜一区二区三区| 欧美精品免费看| 欧美日韩亚洲视频一区| 欧美裸体视频网站| 久久久精品2019中文字幕神马| 国产精品女人网站| 亚洲精品电影在线| 国产日韩中文字幕| 欧美精品激情在线观看| 久久99久久99精品免观看粉嫩| 久久成人18免费网站| 日韩精品免费看| zzjj国产精品一区二区| 亚洲全黄一级网站| 国产精品成人一区二区三区吃奶| 中文字幕无线精品亚洲乱码一区| 91人成网站www| 日本不卡高字幕在线2019| 姬川优奈aav一区二区| 国内精品久久久久久中文字幕| 日韩一区视频在线|