贴上代码:

#import "MJWebVC.h"//Libs
#import <WebKit/WebKit.h>@interface MJWebVC ()<WKNavigationDelegate, WKUIDelegate>@property(nonatomic, strong) WKWebView *webView;
@property(nonatomic, strong) UIProgressView *progress;@end@implementation MJWebVC- (void)viewDidLoad {[super viewDidLoad];NSString *url = [NSString stringWithFormat:@"%@?accessToken=%@", self.urlStr, kRT];[self loadRequestWithUrlString:url];//TODO:kvo监听,获得页面title和加载进度值[self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:NULL];[self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];[self.view addSubview:self.webView];[self.view addSubview:self.progress];
}- (void)loadRequestWithUrlString:(NSString *)urlString {// 在此处获取返回的cookieNSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];for (NSHTTPCookie *cookie in [cookieJar cookies]) {[cookieDic setObject:cookie.value forKey:cookie.name];}// cookie重复,先放到字典进行去重,再进行拼接for (NSString *key in cookieDic) {NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];[cookieValue appendString:appendString];}NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];[request addValue:cookieValue forHTTPHeaderField:@"Cookie"];[self.webView loadRequest:request];
}#pragma mark - *************** 监听- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {//加载进度值if ([keyPath isEqualToString:@"estimatedProgress"]) {if (object == self.webView) {[self.progress setAlpha:1.0f];[self.progress setProgress:self.webView.estimatedProgress animated:YES];if(self.webView.estimatedProgress >= 1.0f) {[UIView animateWithDuration:0.5f delay:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{[self.progress setAlpha:0.0f];} completion:^(BOOL finished) {[self.progress setProgress:0.0f animated:NO];}];}} else {[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];}} else if ([keyPath isEqualToString:@"title"]) {//网页titleif (object == self.webView) {self.navigationItem.title = self.webView.title;} else {[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];}} else {[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];}
}#pragma mark - *************** 销毁的时候,一定要移除监听- (void)dealloc {[self.webView removeObserver:self forKeyPath:@"estimatedProgress"];[self.webView removeObserver:self forKeyPath:@"title"];}#pragma mark - *************** WKNavigationDelegate代理- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {}- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation {}// 页面开始加载时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {}// 当内容开始返回时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {}- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {}- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error {}#pragma mark - *************** lazy load- (WKWebView *)webView {if (!_webView) {_webView = [[WKWebView alloc] initWithFrame:self.view.bounds];_webView.navigationDelegate = self;_webView.UIDelegate = self;}return _webView;
}- (UIProgressView *)progress {if (!_progress) {_progress = [[UIProgressView alloc]initWithFrame:CGRectMake(0, 64, MJScreenWidth, 2)];_progress.tintColor = [UIColor blueColor];_progress.backgroundColor = [UIColor lightGrayColor];}return _progress;
}@end
复制代码

另外附上其他需要cookie请求的代码:

AFNetworking:

// 获取AFHTTPRequestOperationManagerAFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];// 创建可变字典用于存放CookieNSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];// 存放新添加的cookie#warning 单个的Cookie还好,但是楼主在工厂类方法中拼接了一个包含6个设备信息的value值,最后忘记加分号了,测试也没测出来#warning 因为不影响功能,但是后面的cookie就自动拼接上了,H5那边也识别不到,险造成重大事故(涉及金融。。),望后来者看到,提前做好准备(就凭这个坑,你得给我个赞)NSMutableString *cookieValue = [NSMutableString stringWithFormat:@"fromapp=ios;"];// 获取NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];for (NSHTTPCookie *cookie in [cookieJar cookies]) {[cookieDic setObject:cookie.value forKey:cookie.name];}// cookie重复,先放到字典去重,再进行拼接for (NSString *key in cookieDic) {NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];[cookieValue appendString:appendString];}// 将cookie存到请求头中[operationManager.requestSerializer setValue:cookieValue forHTTPHeaderField:@"Cookie"];//  拼接url地址NSString *urlStr = [NSString stringWithFormat:@"%@%@", kHostIP, kPath];// 设置参数字典NSDictionary *paraDict = @{@"key" : value};// 发送请求,处理结果[operationManager POST:urlStr parameters:paraDict success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {NSLog(@"responseObject-->%@", responseObject);} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {NSLog(@"error-->%@", error);}];
复制代码

WKWebView:

如果WKWebView在加载url的时候需要添加cookie,需要先手动获取当前NSHTTPCookieStorage中的所有cookie,然后将cookie放到NSMutableURLRequest请求头中

- (void)loadRequestWithUrlString:(NSString *)urlString {// 在此处获取返回的cookieNSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];for (NSHTTPCookie *cookie in [cookieJar cookies]) {[cookieDic setObject:cookie.value forKey:cookie.name];}// cookie重复,先放到字典进行去重,再进行拼接for (NSString *key in cookieDic) {NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];[cookieValue appendString:appendString];}NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];[request addValue:cookieValue forHTTPHeaderField:@"Cookie"];[self loadRequest:request];
}
复制代码

UIWebView:

