WKWebView之cookie请求
生活随笔
收集整理的這篇文章主要介紹了
WKWebView之cookie请求
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
貼上代碼:
#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请求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017.12.19 白盒测试作业第四次
- 下一篇: SQL Server数据库损坏、检测以及