?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ā)布: