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

首頁 > 編程 > 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實現的原理解析系列


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美亚洲综合| 欧美成人精品一区二区三区| 中日韩美女免费视频网址在线观看| 国产精品视频免费观看www| 一本色道久久88综合日韩精品| 久久精品国产一区二区三区| 久久夜色撩人精品| 国语自产精品视频在线看抢先版图片| 亚洲美女av黄| 亚洲人精选亚洲人成在线| 精品美女永久免费视频| 一本色道久久综合狠狠躁篇怎么玩| 亚洲精品中文字幕av| 国产亚洲人成a一在线v站| 欧美日韩在线免费观看| 一夜七次郎国产精品亚洲| 亚洲精品国偷自产在线99热| 欧美专区福利在线| 日韩精品中文字幕在线观看| 成人妇女淫片aaaa视频| 日韩亚洲精品电影| 成人黄色影片在线| 国产成人一区二区在线| 国产精品高清在线观看| 精品久久国产精品| 国产精品久久久久999| www日韩中文字幕在线看| 国产精品ⅴa在线观看h| 国产精品亚洲综合天堂夜夜| 亚洲精品电影网| 国产999精品| 久久精品国亚洲| 2019国产精品自在线拍国产不卡| 久久久久久久999| 日韩一区二区三区xxxx| 精品网站999www| 久久精品亚洲一区| 日韩av在线资源| 亚洲激情成人网| 97国产真实伦对白精彩视频8| 欧美体内谢she精2性欧美| 日韩av电影在线免费播放| 日本欧美一二三区| 久久久黄色av| 国产精品日韩av| 91老司机精品视频| 久久伊人精品视频| 91极品女神在线| 欧美一区三区三区高中清蜜桃| 色狠狠久久aa北条麻妃| 日韩在线视频网| 国产综合在线视频| 在线播放日韩精品| 亚洲一区二区三区视频播放| 美女国内精品自产拍在线播放| 亚洲欧美在线播放| 国产美女精品视频免费观看| 国产91在线高潮白浆在线观看| 欧美在线性爱视频| 7777免费精品视频| 国产一区欧美二区三区| 夜夜嗨av一区二区三区四区| 欧美一级bbbbb性bbbb喷潮片| 国产一区在线播放| 91高清视频在线免费观看| 九九九久久国产免费| 最近2019中文字幕第三页视频| 日韩中文字幕在线免费观看| 日韩日本欧美亚洲| 欧美日韩激情美女| 欧美日韩美女在线观看| 操91在线视频| 97碰在线观看| 日韩亚洲在线观看| 精品香蕉在线观看视频一| 亚洲国产女人aaa毛片在线| 日本在线精品视频| 欧美黑人xxx| 亚洲精品电影在线| 在线观看国产精品日韩av| 91精品在线一区| 亚洲精品一区av在线播放| 欧美黄色片免费观看| 欧美国产日韩在线| 亚洲影院污污.| 日韩禁在线播放| 九九热这里只有精品6| 欲色天天网综合久久| 中文字幕成人精品久久不卡| 国产欧美精品久久久| 国产一区二区三区视频免费| 在线播放精品一区二区三区| 亚洲专区中文字幕| 热re91久久精品国99热蜜臀| 欧美日韩在线免费| 欧美另类69精品久久久久9999| 欧美精品久久久久久久久| 亚洲欧美综合v| 国产欧美韩国高清| 国产精品流白浆视频| 日韩中文在线视频| 亚洲一区精品电影| 欧美激情国产日韩精品一区18| 国产精品精品视频| 国产成人精品免高潮费视频| 91久久国产精品91久久性色| 精品国产一区二区三区在线观看| 日韩电影中文字幕av| 久久久中文字幕| 97视频在线观看亚洲| 成人国产精品日本在线| 久久影院免费观看| 久久伊人精品一区二区三区| 色爱av美腿丝袜综合粉嫩av| 成人国产在线激情| 亚洲国产天堂网精品网站| 午夜精品99久久免费| 亚洲欧洲国产伦综合| 国产欧美日韩高清| 日韩在线欧美在线国产在线| 亚洲免费影视第一页| 亚洲偷欧美偷国内偷| 欧美精品videos| 亚洲精品v天堂中文字幕| 欧美日本中文字幕| 国产在线观看一区二区三区| 91美女片黄在线观看游戏| 另类美女黄大片| 成人免费大片黄在线播放| 26uuu亚洲国产精品| 久久久精品亚洲| 日韩国产高清视频在线| 日韩av网站在线| 色综合91久久精品中文字幕| 91亚洲精品在线| 欧美午夜激情视频| 国产精品扒开腿做| 亚洲国产欧美一区二区丝袜黑人| 91国产精品视频在线| 久久久国产精品x99av| 精品av在线播放| 欧美乱大交xxxxx另类电影| 亚洲三级黄色在线观看| 黑人极品videos精品欧美裸| 久久综合久中文字幕青草| 欧美日韩免费观看中文| 亚洲视频网站在线观看| 国内外成人免费激情在线视频网站| 日韩av片永久免费网站| 一区二区三区久久精品| 亚洲精品在线视频| 伊人久久综合97精品| 国产亚洲精品久久久久久牛牛| 中文字幕亚洲无线码a| 日韩激情av在线播放| 欧洲永久精品大片ww免费漫画| 亚洲国产欧美日韩精品| 久久久久久久一区二区三区| 亚洲国产中文字幕久久网| 国产成人免费av电影| 欧美大全免费观看电视剧大泉洋| 韩国v欧美v日本v亚洲| 国产a∨精品一区二区三区不卡| 亚洲欧洲日本专区|