WKWebView怎么在iOS中使用?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
成都創(chuàng)新互聯(lián)是一家專業(yè)提供漳浦企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、H5建站、小程序制作等業(yè)務(wù)。10年已為漳浦眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
WKWebView的優(yōu)勢(shì)
性能高,穩(wěn)定性好,占用的內(nèi)存比較小,
支持JS交互
支持HTML5 新特性
可以添加進(jìn)度條(然并卵,不好用,還是習(xí)慣第三方的)。
支持內(nèi)建手勢(shì),
據(jù)說高達(dá)60fps的刷新頻率(不卡)
本文將給大家總結(jié)下iOS中WKWebView的一些特殊使用,下面話不多說了,來一起看看詳細(xì)的介紹吧
WKWebView 加載本地網(wǎng)頁的方式
1.直接加載字符串
- (void)loadHTMLString { //直接加載字符串 NSString *path = [[NSBundle mainBundle] pathForResource:@"story" ofType:nil]; NSString *body = [NSString stringWithContentsOfURL:[NSURL fileURLWithPath:path] encoding:(NSUTF8StringEncoding) error:nil]; NSString *cssPath = [[NSBundle mainBundle] pathForResource:@"css" ofType:nil]; NSString *css = [NSString stringWithContentsOfURL:[NSURL fileURLWithPath:cssPath] encoding:NSUTF8StringEncoding error:nil]; NSString *html = @"<html>"; html = [html stringByAppendingString:@"<head>"]; html = [html stringByAppendingString:@"<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,viewport-fit=cover\">"]; html = [html stringByAppendingString:@"<style type=\"text/css\">"]; html = [html stringByAppendingString:css]; html = [html stringByAppendingString:@"</style></head><body>"]; html = [html stringByAppendingString:body]; html = [html stringByAppendingString:@"</body></html>"]; [webview loadHTMLString:html baseURL:nil]; }
需要注意的是, baseURL 可以用來控制請(qǐng)求權(quán)限
2.加載本地文件
- (void)loadHTMLContent { //加載本地文件 NSString *rootPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSURL *rootURL = [NSURL fileURLWithPath:rootPath]; NSString *bodyTargetPath = [rootPath stringByAppendingPathComponent:@"index.html"]; NSURL *url = [NSURL fileURLWithPath:bodyTargetPath]; //這里必須指定到沙盒的具體文件夾,不能再沙盒根目錄上 [webview loadFileURL:url allowingReadAccessToURL:rootURL]; }
重定向請(qǐng)求
1.通過 URLProtocol
新建 Protocol 的子類,并添加請(qǐng)求屬性
@property (nonnull,strong) NSURLSessionDataTask *task;
由于 WKWebview 的特殊性,這里需要新建類別,并注冊(cè)需要監(jiān)聽的請(qǐng)求頭 [NSURLProtocol wk_registerScheme:@"http"];
注冊(cè)監(jiān)聽 [NSURLProtocol registerClass:[BZURLProtocol class]];
過濾需要進(jìn)行處理的請(qǐng)求,同時(shí)也要過濾那些已經(jīng)處理過的請(qǐng)求。
+ (BOOL)canInitWithRequest:(NSURLRequest *)request { if ([request.URL.absoluteString containsString:@"localhost"]) { //看看是否已經(jīng)處理過了,防止無限循環(huán) if ([NSURLProtocol propertyForKey:kBZURLProtocolKey inRequest:request]) { return NO; } return YES; } return NO; }
將請(qǐng)求通過下面的方法,進(jìn)行重新組裝,設(shè)置成我們自己的請(qǐng)求
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
將上面組裝好的請(qǐng)求,通過下面的方法發(fā)出。并在這里將發(fā)出的請(qǐng)求,進(jìn)行標(biāo)記,因?yàn)闀?huì)重走流程,避免循環(huán)處理
- (void)startLoading { NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy]; //給我們處理過的請(qǐng)求設(shè)置一個(gè)標(biāo)識(shí)符, 防止無限循環(huán), [NSURLProtocol setProperty:@YES forKey:kBZURLProtocolKey inRequest:mutableReqeust]; NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil]; self.task = [session dataTaskWithRequest:self.request]; [self.task resume]; }
這里通過 task 來進(jìn)行網(wǎng)絡(luò)請(qǐng)求發(fā)送,也可以在這里進(jìn)行請(qǐng)求的緩存處理,加快訪問
最后需要設(shè)置代理方法,保證請(qǐng)求被允許和接收到數(shù)據(jù)后的加載
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { //允許請(qǐng)求加載 [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed]; completionHandler(NSURLSessionResponseAllow); } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { //加載數(shù)據(jù) [[self client] URLProtocol:self didLoadData:data]; }
停止請(qǐng)求的時(shí)候注意銷毀對(duì)象
- (void)stopLoading { if (self.task != nil) { [self.task cancel]; } }
退出的時(shí)候也要注意移除監(jiān)聽
[NSURLProtocol wk_unregisterScheme:@"http"]; [NSURLProtocol unregisterClass:[BZURLProtocol class]];
2.通過第三方庫 GCDWebServer 處理請(qǐng)求
建立 server 要在發(fā)出請(qǐng)求之前
server = [[GCDWebServer alloc] init];
添加監(jiān)控方法,這里提供了很多種選擇,包含了請(qǐng)求方式和異步同步回調(diào)等,這里選擇了 GET 方法和異步回調(diào)。拿到結(jié)果后將其回調(diào)給 server ,完成重定向
//異步請(qǐng)求函數(shù) [server addDefaultHandlerForMethod:@"GET" requestClass:[GCDWebServerRequest class] asyncProcessBlock:^(__kindof GCDWebServerRequest * _Nonnull request, GCDWebServerCompletionBlock _Nonnull completionBlock) { if ([request.URL.absoluteString containsString:@"localhost"]) { //命中了需要特殊處理的請(qǐng)求,這里進(jìn)行特定操作 NSURL *url = [NSURL URLWithString:@"http://m.baidu.com/static/search/baiduapp_icon.png"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSURLSession *session = [NSURLSession sharedSession]; //發(fā)出請(qǐng)求 NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (data && error == nil) { //接收到正確的數(shù)據(jù),并返回給server GCDWebServerDataResponse *response = [GCDWebServerDataResponse responseWithData:data contentType:@"image/jpeg"]; completionBlock(response); } else { //數(shù)據(jù)請(qǐng)求失敗,返回給server一個(gè)空的或者失敗的結(jié)果 GCDWebServerDataResponse *response = [GCDWebServerDataResponse response]; completionBlock(response); } }]; [task resume]; } }];
開啟 server [server start];
關(guān)于WKWebView怎么在iOS中使用問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
文章標(biāo)題:WKWebView怎么在iOS中使用
網(wǎng)頁鏈接:http://jinyejixie.com/article2/pdcioc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、用戶體驗(yàn)、云服務(wù)器、網(wǎng)頁設(shè)計(jì)公司、面包屑導(dǎo)航、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)