WKWebView get/set cookie小结
###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小结相关推荐
- html5 ios cookie,ios – WKWebView,获取所有cookie
我想从WKWebView获取所有cookie.为什么?我已经启动了一个使用基于Web的身份验证的项目.因此,我应该拦截cookie以确保用户已登录并用于其他目的.另一种情况 – 想象一下,如果用户登录 ...
- PHP语法,变量,cookie小结
PHP 运行机制 PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器. 基本的 PHP 语法 PHP 脚本可以放在文档中的任何位置. PHP 文件的默认文件扩展名是 ".php ...
- java web 对cookie技术、session技术进行小结
2019独角兽企业重金招聘Python工程师标准>>> Session是一种服务器端技术, Session 对象在服务器端创建,通常采用散列表来存储信息,例如, Tomcat 的 S ...
- WKWebView 那些坑
导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView拥有60fps滚动刷新 ...
- wkWebView 的一些问题
导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView 拥有60fps滚动刷 ...
- iOS之深入解析WKWebView的坑点收录和优化处理
一.Cookie 处理 ① Cookie 说明 WKWebView 在设置 Cookie 的时候,经常做的是在请求的请求头里添加 Cookie,但这只是把 Cookie 发送给了服务端,本地并没有保存 ...
- ip访问 webstorem_常见问题-iOS WebView IP直连 如何处理 Cookie
WKWebView 无法使用 NSURLProtocol 拦截请求 针对该问题方案如下: 换用 UIWebView 使用私有 API 进行注册拦截 换用 UIWebView 方案不做赘述,说明下使用私 ...
- java后台http请求完成之后怎么setcookie_关于HTTP的那些事和cookie
1.0 HTTP协议 关于协议 对于应用层开发人员,接触最多的网络协议通常都是传输层的TCP,为什么这么说,因为再往上的应用层协议,如:HTTP.HTTPS.POP3.SMTP.RPC.FTP.TEL ...
- iOS 端容器之 WKWebView 那些事
简介: 本文主要是关于在端容器设计开发过程中,WKWebView 使用上遇到的一些问题和解决办法. 作者 | 驽良 来源 | 阿里技术公众号 一 背景 熟悉 iOS\macOS Hybrid 混合开 ...
最新文章
- 对MVC、MVP、MVVM的理解
- linux rm 删除所有文件,linux无需rm就可快速删除大量文件
- tkinter 菜单添加事件_tkinter学习教程(七)
- 我们可以写100%,但是这样不科学
- 傲腾服务器系统,英特尔傲腾加速 释放数据价值
- 如何将Groovy中的文件读入字符串?
- eclipse idea 导入maven项目
- 动态规划实战1-leetcode 983.Minimum Cost For Tickets
- Glide加载圆形图片并且带边框
- Win10正式版微软官方原版ISO系统镜像下载大全
- [圣诞大礼]Macintosh苹果机精品游戏合集
- 软件测试藏宝图中文版
- html相同标签nth,比较CSS3选择器:nth-child和:nth-of-type之间的区别
- 简单五步设置群晖NAS绑定自有域名实现外网访问
- java节点是啥_节点什么意思?什么叫节点?
- python实现寻找最长回文子串
- 微信小程序之订阅消息实现
- 中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
- c语言设计黑红梅方四种图案,8h9btf
- 【火热报名中】新星计划第三季正式开启,快来参与吧