UIWebView與WKWebView颠区,JavaScript的與OC交互,餅干管理看我就夠(轉(zhuǎn)載)

?iOS中的UIWebView與WKWebView通铲,JavaScript的與OC交互毕莱,餅干管理看我就夠(上)

前言

iOS的開發(fā)中,用來顯示一個(gè)HTML頁,H5頁朋截,經(jīng)常會(huì)用的一個(gè)控件是的WebView蛹稍。說到的WebView,你知道多少呢部服?是簡單的展示唆姐,還是要和OC交互實(shí)現(xiàn)比較復(fù)雜的功能呢?本文將為您介紹的iOS中的WebView中廓八,并且由淺到深奉芦,一步步帶你了解并掌握的WebView的用法,JavaScript的與目標(biāo)的交互剧蹂,以及餅干的管理声功,JS的調(diào)試等。

文章因涉及到的內(nèi)容較多国夜,因此拆分成以下幾部分:

的iOS中的UIWebView與WKWebView减噪,JavaScript的與OC交互,餅干管理看我就夠(上)

iOS中UIWebView與WKWebView车吹,JavaScript與OC交互筹裕,Cookie管理看我就夠(中)(已發(fā)布??)

iOS中UIWebView與WKWebView,JavaScript與OC交互窄驹,Cookie管理看我就夠(下)(已發(fā)布??)

關(guān)于文中提到的一些內(nèi)容朝卒,這里我準(zhǔn)備了個(gè)Demo,有需要的小伙可以下載乐埠。

本文目錄

前言

UIWebView的

UIWebView的基本用法

一個(gè)UIWebView中的JavaScript與目標(biāo)的交互

UIWebView OC調(diào)用JS

stringByEvaluatingJavaScriptFromString:

JavaScriptCore(iOS 7.0 +)

UIWebView JS調(diào)用OC

自定義網(wǎng)址方案(受保護(hù)網(wǎng)址)

JavaScriptCore(iOS 7.0 +)

UIWebView中的Cookie的管理

餅干簡介

曲奇管理

未完待續(xù)

UIWebView的

UIWebView的基本用法

首先要介紹的就是我們的老朋友UIWebView抗斤。相信對大多數(shù)小伙伴兒而言,UIWebView狀語從句:UILabel一樣丈咐,都是最早接觸的控件了瑞眼,其實(shí)UIWebView用法英語諺語比較簡單(功能基本能滿足需求),簡單的創(chuàng)建棵逊,并且調(diào)用

- (void)loadRequest:(NSURLRequest*)request;- (void)loadHTMLString:(NSString*)string baseURL:(nullableNSURL*)baseURL;- (void)loadData:(NSData*)data MIMEType:(NSString*)MIMEType textEncodingName:(NSString*)textEncodingName baseURL:(NSURL*)baseURL;

這些方法伤疙,加載就可以了。

當(dāng)然辆影,如果需要監(jiān)聽頁面加載的結(jié)果徒像,或者需要判斷是否允許打開某個(gè)URL,需要那設(shè)置UIWebView的delegate蛙讥,只代理需要遵循協(xié)議锯蛀,并且在代理中實(shí)現(xiàn)下面的這些可選方法就可以:

__TVOS_PROHIBITED@protocolUIWebViewDelegate@optional- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType;- (void)webViewDidStartLoad:(UIWebView*)webView;- (void)webViewDidFinishLoad:(UIWebView*)webView;- (void)webView:(UIWebView*)webView didFailLoadWithError:(nullableNSError*)error;@end

一個(gè)UIWebView中的JavaScript與目標(biāo)的交互

這里不詳細(xì)討論一些很好的第三方實(shí)現(xiàn),比如WebViewJavascriptBridge次慢,單純的講講native端JS與OC的交互實(shí)現(xiàn)方式旁涤,讀完了下面的部分翔曲,相信你也會(huì)實(shí)現(xiàn)一個(gè)簡單的bridge了。

UIWebView OC調(diào)用JS

1. stringByEvaluatingJavaScriptFromString:

最常用的方法劈愚,很簡單部默,調(diào)用只要- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;就可以了,如:

self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];

雖然比較方便造虎,但是缺點(diǎn)也有:

該方法不能判斷調(diào)用了一個(gè)JS方法之后,是否發(fā)生了錯(cuò)誤纷闺。當(dāng)錯(cuò)誤發(fā)生時(shí)算凿,返回值為零,而當(dāng)調(diào)用一個(gè)方法本身沒有返回值時(shí)犁功,返回值也為零氓轰,所以無法判斷是否調(diào)用成功了。

