###1、同步cookie 工具类

@interface WKCookieSyncManager : NSObject@property (nonatomic, strong) WKProcessPool *processPool;
@property (nonatomic, assign) BOOL loginCookieHasBeenSynced;+ (instancetype)sharedWKCookieSyncManager;+ (NSMutableArray<NSString *> *)cookieJavaScriptArray;- (void)setCookies:(NSArray<NSHTTPCookie *> *)cookies forDomain:(NSString *)domain;- (NSArray<NSHTTPCookie *> *)cookies;- (void)removeCookies;- (void)cookiesSyncForWebsiteDataStore:(void(^)(WKWebsiteDataStore *dataStore))completion;+ (void)syncCookieFromWebView:(WKWebView *)webView navigationResponse:(WKNavigationResponse *)navigationResponse;@end
复制代码

WKCookieSyncManager implementation

@interface WKCookieSyncManager () <WKNavigationDelegate>@property (nonatomic, copy) NSString *domain;
@property (nonatomic, strong) dispatch_group_t cookieSyncGroup;@end@implementation WKCookieSyncManager+ (instancetype)sharedWKCookieSyncManager {static WKCookieSyncManager *sharedWKCookieSyncManagerInstance = nil;static dispatch_once_t predicate;dispatch_once(&predicate, ^{sharedWKCookieSyncManagerInstance = [[self alloc] init];});return sharedWKCookieSyncManagerInstance;
}- (WKProcessPool *)processPool {if (!_processPool) {static dispatch_once_t predicate;dispatch_once(&predicate, ^{_processPool = [[WKProcessPool alloc] init];});}return _processPool;
}- (instancetype)init {self = [super init];if (self) {_domain = @"your domain";_cookieSyncGroup = dispatch_group_create();}return self;
}+ (NSMutableArray<NSString *> *)cookieJavaScriptArray {NSMutableArray<NSString *> *cookieStrings = [[NSMutableArray alloc] init];NSArray *cookies = [[WKCookieSyncManager sharedWKCookieSyncManager] cookies];for (NSHTTPCookie *cookie in cookies) {NSString *excuteJSString = [NSString stringWithFormat:@"%@=%@;", cookie.name, cookie.value];if (cookie.domain.length > 0) {excuteJSString = [excuteJSString stringByAppendingFormat:@"domain=%@;", cookie.domain];}if (cookie.path.length > 0) {excuteJSString = [excuteJSString stringByAppendingFormat:@"path=%@;", cookie.path];}if (cookie.expiresDate != nil) {excuteJSString = [excuteJSString stringByAppendingFormat:@"expires=%@;", cookie.expiresDate];}if (cookie.secure) {excuteJSString = [excuteJSString stringByAppendingString:@"secure=true"];}[cookieStrings addObject:excuteJSString];NSLog(@"cookie to be set = %@", excuteJSString);}// 检查cookie的数量,正常的应该是 7 个NSLog(@"cookieJavaScriptArray.cookie.length = %ld", cookieStrings.count);return cookieStrings;
}- (void)setCookies:(NSArray<NSHTTPCookie *> *)cookies forDomain:(NSString *)domain {if (![domain containsString:self.domain]) {return;}NSData *cookieData = [NSKeyedArchiver archivedDataWithRootObject:cookies];[[NSUserDefaults standardUserDefaults] setObject:cookieData forKey:self.domain];[[NSUserDefaults standardUserDefaults] synchronize];self.loginCookieHasBeenSynced = YES;
}- (NSArray<NSHTTPCookie *> *)cookies {NSData *cookieData = [[NSUserDefaults standardUserDefaults] objectForKey:self.domain];if (!cookieData) {return nil;}NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookieData];for (NSHTTPCookie *cookie in cookies) {NSLog(@"cookie== %@",cookie);}return cookies;
}- (void)removeCookies {[[NSUserDefaults standardUserDefaults] removeObjectForKey:self.domain];[[NSUserDefaults standardUserDefaults] synchronize];self.loginCookieHasBeenSynced = NO;
}- (void)cookiesSyncForWebsiteDataStore:(void(^)(WKWebsiteDataStore *dataStore))completion {NSArray<NSHTTPCookie *> *cookes = [self cookies];if (!cookes || cookes.count == 0) {return completion(nil);}if (@available(iOS 11.0, *)) {WKWebsiteDataStore *dataStore = [WKWebsiteDataStore nonPersistentDataStore];[cookes enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL *stop) {NSLog(@"cookie == %@", cookie);dispatch_group_enter(self.cookieSyncGroup);[dataStore.httpCookieStore setCookie:cookie completionHandler:^{dispatch_group_leave(self.cookieSyncGroup);}];}];dispatch_group_notify(self.cookieSyncGroup, dispatch_get_main_queue(), ^{completion(dataStore);});return;}completion(nil);
}+ (void)syncCookieFromWebView:(WKWebView *)webViewnavigationResponse:(WKNavigationResponse *)navigationResponse {if (@available(iOS 11.0, *)) {WKHTTPCookieStore *cookieStore = webView.configuration.websiteDataStore.httpCookieStore;[cookieStore getAllCookies:^(NSArray* cookies) {if (cookies.count == 0) {return ;}NSUInteger index = [cookies indexOfObjectPassingTest:^BOOL(NSHTTPCookie *cookie, NSUInteger idx, BOOL * _Nonnull stop) {return [cookie.name isEqualToString:[WKCookieSyncManager sharedWKCookieSyncManager].domain];}];if (index == NSNotFound) {return;}NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;NSString *host = response.URL.host;if (![[WKCookieSyncManager sharedWKCookieSyncManager] loginCookieHasBeenSynced]) {[[WKCookieSyncManager sharedWKCookieSyncManager] setCookies:cookies forDomain:host];}}];return;}NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;NSDictionary *allHeaderFields = [response allHeaderFields];NSString *cookiesString = [allHeaderFields valueForKey:@"Set-Cookie"];NSLog(@"response.URL Set-Cookie:%@", cookiesString);NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:allHeaderFields forURL:response.URL];NSUInteger index = [cookies indexOfObjectPassingTest:^BOOL(NSHTTPCookie *cookie, NSUInteger idx, BOOL * _Nonnull stop) {return [cookie.name isEqualToString:[WKCookieSyncManager sharedWKCookieSyncManager].domain];}];if (index != NSNotFound) {NSString *host = response.URL.host;if (![[WKCookieSyncManager sharedWKCookieSyncManager] loginCookieHasBeenSynced]) {[[WKCookieSyncManager sharedWKCookieSyncManager] setCookies:cookies forDomain:host];}}
}@end
复制代码

###2、通过- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler获取WKWebView cookies ,使用工具类保存起来

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {dispatch_async(dispatch_get_main_queue(), ^{[WKCookieSyncManager syncCookieFromWebView:webView navigationResponse:navigationResponse];});decisionHandler(WKNavigationResponsePolicyAllow);
}
复制代码

3、首次打开应用,初始化WKWebView 设置已保存的Cookies,同步cookie登录态

    WKCookieSyncManager *cookiesManager = [WKCookieSyncManager sharedWKCookieSyncManager];WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];// 解决 webview之间的cookie同步问题,config.processPool = cookiesManager.processPool; config.allowsInlineMediaPlayback = YES;if (@available(iOS 11.0, *)) {NSArray<NSHTTPCookie *> *cookes = [[WKCookieSyncManager sharedWKCookieSyncManager] cookies];[cookes enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL * _Nonnull stop) {[config.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:nil];}];} else {NSMutableArray<NSString *> *oldCookies = [WKCookieSyncManager cookieJavaScriptArray];[oldCookies enumerateObjectsUsingBlock:^(NSString *_Nonnull obj, NSUInteger idx, BOOL *_Nonnull stop) {NSString *setCookie = [NSString stringWithFormat:@"document.cookie='%@';", obj];WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource:setCookie injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];[config.userContentController addUserScript:cookieScript];}];}WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];self.webView = webView;self.webView.backgroundColor = [UIColor whiteColor];self.webView.scrollView.backgroundColor = [UIColor whiteColor];self.webView.translatesAutoresizingMaskIntoConstraints = NO;self.webView.scrollView.bounces = NO;self.webView.UIDelegate = self;[self.view addSubview:self.webView];
复制代码

###4、- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation 获取cookie string

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {[self.webView evaluateJavaScript:@"document.cookie" completionHandler:^(id _Nullable cookie, NSError * _Nullable error) {NSLog(@"调用异步获取cookie:%@", cookie);}];
}
复制代码

