[Objective-C]WKWebView 쿠키 관리하기

안녕하세요 에밀리입니다

오늘은 WKWebView의 쿠키 관리 이슈를 포스팅하겠습니다

WKWebView는 한달간 저희 팀을 고생시켰는데요

사용하던 서비스가 원래 UIWebView를 썼지만

이제는 WKWebView으로 전부 전환할 때가 되면서

문제가 시작됐습니다…

그럼 두 개가 어떻게 다르고, 어떻게 전환했는지 정리해보겠습니다

UIWebView란?

웹을 앱에서 보여줄 때 사용하는 View입니다

UIKit에 포함된 Framework로 UIView를 상속 받습니다.

iOS 2.0부터 12.0까지 지원되는 기능이었고,

iOS13이 나오면서 이제 완전히 Depreacated됐습니다

UIWebView는 NSHTTPCookieStorage를 이용해 쿠키를 자동으로 관리해줬습니다

쿠키를 별도로 저장하거나 입력할 필요 없고, ‘Set-Cookie’로 서버에 요청하면 NSHTTPCookieStorage에 자동으로 저장됐죠

WKWebView란?

WKWebView 또한 앱에서 웹을 보여주기 위한 뷰입니다.

단, UIKit이 아닌 WebKit에 포함되어 있죠.

UIView를 상속받는다는 점은 똑같습니다.

iOS 8부터 나타났는데, 굴러들어온 돌이 박힌 돌 빼낸다고

는 완전히 WKWebView로 대체됐습니다

UIWebView와 가장 크게 달라진 점이라고 하면 바로 쿠키 관리 입니다

네 참 많은…리서치와..삽질이 있었는데요

UIWebView와 WKWebView의 쿠키 관리

UIWebView는 쿠키를 자동으로!!! 저장하고 관리합니다.

UIWebView가 여러개 있어도, 쿠키 전부 NSHTTPCookieStorage로 관리했죠

WKWebView도 쿠키를 저장하고 관리합니다만, 직접 관리해줘야 합니다.

이게 무슨 말이냐,

UIWebView는 웹뷰 사이의 모든 쿠키가 자동으로 공유됐는데,

WKWebView는 다른 WKWebView와 쿠키 공유가 안됩니다

그 이유는

UIWebView는 NSHTTPCookieStorage로 모든 쿠키를 저장하고,

WKWebView는 각각 자신만의 쿠키 저장소를 가지기 때문입니다

그림으로 둘을 비교해볼까요

이런 느낌입니다

공유가 안되게 생겼죠?

그럼 쿠키를 공유 하려면?

WKProcessPool을 이용합니다

WKWebView가 새로 생성될 때마다

만들어지는 WKWebViewConfiguration에

싱글톤 WKProcessPool을 넣어주면 됩니다

이렇게요

WKProcessPool *commonProcessPool = [[WKProcessPool alloc] init];WKWebViewConfiguration *config1 = [WKWebViewConfiguration alloc] init];
config1.processPool = commonProcessPool;
WKWebView *webView1 = [[WKWebView alloc] initWithFrame: frame, configuration: config1];
WKWebViewConfiguration *config2 = [WKWebViewConfiguration alloc] init];
config2.processPool = commonProcessPool; //같은 commonProcessPool 넣어줌
WKWebView *webView2 = [[WKWebView alloc] initWithFrame: frame, configuration: config2];

WKWebView에서 쿠키 관리는 어떻게 하지?

WKHTTPCookieStore라는 클래스를 이용합니다

setCookie, getAllCookies, delete가 가능합니다

이 메소드들로 쿠키를 직접 관리해줍니다

이렇게요.

get

[WKWebsiteDataStore.defaultDataStore.httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> * _Nonnull result) {       for (NSHTTPCookie *cookie in result) {
// result로 받는 쿠키 배열을 원하는대로 처리
}
}

set

// 모든 쿠키 배열을 가지고 set 처리for (NSHTTPCookie *cookie in result) {[self.webView.configuration.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:nil];}

delete

// 모든 쿠키 배열을 가져와 삭제해준다for (NSHTTPCookie *cookie in result) {   [WKWebsiteDataStore.defaultDataStore.httpCookieStore deleteCookie:cookie completionHandler:nil];}

따라서 가장 헷갈리던 부분

UIWebView에서 WKWebView로 전환해준다?

  • NSHTTPCookieStorage는 더이상 쓰지 않습니다.
  • WKWebView를 여러개 사용한다면 쿠키 공유는 WKProcessPool로 한다!

Apple 공식 문서에는 WKWebView가 쿠키를 어떻게 관리하고 처리해줘야 하는지 잘 나와있지 않습니다(ㅂㄷㅂㄷ..)

특히 WKProcessPool 같은 경우…ㅠㅠㅠ..

이미 한참 지난 WKWebView 문제였는데 저는 이제야 해결했네요 ㅠ_ㅠ

이상입니다

참조한 블로그들

iOS 하나부터 열까지 이해하기

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store