日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

iOS WKWebview 白屏檢測實現的示例

瀏覽:133日期:2022-09-17 08:22:41

前言

自ios8推出wkwebview以來,極大改善了網頁加載速度及內存泄漏問題,逐漸全面取代笨重的UIWebview。盡管高性能、高刷新的WKWebview在混合開發中大放異彩表現優異,但加載網頁過程中出現異常白屏的現象卻仍然屢見不鮮,且現有的api協議處理捕捉不到這種異常case,造成用戶無用等待體驗很差。 針對業務場景需求,實現加載白屏檢測。考慮采用字節跳動團隊提出的webview優化技術方案。在合適的加載時機對當前webview可視區域截圖,并對此快照進行像素點遍歷,如果非白屏顏色的像素點超過一定的閾值,認定其為非白屏,反之重新加載請求。

獲取快照

ios官方提供了簡易的獲取webview快照接口,通過異步回調拿到當前可視區域的屏幕截圖。

- (void)takeSnapshotWithConfiguration:(nullable WKSnapshotConfiguration *)snapshotConfiguration completionHandler:(void (^)(UIImage * _Nullable snapshotImage, NSError * _Nullable error))completionHandler API_AVAILABLE(ios(11.0));

其中snapshotConfiguration 參數可用于配置快照大小范圍,默認截取當前客戶端整個屏幕區域。由于可能出現導航欄成功加載而內容頁卻空白的特殊情況,導致非白屏像素點數增加對最終判定結果造成影響,考慮將其剔除。

