亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WKWebView怎么在iOS中使用

發布時間:2021-03-25 17:25:02 來源:億速云 閱讀:230 作者:Leah 欄目:移動開發

WKWebView怎么在iOS中使用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

WKWebView的優勢

  • 性能高,穩定性好,占用的內存比較小,

  • 支持JS交互

  • 支持HTML5 新特性

  • 可以添加進度條(然并卵,不好用,還是習慣第三方的)。

  • 支持內建手勢,

  • 據說高達60fps的刷新頻率(不卡)

本文將給大家總結下iOS中WKWebView的一些特殊使用,下面話不多說了,來一起看看詳細的介紹吧

WKWebView 加載本地網頁的方式

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 可以用來控制請求權限

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];
}

重定向請求

1.通過 URLProtocol

新建 Protocol 的子類,并添加請求屬性

@property (nonnull,strong) NSURLSessionDataTask *task;

由于 WKWebview 的特殊性,這里需要新建類別,并注冊需要監聽的請求頭 [NSURLProtocol wk_registerScheme:@"http"];

注冊監聽 [NSURLProtocol registerClass:[BZURLProtocol class]];

過濾需要進行處理的請求,同時也要過濾那些已經處理過的請求。

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
if ([request.URL.absoluteString containsString:@"localhost"]) {
//看看是否已經處理過了,防止無限循環
if ([NSURLProtocol propertyForKey:kBZURLProtocolKey inRequest:request]) {
return NO;
}
return YES;
}
return NO;
}

將請求通過下面的方法,進行重新組裝,設置成我們自己的請求

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request

將上面組裝好的請求,通過下面的方法發出。并在這里將發出的請求,進行標記,因為會重走流程,避免循環處理

- (void)startLoading {
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
//給我們處理過的請求設置一個標識符, 防止無限循環,
[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 來進行網絡請求發送,也可以在這里進行請求的緩存處理,加快訪問

最后需要設置代理方法,保證請求被允許和接收到數據后的加載

- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {

//允許請求加載
[[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
completionHandler(NSURLSessionResponseAllow);
}

- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
//加載數據
[[self client] URLProtocol:self didLoadData:data];
}

停止請求的時候注意銷毀對象

- (void)stopLoading {
if (self.task != nil) {
[self.task cancel];
}
}

退出的時候也要注意移除監聽

[NSURLProtocol wk_unregisterScheme:@"http"];
[NSURLProtocol unregisterClass:[BZURLProtocol class]];

2.通過第三方庫 GCDWebServer 處理請求

建立 server 要在發出請求之前

server = [[GCDWebServer alloc] init];

添加監控方法,這里提供了很多種選擇,包含了請求方式和異步同步回調等,這里選擇了 GET 方法和異步回調。拿到結果后將其回調給 server ,完成重定向

//異步請求函數
[server addDefaultHandlerForMethod:@"GET"
requestClass:[GCDWebServerRequest class]
asyncProcessBlock:^(__kindof GCDWebServerRequest * _Nonnull request, GCDWebServerCompletionBlock _Nonnull completionBlock) {

if ([request.URL.absoluteString containsString:@"localhost"]) {
//命中了需要特殊處理的請求,這里進行特定操作

NSURL *url = [NSURL URLWithString:@"http://m.baidu.com/static/search/baiduapp_icon.png"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
//發出請求
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data && error == nil) {
//接收到正確的數據,并返回給server
GCDWebServerDataResponse *response = [GCDWebServerDataResponse responseWithData:data contentType:@"image/jpeg"];
completionBlock(response);
} else {
//數據請求失敗,返回給server一個空的或者失敗的結果
GCDWebServerDataResponse *response = [GCDWebServerDataResponse response];
completionBlock(response);
}
}];
[task resume];
}
}];

開啟 server [server start];

關于WKWebView怎么在iOS中使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普兰县| 张家口市| 河源市| 大宁县| 兴和县| 东乌珠穆沁旗| 屏边| 荔浦县| 孝感市| 崇明县| 拜城县| 阳山县| 高阳县| 烟台市| 阿瓦提县| 始兴县| 汉沽区| 宣恩县| 陇南市| 平遥县| 济源市| 德庆县| 天峨县| 习水县| 泸水县| 屏山县| 成都市| 凌云县| 当涂县| 金寨县| 武川县| 大同县| 济阳县| 太原市| 兴业县| 沂源县| 阿拉尔市| 福泉市| 青岛市| 平罗县| 宁乡县|