// 工厂类中存储cookie的方法
+ (void)saveCookies {// 创建一个可变字典存放cookieNSMutableDictionary *fromappDict = [NSMutableDictionary dictionary];[fromappDict setObject:@"fromapp" forKey:NSHTTPCookieName];[fromappDict setObject:@"ios" forKey:NSHTTPCookieValue];// kDomain是公司app网址[fromappDict setObject:kDomain forKey:NSHTTPCookieDomain];[fromappDict setObject:kDomain forKey:NSHTTPCookieOriginURL];[fromappDict setObject:@"/" forKey:NSHTTPCookiePath];[fromappDict setObject:@"0" forKey:NSHTTPCookieVersion];// 将可变字典转化为cookieNSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:fromappDict];// 获取cookieStorageNSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]// 存储cookie[cookieStorage setCookie:cookie];
}
复制代码
注意:
  • UIWebView使用时间较长,只要在cookieStorage中设置了相应的cookie,每次就会自动带上;
  • 但是这样的弊端是随着与H5的交互增加,Cookie占用的空间越来越大,每次交互都夹带大量的cookie,不仅增加服务器端压力,也浪费用户的流量。比如每次交互都夹带5kb的cookie内容,但是真正用到的只有两三百字节。

后记:吃水不忘挖井人,感谢si1ence提供的帮助!

WKWebView之cookie请求相关推荐

  1. WKWebView设置Cookie

    需求分析 后端需要传Cookie值 思路 使用HTTPCookieStorage缓存Cookie 在webView:decidePolicyForNavigationAction:decisionHa ...

  2. android okhttp使用cookie请求

    今天,简单讲讲Android的http使用cookie请求. 现在,做一个功能,出现一个奇怪现象,就是老是登陆成功后,发送请求获取消息,老是提示我没有登陆.我自己都不知道是什么原因,这个也是我对网络通 ...

  3. Network下方什么请求也没有_利用postman进行接口测试并发送带cookie请求的方法

    顾翔老师的<软件测试技术实战设计.工具及管理>网上购买地址: https://item.jd.com/34295655089.html <基于Django的电子商务网站>网上购 ...

  4. Python3带着cookie请求登录

    历经了几天的煎熬,终于学会带着cookie请求网页了,以模拟登陆饿了么网站并获取地址附近商家名称为例子.这几天一直模拟登录不了,今天才发现是请求中的一个url弄错了..... import os,ba ...

  5. python发送cookie请求_Python中实现带Cookie的Http的Post请求

    已经实现了如何获得对应的cookie,具体参考: [已解决]Python中如何获得访问网页所返回的cookie 现在想要把已获得cookie,在http的提交post请求的时候,也同时发送过去. 即, ...

  6. 设置Cookie请求头报错(Refused to set unsafe header “Cookie“)

    请求的header匹配以下不安全字符时,将被终止,具体参考如下: Accept-CharsetAccept-EncodingConnectionContent-LengthCookieCookie2C ...

  7. .net session 有效时间_Python中requests模拟登录的三种方式(携带cookie/session进行请求网站)...

    这篇文章主要介绍了python中requests模拟登录的三种方式(携带cookie/session进行请求网站),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋 ...

  8. java接口自动化-post请求获取不到cookie问题解决

    一.问题描述 在做自动化测试时,有两个测试方法,loginTrue方法和addUser方法,原则上只有loginTrue方法执行成功获取到cookie,并存储到TestConfig的静态对象cooki ...

  9. http请求什么时候会带上cookie信息

    从上面两个图我们可以看出,虽然浏览器端有cookie,为什么在发送list请求时没有把本地的cookie带上呢,再看下面的截图: 上面两个截图我们可以看出,上面的list请求带上了Cookie信息,那 ...

最新文章

  1. C语言经典例35-字符串反转
  2. 多平台支持:下一步容器技术热点
  3. 是什么狙杀了ERP实施成功?
  4. REDIS故障排查工具
  5. PHP在金山游戏运营中的应用
  6. 啊哈java_1.桶排序——啊哈算法java实现
  7. CAP 原则与 BASE 理论
  8. 网络集成方案_用户需要的综合性解决方案:网络安全架构集成的价值凸显
  9. Sentinel 实战应用中的小技巧
  10. 【优化预测】基于matlab差分进化算法优化BP神经网络预测【含Matlab源码 1315期】
  11. Illustrator CS4 序列号
  12. 260. 只出现一次的数字 III【我亦无他唯手熟尔】
  13. 啤酒肚真的是喝啤酒引起的吗?
  14. 哐筹甍颚往往能够用它实现
  15. 小白入门python教程自学python
  16. Axure视频教程2:制作第一个原型
  17. 计算机上下打字怎么打,电脑打字符号怎么打底下的一横
  18. 银行服务器销售业务,利用呼叫中心进行远程销售
  19. 考研英语单词-近义词分类-Fifth Day
  20. 软件测试行业前景怎么样

热门文章

  1. python字符串内建函数详解
  2. oracle 12c创建归档,实测创建 Oracle 12C Dataguard
  3. Redis之跳跃表(面试重点容易考)
  4. print 和 printf 和 println
  5. html在线压缩tar.gz源码,c50_melp.tar.gz美国2400语音压缩编码算法,文件…
  6. springboot mybatis 事务_SpringBoot 下 Mybatis 的缓存
  7. GraphViz :1 安装和简单使用
  8. case when的判断顺序_CASE 表达式
  9. 怎么测内阻 恒压源_测电压表内阻的六种方法
  10. 百度广告点击软件_网络营销百问百答之64,如何提升企业百度广告点击率