iOS開發之wkwebview與AFNetworking共享cookie
阿新 • • 發佈:2018-12-09
一般在web與js的互動中想再post時需要拿到web裡的使用者資訊,登入狀態等,需要傳遞web的cooki wk設定–>wk獲取–>儲存–>af取–>af設定
wkwebview的處理
WKWebViewConfiguration *config = [WKWebViewConfiguration new]; // 設定偏好設定 config.preferences = [WKPreferences new]; // 預設為0 config.preferences.minimumFontSize = 10; // 預設為yes config.preferences.javaScriptEnabled = YES; // 在iOS上預設為NO,表示不能自動通過視窗開啟 config.preferences.javaScriptCanOpenWindowsAutomatically = NO; // web內容處理池 config.processPool = [[WKProcessPool alloc] init]; // 注入JS物件名稱AppModel,當JS通過AppModel來呼叫時, // 我們可以在WKScriptMessageHandler代理中接收到 userContentController = [[WKUserContentController alloc]init]; config.userContentController = userContentController; [userContentController addScriptMessageHandler:self name:@"AppModel"]; WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) configuration:config]; wkWebView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; wkWebView.backgroundColor = [UIColor whiteColor]; wkWebView.navigationDelegate = self; wkWebView.UIDelegate = self; (這裡是新增cookie(重點程式碼)) WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: @"document.cookie ='TeskWKCookieKey1=TeskWKCookieValue1';document.cookie = 'TeskWKCookieKey2=TeskWKCookieValue2';"injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO]; [userContentController addUserScript:cookieScript]; NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseUrl]]; [request setValue:[NSString stringWithFormat:@"%@=%@",@"testWKcookie", @"testWKcookievalue"] forHTTPHeaderField:@"Cookie"]; (把我想象成一條分割線呀~~~) [wkWebView loadRequest:request]; self.wKWebView = wkWebView;
Delegate(重點程式碼)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{ NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response; NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL]; /////////////// 存cookie(主要是這裡) NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookies]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"WebViewCookie"]; [[NSUserDefaults standardUserDefaults] synchronize]; NSLog(@"存:cookies : %@",cookies); (把我想象成一條分割線呀~~~) //讀取wkwebview中的cookie 方法1 for (NSHTTPCookie *cookie in cookies) { // [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; // NSLog(@"webview ---- %@", cookie); } //讀取wkwebview中的cookie 方法2 讀取Set-Cookie欄位 // NSString *cookieString = [[response allHeaderFields] valueForKey:@"Set-Cookie"]; // NSLog(@"wkwebview中的cookie:%@", cookieString); //看看存入到了NSHTTPCookieStorage了沒有 NSHTTPCookieStorage *cookieJar2 = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *cookie in cookieJar2.cookies) { // NSLog(@"NSHTTPCookieStorage中的cookie%@", cookie); // NSLog(@"webview ---- %@", cookie); } decisionHandler(WKNavigationResponsePolicyAllow); }
Afnetworking處的處理
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager setSecurityPolicy:securityPolicy]; [manager.requestSerializer setHTTPShouldHandleCookies:NO]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //////////////設定web的cookie給af(重點程式碼) NSData *cookiesdata = [[NSUserDefaults standardUserDefaults] objectForKey:@"WebViewCookie"]; if([cookiesdata length]) { NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesdata]; NSHTTPCookie *cookie; for (cookie in cookies) { [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; NSLog(@"取:cookies : %@",cookies); } } (把我想象成一條分割線呀~~~) [manager POST:url parameters:body progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(task, responseObject); NSDictionary *fields = ((NSHTTPURLResponse*)task.response).allHeaderFields; // NSLog(@"post --- fields = %@",[fields description]); // NSURL *url = [NSURL URLWithString:@"http://dev.skyfox.org/cookie.php"]; //獲取cookie方法1 NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:[NSURL URLWithString:url]]; for (NSHTTPCookie *cookie in cookies) { // NSLog(@"post --- cookie,name:= %@,valuie = %@",cookie.name,cookie.value); } } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(task, error); } }]