日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios wkweb设置图片_iOS WKWebView (NSURLProtocol)拦截js、css,图片资源

發布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios wkweb设置图片_iOS WKWebView (NSURLProtocol)拦截js、css,图片资源 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目地址github:HybirdWKWebVIew

HybridNSURLProtocol

一個基于WKWebView的hybirde的容器。能攔截所有WKWKWebView的的css,js,png等網絡請求的demo

NSURLProtocol 子類,就可以對 app 內所有的網絡請求進行:

[NSURLProtocol registerClass:[HybridNSURLProtocol class]]

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

使我WKWebView 的一度認為請求不遵守NSURLProtocol協議,所以不走 NSURLProtocol。這個也是很苦擾我的問題。導致我們hybird的容器1.0也是是用UIWebVIew實現的。

但在蘋果放在gittub的CustomHTTPProtocol,明顯感覺到WKWebview的也是遵守NSURLProtocol,要不也不會走+ (BOOL)canInitWithRequest:(NSURLRequest *)request;后來一個每天看博客和gittub的習慣幫助了我,找到一個大神的不久前開源庫。

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

[NSURLProtocol wk_registerScheme:@"http"];

[NSURLProtocol wk_registerScheme:@"https"];

下面直接上源代碼吧

//FOUNDATION_STATIC_INLINE 屬于屬于runtime范疇,你的.m文件需要頻繁調用一個函數,可以用static inline來聲明。在SDWebImage讀取內存的緩存也用到這個聲明。

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

}

}

注冊后,客戶端所有請求走+ (BOOL)canInitWithRequest:(NSURLRequest *)request。下面是打印的請求的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 ))

{

//看看是否已經處理過了,防止無限循環

if ([NSURLProtocol propertyForKey:KHybridNSURLProtocolHKey inRequest:request])

return NO;

return YES;

}

return NO;

}

Aaron Swartz

request的重寫定向,request的重寫定向,替換百度知道的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 ))

{

//看看是否已經處理過了,防止無限循環

if ([NSURLProtocol propertyForKey:KHybridNSURLProtocolHKey inRequest:request])

return NO;

return YES;

}

return NO;

}

這里最好加上緩存判斷,加載本地離線文件, 這個直接簡單的例子。

- (void)startLoading

{

NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];

//給我們處理過的請求設置一個標識符, 防止無限循環,

[NSURLProtocol setProperty:@YES forKey:KHybridNSURLProtocolHKey inRequest:mutableReqeust];

//這里最好加上緩存判斷,加載本地離線文件, 這個直接簡單的例子。

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

項目地址:

github:HybirdWKWebVIew,對您有幫助,歡迎star。

有問題反饋

在使用中有任何問題,歡迎反饋給我,可以用以下聯系方式跟我交流

github:LiuShuoyu

接受啟發的作者的github

github:Yeatse CC

蘋果開發者文檔:apple

總結

以上是生活随笔為你收集整理的ios wkweb设置图片_iOS WKWebView (NSURLProtocol)拦截js、css,图片资源的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。