iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >iOS中WKWebView的一些特殊使用总结
  • 937
分享到

iOS中WKWebView的一些特殊使用总结

ioswkwebview特殊 2022-05-23 09:05:04 937人浏览 泡泡鱼
摘要

前言 现在大部分的app只支持iOS8以上的系统了,在接入H5时可以只管最新的WKWEBView了。 WKWebView的优势 性能高,稳定性好,占用的内存比较小, 支持

前言

现在大部分的app只支持iOS8以上的系统了,在接入H5时可以只管最新的WKWEBView了。

WKWebView的优势

  • 性能高,稳定性好,占用的内存比较小,
  • 支持js交互
  • 支持HTML5 新特性
  • 可以添加进度条(然并卵,不好用,还是习惯第三方的)。
  • 支持内建手势,
  • 据说高达60fps的刷新频率(不卡)

本文将给大家总结ioS中WKWebView的一些特殊使用,下面话不多说了,来一起看看详细的介绍吧

WKWebView 加载本地网页的方式

直接加载字符串


- (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 可以用来控制请求权限

加载本地文件


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

重定向请求

通过 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]];

通过第三方库 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];

最后是发出请求,否则会发生监控不生效的问题

 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程网的支持。

--结束END--

本文标题: iOS中WKWebView的一些特殊使用总结

本文链接: https://www.lsjlt.com/news/30249.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • iOS中WKWebView的一些特殊使用总结
    前言 现在大部分的app只支持iOS8以上的系统了,在接入H5时可以只管最新的WKWebView了。 WKWebView的优势 性能高,稳定性好,占用的内存比较小, 支持...
    99+
    2022-05-23
    ios wkwebview 特殊
  • Shell中特殊字符的用法总结大全
    前言 众所周知shell既是类Unix操作系统的命令解析器,用于解释执行用户输入的一连串命令,它类似于DOS下的command和后来Windows的cmd.exe。同时shell也是一种程序设计语言。作为命...
    99+
    2022-06-04
    特殊字符 大全 Shell
  • Python在画图时使用特殊符号的方法总结
    目录一、问题背景二、注意事项三、常见特殊符号及对应代码四、引入特殊符号的万能方法本文总结了python画图中使用各种特殊符号方式 一、问题背景 在论文中,如何使用特殊符号进行表示?这...
    99+
    2022-11-10
  • shell脚本中28个特殊字符的作用简明总结
    1. #注释作用, #! 除外此外, 在参数替换 echo ${PATH#*:} 这里不表示注释, 数制转换, 不表示注释 echo $((2#101011)) 2. ; 命令行分隔符, 可以在一行中写多个...
    99+
    2022-06-04
    简明 脚本 特殊字符
  • 详解JavaScript中数组的一些特殊用法
    目录前言基本介绍数组类型和判断判断为数组的方式数组索引值和长度索引值是字符串索引值为小数、负数索引值是字符串等其他类型时索引与属性length属性数组的最大长度创建数组的三种方式数组...
    99+
    2023-02-20
    JavaScript数组特殊用法 JavaScript数组用法 JavaScript数组
  • mongodb使用方面的一些总结
    所有查询写入尽量都带上一个超时时间大量写入时,使用批量接口建索引尽量指定为后台执行索引建得太多,对写入性能会有一定影响,所以建索引时,以能覆盖大部分数据的几个公共字段为准。确实有需要再加上一些没有覆盖到的字...
    99+
    2022-10-18
  • CSS中一些特殊的上下文选择符的用法
    这篇文章主要讲解了“CSS中一些特殊的上下文选择符的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS中一些特殊的上下文选择符的用法”吧!子选择符 &...
    99+
    2022-10-19
  • Java8新特性Lambda表达式的一些复杂用法总结
    简介lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的“函数式编程”。 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一...
    99+
    2023-05-31
    java8 lambda表达式 ava
  • java中optional的一些常用方法总结
    目录前言1. 创建Optional对象2. 获取Optional对象的值3. 判断Optional对象是否包含非空值4. 获取Optional对象中的值或默认值5. 获取Option...
    99+
    2023-05-14
    java中optional的用法 java optional类 java中optional
  • Linux中常用的一些grep命令总结
    本篇内容主要讲解“Linux中常用的一些grep命令总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux中常用的一些grep命令总结”吧!概述:所有的类linux系统都会提供一个名为gr...
    99+
    2023-06-13
  • shell脚本中常见的一些特殊符号和作用有哪些
    这篇文章主要讲解了“shell脚本中常见的一些特殊符号和作用有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell脚本中常见的一些特殊符号和作用有哪些”吧!1、{} 大括号:用法一:...
    99+
    2023-06-09
  • springboot中一些比较常用的注解总结
    springboot常用注解 1、@SpringBootApplication 这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 S...
    99+
    2022-11-12
  • 在Java中Collection的一些常用方法总结
    Java中Collection的常用方法 1、add() 向中添加元素 add(100) 自动装箱操作,实际上是放进去的一个对象, Integer n = new Integer(...
    99+
    2022-11-12
  • CSS中一些常用的文本属性总结
    这篇文章主要介绍“CSS中一些常用的文本属性总结”,在日常操作中,相信很多人在CSS中一些常用的文本属性总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS中一些常用的文...
    99+
    2022-10-19
  • shell脚本中常见的一些特殊符号和作用详解
    在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1、{} 大括号: 用法一:通配符扩展 eg: ls my_{finger...
    99+
    2022-06-04
    详解 脚本 常见
  • Linux中mv命令的特殊使用方法有哪些
    这篇文章主要介绍“Linux中mv命令的特殊使用方法有哪些”,在日常操作中,相信很多人在Linux中mv命令的特殊使用方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中mv命令的特殊使用方法...
    99+
    2023-06-27
  • 总结一下关于在Java8中使用stream流踩过的一些坑
    Java8的stream流 第一个坑: Collectors.toAsList()其实是new了一个list,在向里面赋值。 注意这里Collectors.toList()的写法,...
    99+
    2022-11-12
  • 使用pytorch时所遇到的一些问题总结
    使用pytorch时所遇到的问题总结 1、ubuntu vscode切换虚拟环境 在ubuntu系统上,配置工作区文件夹所使用的虚拟环境。之前笔者误以为只需要在vscode内置的终端...
    99+
    2022-11-12
  • Android App使用SQLite数据库的一些要点总结
    /DATA/data/包名/databases是该程序存放数据的目录,DATA是Environment.getDataDirectory() 方法返回的路径。找到数据库之后可以...
    99+
    2022-06-06
    app sqlite数据库 SQLite Android
  • 【整理总结】一些php中常用的内置函数
    作为一个广泛使用的编程语言,PHP有许多内置函数可供使用。在编码过程中,掌握这些函数可以使开发人员更快速、高效地编写代码。本文将探讨 PHP 中常用的一些函数。一、字符串处理函数strlen(string $string):获取字符串长度该...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作