电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

iOS WKWebview 白屏檢測實現(xiàn)的示例

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

前言

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

獲取快照

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

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

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

- (void)judgeLoadingStatus:(WKWebView *)webview { if (@available(iOS 11.0, *)) { if (webView && [webView isKindOfClass:[WKWebView class]]) { CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; //狀態(tài)欄高度 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,減少像素點總數(shù),從而加快遍歷速度。

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

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

縮放前白屏檢測:

iOS WKWebview 白屏檢測實現(xiàn)的示例

iOS WKWebview 白屏檢測實現(xiàn)的示例

耗時20ms

縮放后白屏檢測:

iOS WKWebview 白屏檢測實現(xiàn)的示例

iOS WKWebview 白屏檢測實現(xiàn)的示例

耗時13ms

注意這里有個小坑。由于縮略圖的尺寸在 原圖寬高*縮放系數(shù)后可能不是整數(shù),在布置畫布重繪時默認向上取整,這就造成畫布比實際縮略圖大(混蛋啊 摔!)。在遍歷縮略圖像素時,會將圖外畫布上的像素納入考慮范圍,導致實際白屏頁 像素占比并非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 四個字節(jié) 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(@'當前像素點數(shù):%d,白色像素點數(shù):%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; //狀態(tài)欄高度 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 四個字節(jié) 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(@'當前像素點數(shù):%d,白色像素點數(shù):%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生命周期內回調使用該函數(shù)方法即可檢測出頁面狀態(tài)是否白屏,且性能損耗可忽略不計。

聲明

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

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

標簽: IOS
相關文章:
主站蜘蛛池模板: 在线PH计-氧化锆分析仪-在线浊度仪-在线溶氧仪- 无锡朝达 | 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 尊享蟹太太美味,大闸蟹礼卡|礼券|礼盒在线预订-蟹太太官网 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 培训中心-翰香原香酥板栗饼加盟店总部-正宗板栗酥饼技术 | 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 赛尔特智能移动阳光房-阳光房厂家-赛尔特建筑科技(广东)有限公司 | 广东之窗网| 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 上海logo设计| 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 高低温试验房-深圳高低温湿热箱-小型高低温冲击试验箱-爱佩试验设备 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 耐热钢-耐磨钢-山东聚金合金钢铸造有限公司 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 |