- (void)judgeLoadingStatus:(WKWebView *)webview { if (@available(iOS 11.0, *)) { if (webView && [webView isKindOfClass:[WKWebView class]]) { CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; //狀態欄高度 CGFloat navigationHeight = webView.viewController.navigationController.navigationBar.frame.size.height; //導航欄高度 WKSnapshotConfiguration *shotConfiguration = [[WKSnapshotConfiguration alloc] init]; shotConfiguration.rect = CGRectMake(0, statusBarHeight + navigationHeight, _webView.bounds.size.width, (_webView.bounds.size.height - navigationHeight - statusBarHeight)); //僅截圖檢測導航欄以下部分內容 [_webView takeSnapshotWithConfiguration:shotConfiguration completionHandler:^(UIImage * _Nullable snapshotImage, NSError * _Nullable error) {//todo }]; } }}

縮放快照

為了提升檢測性能,考慮將快照縮放至1/5,減少像素點總數,從而加快遍歷速度。

- (UIImage *)scaleImage: (UIImage *)image { CGFloat scale = 0.2; CGSize newsize; newsize.width = floor(image.size.width * scale); newsize.height = floor(image.size.height * scale); if (@available(iOS 10.0, *)) { UIGraphicsImageRenderer * renderer = [[UIGraphicsImageRenderer alloc] initWithSize:newsize]; return [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) { [image drawInRect:CGRectMake(0, 0, newsize.width, newsize.height)]; }]; }else{ return image; }}

縮小前后性能對比(實驗環境:iPhone11同一頁面下):

縮放前白屏檢測:

iOS WKWebview 白屏檢測實現的示例

iOS WKWebview 白屏檢測實現的示例

耗時20ms

縮放后白屏檢測:

iOS WKWebview 白屏檢測實現的示例

iOS WKWebview 白屏檢測實現的示例

耗時13ms

注意這里有個小坑。由于縮略圖的尺寸在 原圖寬高*縮放系數后可能不是整數,在布置畫布重繪時默認向上取整,這就造成畫布比實際縮略圖大(混蛋啊 摔!)。在遍歷縮略圖像素時,會將圖外畫布上的像素納入考慮范圍,導致實際白屏頁 像素占比并非100% 如圖所示。因此使用floor將其尺寸大小向下取整。

遍歷快照

遍歷快照縮略圖像素點,對白色像素(R:255 G: 255 B: 255)占比大于95%的頁面,認定其為白屏。

- (BOOL)searchEveryPixel:(UIImage *)image { CGImageRef cgImage = [image CGImage]; size_t width = CGImageGetWidth(cgImage); size_t height = CGImageGetHeight(cgImage); size_t bytesPerRow = CGImageGetBytesPerRow(cgImage); //每個像素點包含r g b a 四個字節 size_t bitsPerPixel = CGImageGetBitsPerPixel(cgImage); CGDataProviderRef dataProvider = CGImageGetDataProvider(cgImage); CFDataRef data = CGDataProviderCopyData(dataProvider); UInt8 * buffer = (UInt8*)CFDataGetBytePtr(data); int whiteCount = 0; int totalCount = 0; for (int j = 0; j < height; j ++ ) { for (int i = 0; i < width; i ++) { UInt8 * pt = buffer + j * bytesPerRow + i * (bitsPerPixel / 8); UInt8 red = * pt; UInt8 green = *(pt + 1); UInt8 blue = *(pt + 2);// UInt8 alpha = *(pt + 3); totalCount ++; if (red == 255 && green == 255 && blue == 255) {whiteCount ++; } } } float proportion = (float)whiteCount / totalCount ; NSLog(@'當前像素點數:%d,白色像素點數:%d , 占比: %f',totalCount , whiteCount , proportion ); if (proportion > 0.95) { return YES; }else{ return NO; }}

總結

typedef NS_ENUM(NSUInteger,webviewLoadingStatus) { WebViewNormalStatus = 0, //正常 WebViewErrorStatus, //白屏 WebViewPendStatus, //待決};// 判斷是否白屏- (void)judgeLoadingStatus:(WKWebview *)webview withBlock:(void (^)(webviewLoadingStatus status))completionBlock{ webviewLoadingStatus __block status = WebViewPendStatus; if (@available(iOS 11.0, *)) { if (webview && [webview isKindOfClass:[WKWebView class]]) { CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; //狀態欄高度 CGFloat navigationHeight = webview.viewController.navigationController.navigationBar.frame.size.height; //導航欄高度 WKSnapshotConfiguration *shotConfiguration = [[WKSnapshotConfiguration alloc] init]; shotConfiguration.rect = CGRectMake(0, statusBarHeight + navigationHeight, webview.bounds.size.width, (webview.bounds.size.height - navigationHeight - statusBarHeight)); //僅截圖檢測導航欄以下部分內容 [webview takeSnapshotWithConfiguration:shotConfiguration completionHandler:^(UIImage * _Nullable snapshotImage, NSError * _Nullable error) {if (snapshotImage) { CGImageRef imageRef = snapshotImage.CGImage; UIImage * scaleImage = [self scaleImage:snapshotImage]; BOOL isWhiteScreen = [self searchEveryPixel:scaleImage]; if (isWhiteScreen) { status = WebViewErrorStatus; }else{ status = WebViewNormalStatus; }}if (completionBlock) { completionBlock(status);} }]; } }}// 遍歷像素點 白色像素占比大于95%認定為白屏- (BOOL)searchEveryPixel:(UIImage *)image { CGImageRef cgImage = [image CGImage]; size_t width = CGImageGetWidth(cgImage); size_t height = CGImageGetHeight(cgImage); size_t bytesPerRow = CGImageGetBytesPerRow(cgImage); //每個像素點包含r g b a 四個字節 size_t bitsPerPixel = CGImageGetBitsPerPixel(cgImage); CGDataProviderRef dataProvider = CGImageGetDataProvider(cgImage); CFDataRef data = CGDataProviderCopyData(dataProvider); UInt8 * buffer = (UInt8*)CFDataGetBytePtr(data); int whiteCount = 0; int totalCount = 0; for (int j = 0; j < height; j ++ ) { for (int i = 0; i < width; i ++) { UInt8 * pt = buffer + j * bytesPerRow + i * (bitsPerPixel / 8); UInt8 red = * pt; UInt8 green = *(pt + 1); UInt8 blue = *(pt + 2);// UInt8 alpha = *(pt + 3); totalCount ++; if (red == 255 && green == 255 && blue == 255) {whiteCount ++; } } } float proportion = (float)whiteCount / totalCount ; NSLog(@'當前像素點數:%d,白色像素點數:%d , 占比: %f',totalCount , whiteCount , proportion ); if (proportion > 0.95) { return YES; }else{ return NO; }}//縮放圖片- (UIImage *)scaleImage: (UIImage *)image { CGFloat scale = 0.2; CGSize newsize; newsize.width = floor(image.size.width * scale); newsize.height = floor(image.size.height * scale); if (@available(iOS 10.0, *)) { UIGraphicsImageRenderer * renderer = [[UIGraphicsImageRenderer alloc] initWithSize:newsize]; return [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) { [image drawInRect:CGRectMake(0, 0, newsize.width, newsize.height)]; }]; }else{ return image; }}

僅需在合適的view生命周期內回調使用該函數方法即可檢測出頁面狀態是否白屏,且性能損耗可忽略不計。

聲明

作者:BBTime鏈接:https://juejin.im/post/6885298718174609415

以上就是iOS WKWebview 白屏檢測實現的示例的詳細內容,更多關于iOS WKWebview 白屏檢測的資料請關注好吧啦網其它相關文章!

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品一区二区三区中文 | 国产精品13p| 综合精品一区| 亚洲在线国产日韩欧美| 久久精品影视| 色婷婷精品视频| 欧美成a人片免费观看久久五月天| 在线精品视频一区| 免费看的黄色欧美网站| 欧美日韩18| 日韩在线观看中文字幕| 性欧美长视频| 视频一区二区中文字幕| 亚洲激情中文| 日韩视频久久| 在线综合亚洲| 免费成人在线视频观看| 男人的天堂亚洲一区| 伊人成人在线视频| 岛国av在线网站| 国产精品4hu.www| 久久免费视频66| 精品一区二区三区亚洲| 久久精品三级| 国产欧美日韩影院| 国产精品自拍区| 欧美极品一区二区三区| 精品视频99| 特黄毛片在线观看| 国产高清一区| 日韩一区二区中文| 精品三级av在线导航| 国产精品精品国产一区二区| 亚洲a一区二区三区| 夜夜嗨网站十八久久| 亚洲精品极品| 国产精品久久久久77777丨| 给我免费播放日韩视频| 欧美天堂视频| 亚洲精品在线影院| 亚洲国产综合在线看不卡| 亚洲二区免费| 综合欧美精品| 国产精品1luya在线播放| 韩国久久久久久| 国产视频一区免费看| 国产免费播放一区二区| www成人在线视频| 免费人成网站在线观看欧美高清| 欧美片第1页综合| 午夜av不卡| 亚洲综合五月| 成人亚洲精品| 亚洲视频播放| 丝袜美腿亚洲色图| 国产日本精品| 日韩免费小视频| 蜜桃视频一区二区| 国产aa精品| 视频在线在亚洲| 国产一区精品福利| 亚洲一二av| 桃色一区二区| 国产日产一区| 免费国产自久久久久三四区久久 | 亚洲精品字幕| 成人精品久久| 国产专区一区| 国产精品欧美在线观看| 国产在线日韩| 国产乱码精品一区二区亚洲| 日韩电影免费网站| 欧美天堂在线| 美女网站一区| 久久这里只有| 日韩精品一二三四| 国产夫妻在线| 日韩中文字幕| 成人福利av| 91嫩草精品| 91久久午夜| caoporn视频在线| 亚洲一区欧美激情| 国产一区二区精品久| 亚洲欧美在线专区| 99久久久久国产精品| 国产欧美日韩影院| 亚洲欧美日韩综合国产aⅴ| 国产在线观看www| 国产亚洲电影| 日韩在线观看一区二区| 中文在线а√在线8| 日韩区欧美区| 国产亚洲精品v| 私拍精品福利视频在线一区| 精品日产乱码久久久久久仙踪林| 一区二区三区网站| 999久久久精品国产| 久久精品国产精品亚洲毛片| 亚洲精品影院在线观看| 欧美.日韩.国产.一区.二区 | 99精品电影| 欧美日韩第一| 亚洲精品四区| 国内亚洲精品| 日韩精品久久理论片| 久久99免费视频| 亚洲一区二区av| 免费观看久久av| 午夜影院一区| 福利精品一区| 日韩欧美2区| 香蕉人人精品| 日本精品黄色| 久久精品网址| 精品国产精品国产偷麻豆| 日韩va欧美va亚洲va久久| 久久亚洲不卡| 免费美女久久99| 日韩在线观看一区二区| 视频一区免费在线观看| 免费在线观看视频一区| 久久成人国产| 久久国产88| 免费成人性网站| 日韩有吗在线观看| 午夜在线播放视频欧美| 日韩影院在线观看| 日韩在线麻豆| 热久久久久久| 欧美久久精品| 欧美亚洲三区| 国产精品黄色片| 国产三级一区| 国产精品欧美三级在线观看| 国产精品v一区二区三区| 国产精品天天看天天狠| 欧美天堂一区二区| 国产精品地址| 捆绑调教美女网站视频一区| 免费亚洲婷婷| 日韩综合精品| 欧美日一区二区| 男人的天堂久久精品| 国产精品蜜月aⅴ在线| 久久精品导航| 国产欧美综合一区二区三区| 日韩三区在线| 青青国产精品| 亚洲午夜久久久久久尤物| 日韩精品第一| 欧美成人精品三级网站| 中文字幕av一区二区三区人| 日韩毛片视频| 欧美综合社区国产| 99精品综合| 日韩激情综合| 亚洲天堂成人| 久久久免费人体| 免费人成网站在线观看欧美高清| 国产成人免费视频网站视频社区| 美美哒免费高清在线观看视频一区二区| 国内精品伊人| 青草久久视频| 国产精品毛片| 成人午夜国产| 麻豆91精品视频| 最新亚洲国产| 国产一区亚洲| 福利一区二区免费视频| 欧美日韩黄网站| 亚洲成人免费| 国产aa精品| 国产精品综合色区在线观看| 宅男噜噜噜66国产日韩在线观看| 精品日韩一区| 国产日产一区| 亚洲日本国产| 亚洲免费激情| 久久久天天操| 久久久久免费| 国产毛片久久久| 一二三区精品| 欧美精品一区二区久久| 国产不卡精品| 免费亚洲一区| 日本va欧美va欧美va精品| 午夜久久福利| 欧美精品一二| 久久精品观看| 日产精品一区| 国产拍在线视频| 久久精品国产精品亚洲毛片| 91麻豆精品激情在线观看最新| 9国产精品视频| 狠狠干综合网| 图片区亚洲欧美小说区| 免费视频一区三区| 国产一区清纯| 美女少妇全过程你懂的久久|