最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中WKWebView的一些特殊使用總結(jié)

 更新時(shí)間:2018年12月12日 08:25:42   作者:BourbonZ  
這篇文章主要給大家介紹了關(guān)于iOS中WKWebView的一些特殊使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

現(xiàn)在大部分的app只支持iOS8以上的系統(tǒng)了,在接入H5時(shí)可以只管最新的WKWebView了。

WKWebView的優(yōu)勢

  • 性能高,穩(wěn)定性好,占用的內(nèi)存比較小,
  • 支持JS交互
  • 支持HTML5 新特性
  • 可以添加進(jìn)度條(然并卵,不好用,還是習(xí)慣第三方的)。
  • 支持內(nèi)建手勢,
  • 據(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];

最后是發(fā)出請(qǐng)求,否則會(huì)發(fā)生監(jiān)控不生效的問題

 

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • iOS實(shí)現(xiàn)圖片保存與搜索功能

    iOS實(shí)現(xiàn)圖片保存與搜索功能

    這篇文章主要介紹了iOS實(shí)現(xiàn)圖片保存與搜索功能的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • iOS開發(fā)多線程下全局變量賦值崩潰原理詳解

    iOS開發(fā)多線程下全局變量賦值崩潰原理詳解

    這篇文章主要為大家介紹了iOS開發(fā)多線程下全局變量賦值崩潰原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • iOS實(shí)現(xiàn)列表折疊效果

    iOS實(shí)現(xiàn)列表折疊效果

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)列表折疊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • iOS常用加密算法介紹和代碼實(shí)踐

    iOS常用加密算法介紹和代碼實(shí)踐

    這篇文章主要為大家詳細(xì)介紹了iOS常用加密算法介紹和代碼實(shí)踐,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • IOS文件的簡單讀寫實(shí)例詳解

    IOS文件的簡單讀寫實(shí)例詳解

    這篇文章主要介紹了IOS文件的簡單讀寫實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • iOS在狀態(tài)欄上顯示提醒信息的功能定制

    iOS在狀態(tài)欄上顯示提醒信息的功能定制

    這篇文章主要給大家介紹了iOS在狀態(tài)欄上顯示提醒信息的相關(guān)資料,實(shí)現(xiàn)后的效果非常不錯(cuò),文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-06-06
  • iOS中FMDB數(shù)據(jù)庫之增刪改查使用實(shí)例

    iOS中FMDB數(shù)據(jù)庫之增刪改查使用實(shí)例

    本篇文章主要介紹了iOS中FMDB數(shù)據(jù)庫之增刪改查使用實(shí)例,F(xiàn)MDB是一個(gè)輕量級(jí)的數(shù)據(jù)庫,用于將網(wǎng)絡(luò)資源存儲(chǔ)在本地。
    2017-05-05
  • iOS 10自定義相機(jī)功能

    iOS 10自定義相機(jī)功能

    這篇文章主要為大家詳細(xì)介紹了iOS 10自定義相機(jī)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • iOS文件預(yù)覽分享小技能示例

    iOS文件預(yù)覽分享小技能示例

    這篇文章主要為大家介紹了iOS文件預(yù)覽分享小技能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • iOS UICollectionView刷新時(shí)閃屏的解決方法

    iOS UICollectionView刷新時(shí)閃屏的解決方法

    本篇文章主要介紹了iOS UICollectionView刷新時(shí)閃屏的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11

最新評(píng)論

当阳市| 安福县| 凤城市| 丽江市| 琼中| 如东县| 洛宁县| 甘谷县| 泾阳县| 武清区| 凤山县| 凤翔县| 辽中县| 蕲春县| 定安县| 陆川县| 扎鲁特旗| 平舆县| 苏尼特右旗| 湖口县| 田林县| 德清县| 顺平县| 会同县| 安塞县| 项城市| 稻城县| 蚌埠市| 泰顺县| 临沭县| 五莲县| 黄梅县| 克拉玛依市| 襄樊市| 邵东县| 望江县| 前郭尔| 康保县| 汕头市| 陇南市| 桐柏县|