转载于:https://juejin.im/post/5bc692ef5188255c89015cf5

WKWebView get/set cookie小结相关推荐

  1. html5 ios cookie,ios – WKWebView,获取所有cookie

    我想从WKWebView获取所有cookie.为什么?我已经启动了一个使用基于Web的身份验证的项目.因此,我应该拦截cookie以确保用户已登录并用于其他目的.另一种情况 – 想象一下,如果用户登录 ...

  2. PHP语法,变量,cookie小结

    PHP 运行机制 PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器. 基本的 PHP 语法 PHP 脚本可以放在文档中的任何位置. PHP 文件的默认文件扩展名是 ".php ...

  3. java web 对cookie技术、session技术进行小结

    2019独角兽企业重金招聘Python工程师标准>>> Session是一种服务器端技术, Session 对象在服务器端创建,通常采用散列表来存储信息,例如, Tomcat 的 S ...

  4. WKWebView 那些坑

    导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView拥有60fps滚动刷新 ...

  5. wkWebView 的一些问题

    导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView 拥有60fps滚动刷 ...

  6. iOS之深入解析WKWebView的坑点收录和优化处理

    一.Cookie 处理 ① Cookie 说明 WKWebView 在设置 Cookie 的时候,经常做的是在请求的请求头里添加 Cookie,但这只是把 Cookie 发送给了服务端,本地并没有保存 ...

  7. ip访问 webstorem_常见问题-iOS WebView IP直连 如何处理 Cookie

    WKWebView 无法使用 NSURLProtocol 拦截请求 针对该问题方案如下: 换用 UIWebView 使用私有 API 进行注册拦截 换用 UIWebView 方案不做赘述,说明下使用私 ...

  8. java后台http请求完成之后怎么setcookie_关于HTTP的那些事和cookie

    1.0 HTTP协议 关于协议 对于应用层开发人员,接触最多的网络协议通常都是传输层的TCP,为什么这么说,因为再往上的应用层协议,如:HTTP.HTTPS.POP3.SMTP.RPC.FTP.TEL ...

  9. iOS 端容器之 WKWebView 那些事

    简介: 本文主要是关于在端容器设计开发过程中,WKWebView 使用上遇到的一些问题和解决办法. 作者 | 驽良 来源 | 阿里技术公众号 一  背景 熟悉 iOS\macOS Hybrid 混合开 ...

最新文章

  1. 对MVC、MVP、MVVM的理解
  2. linux rm 删除所有文件,linux无需rm就可快速删除大量文件
  3. tkinter 菜单添加事件_tkinter学习教程(七)
  4. 我们可以写100%,但是这样不科学
  5. 傲腾服务器系统,英特尔傲腾加速 释放数据价值
  6. 如何将Groovy中的文件读入字符串?
  7. eclipse idea 导入maven项目
  8. 动态规划实战1-leetcode 983.Minimum Cost For Tickets
  9. Glide加载圆形图片并且带边框
  10. Win10正式版微软官方原版ISO系统镜像下载大全
  11. [圣诞大礼]Macintosh苹果机精品游戏合集
  12. 软件测试藏宝图中文版
  13. html相同标签nth,比较CSS3选择器:nth-child和:nth-of-type之间的区别
  14. 简单五步设置群晖NAS绑定自有域名实现外网访问
  15. java节点是啥_节点什么意思?什么叫节点?
  16. python实现寻找最长回文子串
  17. 微信小程序之订阅消息实现
  18. 中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
  19. c语言设计黑红梅方四种图案,8h9btf
  20. 【火热报名中】新星计划第三季正式开启,快来参与吧

热门文章

  1. python学习:time、unixtime、string的转换
  2. UITableVIew的性能优化-重用原理
  3. 武汉大学2010年数学分析试题解答
  4. C#编程规范--控件命名篇[转]
  5. ROS学习(十二):ROS URDF-model_state
  6. 南京人工智能高等研究院孔慧:多向技术驱动,让企业具备长久竞争力
  7. Android消息处理机制
  8. 工程师忽略的隐形成本
  9. nagios系列(六)之nagios实现对服务器cpu温度的监控
  10. Android 屏幕滑动事件