-
WKWebView에서 쿠키 세팅하기Dev/iOS 2019. 11. 7. 10:57
swift를 배우지도 않고 갑자기 iOS 앱을 개발해야 했었다..ㅋㅋㅋ
하이브리드 앱이라서 웹뷰 하나 띄우면 되니깐 "일주일이면 충분하지?"
음... iOS 개발자에겐 넉넉한 시간이겠지만...
껄껄 예.. 하라면 해야죠iOS9부터는 UIWebView 대신 WKWebView를 권장하고 있고,
12부터는 deprecated 돼서 WKWebView를 사용하는 것이 맞다고 판단.
https://developer.apple.com/documentation/webkit/wkwebview
애플 개발자 문서를 참고하시고
내가 만들 하이브리드 앱의 기능은 이전에 포스팅한 안드로이드 하이브리드 앱처럼 단순하다
로그인 화면을 만들고, 서버와 통신하고 쿠키값을 가지고 웹뷰를 로드하는 것.
아후... 말은 쉬운데.. 참 쉬운데.. 내가 부족해서 그르치..로그인 화면 만들고 서버에 POST 하고 웹뷰 띄우는 것까진 했는데
쿠키를 웹뷰 로드 전에 세팅해야 한다.
그러다가 WKWebView의 문제점을 알게 되었는데 쿠키 관리를 직접 해야 하는 것이다.
이것 때문에 시간 엄청 잡아먹었다.. ㅜㅜ 스택오버플로우에서 나온 내용들은 모조리 적용이 안돼..
그러다가 정말 고마우신 분이 쓴 댓글을 발견했다. 진짜 당신 최고... 어디 계셨는지 몰라서 일단 사방으로 절해봅니다.
https://forums.developer.apple.com/thread/99674
WKWebsiteDataStore.nonPersistent() 를 이용하면 쿠키를 세팅할 수 있었다.
아래는 적용해본 코드인데 틀린 부분 있거나 다른 좋은 방법이 있으시면 댓글로 공유해주세요.. 스위프트 뉴비입니다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980let wkDataStore = WKWebsiteDataStore.nonPersistent()//쿠키를 담을 배열 sharedCookieslet dispatchGroup = DispatchGroup()//sharedCookies에서 쿠키들을 뽑아내서 wkDataStore에 넣는다.for cookie in sharedCookies{wkDataStore.httpCookieStore.setCookie(cookie){}}dispatchGroup.notify(queue: DispatchQueue.main) {//wkDataStore를 configuration에 추가한다.self.config.websiteDataStore = wkDataStoreself.config.preferences = preferences//쿠키를 추가한 config를 웹뷰에 넣어준다.self.webView = WKWebView(frame: self.view.bounds, configuration: self.config)self.webView.scrollView.bounces = truelet refreshControl = UIRefreshControl()refreshControl.addTarget(self, action: #selector(self.refreshWebView(sender:)), for: UIControl.Event.valueChanged)self.webView.scrollView.addSubview(refreshControl)self.webView!.navigationDelegate = selfself.webView.autoresizingMask = [.flexibleWidth, . flexibleHeight]}}else{print("Not load page")}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripterhttp://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778let wkDataStore = WKWebsiteDataStore.nonPersistent()//쿠키를 담을 배열 sharedCookieslet dispatchGroup = DispatchGroup()//sharedCookies에서 쿠키들을 뽑아내서 wkDataStore에 넣는다.for cookie in sharedCookies{wkDataStore.httpCookieStore.setCookie(cookie){}}//wkDataStore를 configuration에 추가한다.self.config.websiteDataStore = wkDataStoreself.config.preferences = preferences//쿠키를 추가한 config를 웹뷰에 넣어준다.self.webView.scrollView.bounces = truelet refreshControl = UIRefreshControl()refreshControl.addTarget(self, action: #selector(self.refreshWebView(sender:)), for: UIControl.Event.valueChanged)self.webView.scrollView.addSubview(refreshControl)self.webView!.navigationDelegate = selfself.webView.autoresizingMask = [.flexibleWidth, . flexibleHeight]self.view.addSubview(self.webView)}}else{print("Not load page")}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter+추가
서버에서 쿠키에 특정 값을 넣어달라고 하는 경우가 있다.
그럴때는 URLRequest 하기 전에 HTTPCookieStorage.shared 에 cookieHeaderField 를 세팅해서 넣으면 된다.
123456789let url = URL(string: strUrl)let jar = HTTPCookieStorage.sharedlet cookieHeaderField = ["Set-Cookie": "value"]let cookies = HTTPCookie.cookies(withResponseHeaderFields: cookieHeaderField, for: url!)jar.setCookies(cookies, for: url, mainDocumentURL: url)var request = URLRequest(url: url!)http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter