色偷偷精品伊人,欧洲久久精品,欧美综合婷婷骚逼,国产AV主播,国产最新探花在线,九色在线视频一区,伊人大交九 欧美,1769亚洲,黄色成人av

start_time: 2026-06-07 12:08:37 +0800

iOS WKWebView (NSURLProtocol)攔截js、css,圖片資源

96
劉小弟
IP屬地: 四川
3.9 2017.01.19 16:11 字?jǐn)?shù) 452

項(xiàng)目地址github:<a >HybirdWKWebVIew</a>

HybridNSURLProtocol

一個(gè)基于WKWebView的hybirde的容器。能攔截所有WKWKWebView的的css,js,png等網(wǎng)絡(luò)請(qǐng)求的demo
NSURLProtocol 子類(lèi),就可以對(duì) app 內(nèi)所有的網(wǎng)絡(luò)請(qǐng)求進(jìn)行:

[NSURLProtocol registerClass:[HybridNSURLProtocol class]]

可是在 WKWebView 中的請(qǐng)求卻完全不遵從這一規(guī)則,只是象征性+ (BOOL) canInitWithRequest:(NSURLRequest *)request 方法,之后的整個(gè)請(qǐng)求流程似乎就與 NSURLProtocol 完全無(wú)關(guān)了。

使我WKWebView 的一度認(rèn)為請(qǐng)求不遵守NSURLProtocol協(xié)議,所以不走 NSURLProtocol。這個(gè)也是很苦擾我的問(wèn)題。導(dǎo)致我們hybird的容器1.0也是是用UIWebVIew實(shí)現(xiàn)的。

但在蘋(píng)果放在gittub的CustomHTTPProtocol,明顯感覺(jué)到WKWebview的也是遵守NSURLProtocol,要不也不會(huì)走+ (BOOL)canInitWithRequest:(NSURLRequest *)request;后來(lái)一個(gè)每天看博客和gittub的習(xí)慣幫助了我,找到一個(gè)大神的不久前開(kāi)源庫(kù)。

使用了WKBrowsingContextController和registerSchemeForCustomProtocol。 通過(guò)反射的方式拿到了私有的 class/selector。通過(guò)kvc取到browsingContextController。通過(guò)把注冊(cè)把 http 和 https 請(qǐng)求交給 NSURLProtocol 處理。

[NSURLProtocol wk_registerScheme:@"http"];
[NSURLProtocol wk_registerScheme:@"https"];

下面直接上源代碼吧

//FOUNDATION_STATIC_INLINE 屬于屬于runtime范疇,你的.m文件需要頻繁調(diào)用一個(gè)函數(shù),可以用static inline來(lái)聲明。在SDWebImage讀取內(nèi)存的緩存也用到這個(gè)聲明。
FOUNDATION_STATIC_INLINE Class ContextControllerClass() {
static Class cls;
if (!cls) {
cls = [[[WKWebView new] valueForKey:@"browsingContextController"] class];
}
return cls;
}

FOUNDATION_STATIC_INLINE SEL RegisterSchemeSelector() {
return NSSelectorFromString(@"registerSchemeForCustomProtocol:");
}

FOUNDATION_STATIC_INLINE SEL UnregisterSchemeSelector() {
return NSSelectorFromString(@"unregisterSchemeForCustomProtocol:");
}

@implementation NSURLProtocol (WebKitSupport)

+ (void)wk_registerScheme:(NSString *)scheme {
Class cls = ContextControllerClass();
SEL sel = RegisterSchemeSelector();
if ([(id)cls respondsToSelector:sel]) {
// 放棄編輯器警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[(id)cls performSelector:sel withObject:scheme];
#pragma clang diagnostic pop
}
}

+ (void)wk_unregisterScheme:(NSString *)scheme {
Class cls = ContextControllerClass();
SEL sel = UnregisterSchemeSelector();
if ([(id)cls respondsToSelector:sel]) {
// 放棄編輯器警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[(id)cls performSelector:sel withObject:scheme];
#pragma clang diagnostic pop
}
}

注冊(cè)后,客戶端所有請(qǐng)求走+ (BOOL)canInitWithRequest:(NSURLRequest *)request。下面是打印的請(qǐng)求的log

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
NSLog(@"request.URL.absoluteString = %@",request.URL.absoluteString);
NSString *scheme = [[request URL] scheme];
if ( ([scheme caseInsensitiveCompare:@"http"]  == NSOrderedSame ||
[scheme caseInsensitiveCompare:@"https"] == NSOrderedSame ))
{
//看看是否已經(jīng)處理過(guò)了,防止無(wú)限循環(huán)
if ([NSURLProtocol propertyForKey:KHybridNSURLProtocolHKey inRequest:request])
return NO;
return YES;
}
return NO;
}

Aaron Swartz
Aaron Swartz

request的重寫(xiě)定向,request的重寫(xiě)定向,替換百度知道的log

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
NSLog(@"request.URL.absoluteString = %@",request.URL.absoluteString);
NSString *scheme = [[request URL] scheme];
if ( ([scheme caseInsensitiveCompare:@"http"]  == NSOrderedSame ||
[scheme caseInsensitiveCompare:@"https"] == NSOrderedSame ))
{
//看看是否已經(jīng)處理過(guò)了,防止無(wú)限循環(huán)
if ([NSURLProtocol propertyForKey:KHybridNSURLProtocolHKey inRequest:request])
return NO;
return YES;
}
return NO;
}

這里最好加上緩存判斷,加載本地離線文件, 這個(gè)直接簡(jiǎn)單的例子。

- (void)startLoading
{
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
//給我們處理過(guò)的請(qǐng)求設(shè)置一個(gè)標(biāo)識(shí)符, 防止無(wú)限循環(huán),
[NSURLProtocol setProperty:@YES forKey:KHybridNSURLProtocolHKey inRequest:mutableReqeust];

//這里最好加上緩存判斷,加載本地離線文件, 這個(gè)直接簡(jiǎn)單的例子。
if ([mutableReqeust.URL.absoluteString isEqualToString:sourIconUrl])
{
NSData* data = UIImagePNGRepresentation([UIImage imageNamed:@"medlinker"]);
NSURLResponse* response = [[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:@"image/png" expectedContentLength:data.length textEncodingName:nil];
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
[self.client URLProtocol:self didLoadData:data];
[self.client URLProtocolDidFinishLoading:self];
}
else
{
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
self.task = [session dataTaskWithRequest:self.request];
[self.task resume];
}
}

下面是代碼效果圖


WechatIMG1.png
WechatIMG2.jpeg

項(xiàng)目地址:

github:<a >HybirdWKWebVIew</a>,對(duì)您有幫助,歡迎star。

有問(wèn)題反饋

在使用中有任何問(wèn)題,歡迎反饋給我,可以用以下聯(lián)系方式跟我交流

  • github:<a >LiuShuoyu</a>

接受啟發(fā)的作者的github

github:<a >Yeatse CC</a>
蘋(píng)果開(kāi)發(fā)者文檔:<a >apple</a>

最后編輯于 :2017-12-05 07:04:33
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 閱讀 232110 評(píng)論 6 贊 545
序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 閱讀 100451 評(píng)論 3 贊 427
文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
8 開(kāi)封第一講書(shū)人 閱讀 181032 評(píng)論 0 贊 387
文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
8 開(kāi)封第一講書(shū)人 閱讀 64400 評(píng)論 1 贊 322
正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶點(diǎn)故事 閱讀 73416 評(píng)論 6 贊 419
文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
8 開(kāi)封第一講書(shū)人 閱讀 56462 評(píng)論 1 贊 332
那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 閱讀 44290 評(píng)論 3 贊 448
文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
8 開(kāi)封第一講書(shū)人 閱讀 43737 評(píng)論 0 贊 298
序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 閱讀 50396 評(píng)論 1 贊 334
正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶點(diǎn)故事 閱讀 43871 評(píng)論 3 贊 362
正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶點(diǎn)故事 閱讀 44905 評(píng)論 1 贊 383
序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 閱讀 39626 評(píng)論 5 贊 363
正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶點(diǎn)故事 閱讀 45721 評(píng)論 3 贊 359
文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
8 開(kāi)封第一講書(shū)人 閱讀 35903 評(píng)論 0 贊 35
文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
8 開(kāi)封第一講書(shū)人 閱讀 37157 評(píng)論 1 贊 302
我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 閱讀 53103 評(píng)論 2 贊 399
正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶點(diǎn)故事 閱讀 49756 評(píng)論 2 贊 384
end_time: 2026-06-07 12:08:37 +0800 Completed in 151.665522ms 安远县| 锦州市| 洞头县| 皋兰县| 休宁县| 洪洞县| 晋宁县| 大丰市| 曲松县| 曲阳县| 鹤庆县| 瑞安市| 沿河| 襄汾县| 泰州市| 宜川县| 右玉县| 博爱县| 长沙县| 莱芜市| 奉新县| 岳阳县| 无棣县| 衡阳县| 长丰县| 土默特左旗| 堆龙德庆县| 资中县| 如东县| 馆陶县| 黔江区| 巴林左旗| 淮滨县| 南汇区| 三穗县| 日土县| 芦山县| 济南市| 朔州市| 昌都县| 玉环县|