返回值類型為nullable NSString *浸卦,就意味著當(dāng)調(diào)用的JS方法有返回值時(shí)署鸡,都以字符串返回,不夠靈活限嫌。當(dāng)返回值是一個(gè)JS的陣列時(shí)靴庆,還需要解析字符串,比較麻煩怒医。

對于上述缺點(diǎn)炉抒,可以通過使用JavaScriptCore(iOS 7.0 +)來解決。

2. JavaScriptCore(iOS 7.0 +)

想必大家不會(huì)陌生吧稚叹,弄前些日子的沸沸揚(yáng)揚(yáng)的JSPatch被禁事件中焰薄,最核心的就是它了。因?yàn)镴avaScriptCore的JS到OC的映射扒袖,可以替換各種JS方法成OC方法塞茅,其所以動(dòng)態(tài)性(配合運(yùn)行時(shí)的不安全性)也就成為了JSPatch被蘋果禁掉的最主要原因。講這里下UIWebView通過JavaScriptCore來實(shí)現(xiàn)OC-> JS季率。

其實(shí)WebKit的都有一個(gè)內(nèi)嵌的JS環(huán)境野瘦,一般我們在頁面加載完成之后,獲取JS上下文蚀同,通過然后JSContext的evaluateScript:方法來獲取報(bào)道查看值缅刽。該因?yàn)榈玫椒椒ǖ牡挠⑽囊粋€(gè)JSValue對象,所以支持的JavaScript的數(shù)組蠢络,數(shù)字衰猛,字符串,對象等數(shù)據(jù)類型刹孔。

- (void)webViewDidFinishLoad:(UIWebView*)webView{//更新標(biāo)題啡省,這是上面的講過的方法//self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];//獲取該UIWebView的javascript上下文JSContext *jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];//這也是一種獲取標(biāo)題的方法娜睛。JSValue *value = [self.jsContext evaluateScript:@"document.title"];//更新標(biāo)題self.navigationItem.title = value.toString;}

方法該解決了stringByEvaluatingJavaScriptFromString:報(bào)道查看值只是NSString的問題。

那么如果我執(zhí)行了一個(gè)不存在的方法卦睹,比如

[self.jsContext evaluateScript:@"document.titlexxxx"];

那么必然會(huì)報(bào)錯(cuò)畦戒,報(bào)錯(cuò)了,可以通過@property (copy) void(^exceptionHandler)(JSContext *context, JSValue *exception);结序,設(shè)置該塊來獲取異常障斋。

//在調(diào)用前,設(shè)置異承旌祝回調(diào)[self.jsContext setExceptionHandler:^(JSContext *context, JSValue *exception){NSLog(@"%@",exception);}];//執(zhí)行方法JSValue *value = [self.jsContext evaluateScript:@"document.titlexxxx"];

該方法垃环,很好也。解決的了stringByEvaluatingJavaScriptFromString:調(diào)用JS方法后返敬,出現(xiàn)錯(cuò)誤卻捕獲不到的缺點(diǎn)遂庄。

UIWebView JS調(diào)用OC

1.自定義URL方案(被攔截的URL)

比如darkangel://。方法是在html或者js中劲赠,點(diǎn)擊某個(gè)按鈕觸發(fā)事件時(shí)涛目,跳轉(zhuǎn)到自定義URL Scheme構(gòu)造的鏈接,而Objective-C中捕獲該鏈接凛澎,從中解析必要的參數(shù)霹肝,實(shí)現(xiàn)JS到OC的一次交互比如頁面中一個(gè)一個(gè)標(biāo)簽,鏈接如下:

短信驗(yàn)證登錄

而在目標(biāo)C中塑煎,遵循只要了UIWebViewDelegate協(xié)議阿迈,那么每次打開一個(gè)鏈接之前,都會(huì)觸發(fā)方法

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType轧叽;

在該方法中苗沧,捕獲該鏈接,并且返回NO(阻止本次跳轉(zhuǎn))炭晒,從而執(zhí)行對應(yīng)的OC方法待逞。

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{//標(biāo)準(zhǔn)的URL包含scheme、host网严、port识樱、path、query震束、fragment等NSURL*URL = request.URL;if([URL.scheme isEqualToString:@"darkangel"]) {if([URL.host isEqualToString:@"smsLogin"]) {NSLog(@"短信驗(yàn)證碼登錄怜庸,參數(shù)為 %@", URL.query);returnNO;}}returnYES;}

當(dāng)用戶點(diǎn)擊短信驗(yàn)證登錄時(shí),控制臺(tái)會(huì)輸出短信驗(yàn)證碼登錄垢村,參數(shù)為 username=12323123&code=892845割疾。參數(shù)可以是一個(gè)json格式并且URLEncode過的字符串,這樣就可以實(shí)現(xiàn)復(fù)雜參數(shù)的傳遞(比如WebViewJavascriptBridge)嘉栓。

優(yōu)點(diǎn):泛用性強(qiáng)宏榕,可以配合H5實(shí)現(xiàn)頁面動(dòng)態(tài)化比如頁面中一個(gè)活動(dòng)鏈接到活動(dòng)詳情頁拓诸,當(dāng)本地尚未開發(fā)完畢時(shí),鏈接可以是一個(gè)H5鏈接麻昼,等到本地開發(fā)完畢時(shí)奠支,可以通過該方法跳轉(zhuǎn)到本地頁面,實(shí)現(xiàn)頁面動(dòng)態(tài)化抚芦。且該方案適用于安卓和iOS版倍谜,泛用性很強(qiáng)。

缺點(diǎn):無法直接獲取本次交互的返回值叉抡,比較適合單向傳參枢劝,且不關(guān)心回調(diào)的情景,比如H5頁面跳轉(zhuǎn)到本地頁面等卜壕。

其實(shí),WebViewJavascriptBridge使用的方案就是攔截URL烙常,為了解決無法直接獲取返回值的缺點(diǎn)轴捎,它采用了將一個(gè)名為callback的function作為參數(shù),通過一些封裝蚕脏,傳遞到OC(js-> oc傳遞參數(shù)和callbackId)侦副,然后在OC端執(zhí)行完畢,再通過block來回調(diào)回調(diào)(oc-?> js驼鞭,傳遞返回值參數(shù))秦驯,實(shí)現(xiàn)異步獲取返回值,比如在js端調(diào)用

//JS調(diào)用OC的分享方法(當(dāng)然需要OC提前注冊)share為方法名挣棕,shareData為參數(shù)译隘,后面的為回調(diào)functionWebViewJavascriptBridge.callHandler('share', shareData,function(response){//OC端通過block回調(diào)分享成功或者失敗的結(jié)果alert(response);});

具體的可以看下它的源碼,還是很值得學(xué)習(xí)的洛心。

2. JavaScriptCore(iOS 7.0 +)

除了攔截網(wǎng)址的方法固耘,還可以利用上面提到的JavaScriptCore,它十分強(qiáng)大词身,強(qiáng)大在哪里呢厅目?下面我們來一探究竟。

當(dāng)然法严,還是需要在頁面加載完成時(shí)损敷,先獲取JS上下文。獲取到之后深啤,我們就可以進(jìn)行強(qiáng)大的方法映射了拗馒。

比如JS中我定義了一個(gè)分享的方法

functionshare(title, imgUrl, link){//這里需要OC實(shí)現(xiàn)}

在OC中實(shí)現(xiàn)如下

- (void)webViewDidFinishLoad:(UIWebView*)webView{//將js的function映射到OC的方法[selfconvertJSFunctionsToOCMethods];}- (void)convertJSFunctionsToOCMethods{//獲取該UIWebview的javascript上下文//self持有jsContext//@property (nonatomic, strong) JSContext *jsContext;self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];//js調(diào)用oc//其中share就是js的方法名稱,賦給是一個(gè)block 里面是oc代碼//此方法最終將打印出所有接收到的參數(shù)溯街,js參數(shù)是不固定的self.jsContext[@"share"] = ^() {NSArray*args = [JSContext currentArguments];//獲取到share里的所有參數(shù)//args中的元素是JSValue瘟忱,需要轉(zhuǎn)成OC的對象NSMutableArray*messages = [NSMutableArrayarray];for(JSValue *objinargs) {[messages addObject:[obj toObject]];}NSLog(@"點(diǎn)擊分享js傳回的參數(shù):\n%@", messages);};}

在HTML或者JS的某處奥额,點(diǎn)擊一個(gè)標(biāo)簽調(diào)用這個(gè)共享方法,并傳參访诱,如

分享活動(dòng)垫挨,領(lǐng)30元紅包

此時(shí),如果用戶點(diǎn)擊了分享活動(dòng)触菜,領(lǐng)30元紅包這個(gè)標(biāo)簽九榔,那么在控制臺(tái)會(huì)打印出所有參數(shù)

上面的代碼實(shí)現(xiàn)了OC方法替換JS實(shí)現(xiàn)。它十分靈活涡相,主要依賴這些API哲泊。

@interfaceJSContext(SubscriptSupport)/*!

@method

@abstract Get a particular property on the global object.

@result The JSValue for the global object's property.

*/- (JSValue *)objectForKeyedSubscript:(id)key;/*!

@method

@abstract Set a particular property on the global object.

*/- (void)setObject:(id)object forKeyedSubscript:(NSObject *)key;

self.jsContext[@"yourMethodName"] = your block;寫這樣不僅可以在有yourMethodName方法時(shí)替換該JS方法為OC實(shí)現(xiàn),還會(huì)在該方法沒有時(shí)催蝗,添加方法切威。簡而言之,有則替換丙号,無則添加先朦。

那如果我想寫一個(gè)有兩個(gè)參數(shù),一個(gè)返回值的JS方法犬缨,OC應(yīng)該怎么替換呢喳魏?

JS中

//該方法傳入兩個(gè)整數(shù),求和怀薛,并返回結(jié)果functiontestAddMethod(a, b){//需要OC實(shí)現(xiàn)a+b刺彩,并返回returna + b;}//js調(diào)用console.log(testAddMethod(1,5));//output? 6

OC直接替換該方法

self.jsContext[@"testAddMethod"] = ^NSInteger(NSIntegera,NSIntegerb) {returna + b;};

那么當(dāng)在JS調(diào)用

//js調(diào)用console.log(testAddMethod(1,5));//output? 6, 方法為 a + b

如果OC替換該方法為兩數(shù)相乘

self.jsContext[@"testAddMethod"] = ^NSInteger(NSIntegera,NSIntegerb) {returna * b;};

再次調(diào)用JS

console.log(testAddMethod(1,5));//output? 5枝恋,該方法變?yōu)榱?a * b创倔。

舉一反三,調(diào)用方法原實(shí)現(xiàn)焚碌,并且在原結(jié)果上乘以10三幻。

//調(diào)用方法的本來實(shí)現(xiàn),給原結(jié)果乘以10JSValue *value =self.jsContext[@"testAddMethod"];self.jsContext[@"testAddMethod"] = ^NSInteger(NSIntegera,NSIntegerb) {JSValue *resultValue = [value callWithArguments:[JSContext currentArguments]];returnresultValue.toInt32 *10;};

再次調(diào)用JS

console.log(testAddMethod(1,5));//output? 60呐能,該方法變?yōu)榱?a + b) * 10

上面的方法念搬,都是同步函數(shù),如果我想實(shí)現(xiàn)JS調(diào)用OC的方法摆出,并且異步接收回調(diào)朗徊,那么該怎么做呢?比如H5中有一個(gè)分享按鈕偎漫,用戶點(diǎn)擊之后爷恳,調(diào)用本地分享(微信分享,微博分享等)象踊,在天然分享成功或者失敗時(shí)温亲,回調(diào)H5頁面棚壁,告訴其分享結(jié)果,H5頁面刷新對應(yīng)的UI栈虚,顯示分享成功或者失敗袖外。

這個(gè)問題,需要對JS有一定了解魂务。下面上的js代碼曼验。

//聲明functionshare(shareData){vartitle = shareData.title;varimgUrl = shareData.imgUrl;varlink = shareData.link;varresult = shareData.result;//do something//這里模擬異步操作setTimeout(function(){//2s之后,回調(diào)true分享成功result(true);},2000);}//調(diào)用的時(shí)候需要這么寫share({title:"title",imgUrl:"http://img.dd.com/xxx.png",link: location.href,result:function(res){//函數(shù)作為參數(shù)console.log(res ?"success":"failure");}});

從封裝的角度上講粘姜,JS的share方法的參數(shù)的英文一個(gè)對象鬓照,該對象包含了幾個(gè)必要的字段,以及一個(gè)回調(diào)函數(shù)孤紧,這個(gè)回調(diào)函數(shù)有點(diǎn)像OC的block豺裆,調(diào)用者把一個(gè)function傳入一個(gè)function當(dāng)作參數(shù),在適當(dāng)時(shí)候号显,內(nèi)方法實(shí)現(xiàn)者調(diào)用該function臭猜,對實(shí)現(xiàn)調(diào)用者的異步回調(diào)那么如果此時(shí)OC來實(shí)現(xiàn)。share方法咙轩,該怎么做呢其實(shí)大概是這樣的?

//異步回調(diào)self.jsContext[@"share"] = ^(JSValue *shareData) {//首先這里要注意阴颖,回調(diào)的參數(shù)不能直接寫NSDictionary類型活喊,為何呢?//仔細(xì)看量愧,打印出的確實(shí)是一個(gè)NSDictionary钾菊,但是result字段對應(yīng)的不是block而是一個(gè)NSDictionary? NSLog(@"%@", [shareData toObject]);//獲取shareData對象的result屬性,這個(gè)JSValue對應(yīng)的其實(shí)是一個(gè)javascript的function偎肃。JSValue *resultFunction = [shareData valueForProperty:@"result"];//回調(diào)block煞烫,將js的function轉(zhuǎn)換為OC的blockvoid(^result)(BOOL) = ^(BOOLisSuccess) {[resultFunction callWithArguments:@[@(isSuccess)]];};//模擬異步回調(diào)dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{NSLog(@"回調(diào)分享成功");result(YES);});};

其中一些坑,已經(jīng)在代碼的注釋寫的比較清楚了累颂,要這里注意JavaScript的function狀語從句:Objective-C的block的轉(zhuǎn)換滞详。

從上面的一些探討和嘗試來看,證明足以JavaScriptCore的強(qiáng)大紊馏,這里不再展開料饥,小伙伴們可以自行探索。

UIWebView中的Cookie的管理

餅干簡介

說到Cookie朱监,或許有些小伙伴會(huì)比較陌生岸啡,有些小伙伴會(huì)比較熟悉。如果項(xiàng)目中赫编,所有頁面都是純原生來實(shí)現(xiàn)的話巡蘸,一般Cookie這個(gè)東西或許我們永遠(yuǎn)也奋隶。不會(huì)接觸到。但是悦荒,這里還是要說一下Cookie唯欣,因?yàn)樗娴暮苤匾伤a(chǎn)生的一些坑也很多逾冬。

Cookie在網(wǎng)絡(luò)利用的最多的地方黍聂,是用來記錄各種狀態(tài)。你比如在Safari中打開_百度身腻,然后登陸自己的賬號产还,之后打開所有百度相關(guān)的頁面,都會(huì)是登陸狀態(tài)嘀趟,而且當(dāng)你關(guān)了電腦脐区,下開機(jī)次再次打開Safari打開_百度,會(huì)發(fā)現(xiàn)還是登陸狀態(tài)她按,其實(shí)這個(gè)就利用了Cookie牛隅。Cookie中記錄了你百度賬號的一些信息,有效期等酌泰,也維持了跨域請求時(shí)登錄狀態(tài)的統(tǒng)計(jì)性媒佣。

看到可以Cookie的域各不相同,有效期也各不相同陵刹,一般.baidu.com這樣的域的Cookie就是為了跨域時(shí)默伍,可以維持一些狀態(tài)。

那么在應(yīng)用程序中衰琐,Cookie的最常用的就是維持登錄狀態(tài)了也糊。一般本地端都有自己的一套完整登錄注冊邏輯,一般大部分頁面都是原生實(shí)現(xiàn)的羡宙。當(dāng)然盆驹,也會(huì)有一些頁面是H5來實(shí)現(xiàn)的殷勘,雖然h5頁面在App中通過WebView加載或多或少都會(huì)有點(diǎn)性能問題,感覺不流暢或者體驗(yàn)不好,但是它的靈活性是Native App無法比擬的欣福。那么由此赌躺,便產(chǎn)生了一種需求扛伍,當(dāng)本地端用戶是登錄狀態(tài)的叶眉,打開一個(gè)H5頁面,H5也要維持用戶的登錄狀態(tài)僻焚。

這個(gè)需求看似簡單允悦,如何實(shí)現(xiàn)呢?一般的解決方案是本地保存登錄狀態(tài)的餅干,在打開H5頁面中隙弛,把餅干添加上架馋,以此來維持登錄狀態(tài)。其實(shí)坑還是有很多的全闷,比如用戶登錄或者退出了叉寂,H5頁面的登錄狀態(tài)也變了,需要刷新总珠,什么時(shí)候刷新屏鳍?WKWebView中Cookie丟失問題?簡單這里說下UIWebView的Cookie管理局服,后面的章節(jié)再介紹WKWebView钓瞭。

曲奇管理

UIWebView的Cookie管理很簡單,一般不需要我們手動(dòng)操作Cookie淫奔,所有因?yàn)镃ookie都會(huì)被[NSHTTPCookieStorage sharedHTTPCookieStorage]這個(gè)單例管理山涡,而且UIWebView會(huì)自動(dòng)同步CookieStorage中的Cookie的,所以只要我們在本地端唆迁,正常登陸退出鸭丛,H5在適當(dāng)時(shí)候刷新,就可以正確的維持登錄狀態(tài)唐责,不需要做多余的操作鳞溉。

可能有一些情況下,我們需要在訪問某個(gè)鏈接時(shí)鼠哥,一個(gè)添加固定Cookie用來做區(qū)分熟菲,就那么可以通過header來實(shí)現(xiàn)

NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:@"http://www.baidu.com"]];[request addValue:@"customCookieName=1314521;"forHTTPHeaderField:@"Set-Cookie"];[self.webView loadRequest:request];

也可以主動(dòng)操作NSHTTPCookieStorage,添加一個(gè)自定義Cookie

NSHTTPCookie*cookie = [NSHTTPCookiecookieWithProperties:@{NSHTTPCookieName:@"customCookieName",NSHTTPCookieValue:@"1314521",NSHTTPCookieDomain:@".baidu.com",NSHTTPCookiePath:@"/"}];[[NSHTTPCookieStoragesharedHTTPCookieStorage] setCookie:cookie];//Cookie存在則覆蓋肴盏,不存在添加

還有一些常用的方法科盛,如讀取所有Cookie

NSArray*cookies = [NSHTTPCookieStoragesharedHTTPCookieStorage].cookies;

Cookie轉(zhuǎn)換成HTTPHeaderFields帽衙,并到添加request的header中

//Cookies數(shù)組轉(zhuǎn)換為requestHeaderFieldsNSDictionary*requestHeaderFields = [NSHTTPCookierequestHeaderFieldsWithCookies:cookies];//設(shè)置請求頭request.allHTTPHeaderFields = requestHeaderFields;

來說本世紀(jì)的牛頓UIWebView的Cookie管理比較簡單菜皂,小伙伴們可以自己寫個(gè)演示測試一下,發(fā)揮你們的想象厉萝。

未完待續(xù)

關(guān)于UIWebView的介紹恍飘,使用以及UIWebView進(jìn)行JS與OC的交互,Cookie的管理谴垫,就先簡單介紹到這里章母。如果有小伙伴對于WebViewJavascriptBridge比較感興趣,可以留言翩剪,根據(jù)留言我考慮一下寫一篇文章乳怎,分析它的詳細(xì)實(shí)現(xiàn)。

另外前弯,將為后續(xù)介紹您WKWebView的用法英語諺語蚪缀,一些OC與JS交互秫逝,餅干管理,在如何Safari中調(diào)試以及一些不為人知的坑等询枚,敬請期待?

后續(xù)文章已發(fā)布:

iOS中UIWebView與WKWebView违帆,JavaScript與OC交互,Cookie管理看我就夠(中)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末金蜀,一起剝皮案震驚了整個(gè)濱河市刷后,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渊抄,老刑警劉巖尝胆,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抒线,居然都是意外死亡班巩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門嘶炭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抱慌,“玉大人,你說我怎么就攤上這事眨猎∫纸” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵睡陪,是天一觀的道長寺渗。 經(jīng)常有香客問我,道長兰迫,這世上最難降的妖魔是什么信殊? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮汁果,結(jié)果婚禮上涡拘,老公的妹妹穿的比我還像新娘。我一直安慰自己据德,他們只是感情好鳄乏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棘利,像睡著了一般橱野。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上善玫,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天水援,我揣著相機(jī)與錄音,去河邊找鬼。 笑死蜗元,一個(gè)胖子當(dāng)著我的面吹牛誓斥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播许帐,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼劳坑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了成畦?” 一聲冷哼從身側(cè)響起距芬,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎循帐,沒想到半個(gè)月后框仔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拄养,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年离斩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘪匿。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跛梗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棋弥,到底是詐尸還是另有隱情核偿,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布顽染,位于F島的核電站漾岳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粉寞。R本人自食惡果不足惜尼荆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唧垦。 院中可真熱鬧捅儒,春花似錦、人聲如沸业崖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽双炕。三九已至,卻和暖如春撮抓,著一層夾襖步出監(jiān)牢的瞬間妇斤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留站超,地道東北人荸恕。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像死相,于是被迫代替她去往敵國和親融求。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容