iOS 응용 (swift)
[iOS - swift] WebView cookie 설정 (cache)
jake-kim
2021. 1. 21. 23:09
WebView 쿠키 설정 방법
- 원리: 웹뷰 객체를 생성할 때 WKWebView(frame:configuration:), configuration에 데이터 정보(쿠키정보 넣고 그 쿠키정보가 이전에 존재하면 캐시되는 원리)
- 종속성
import WebKit
- 쿠키는 WKWebViewConfiguration()에 저장되며, WebView를 초기화 할 때 객체로 넘겨주면 cache완료
- WKWebViewConfiguration 객체에 cookie(HTTPCookie객체)를 저장하는 extension 추가
- DispatchGroup 개념: Dispatch Group 활용 - 코드 실행 순서 정의부분 참고
- completion을 사용하는 이유는 async하게 접근 종료 후 completion이 실행되는 것을 보장하기 위함
extension WKWebViewConfiguration {
static func includeCookie(cookies: [HTTPCookie], completion: @escaping (WKWebViewConfiguration?) -> Void) {
let config = WKWebViewConfiguration()
let dataStore = WKWebsiteDataStore.nonPersistent()
DispatchQueue.main.async {
let waitGroup = DispatchGroup()
for cookie in cookies {
waitGroup.enter()
dataStore.httpCookieStore.setCookie(cookie) {
waitGroup.leave()
}
}
waitGroup.notify(queue: DispatchQueue.main) {
config.websiteDataStore = dataStore
completion(config)
}
}
}
}
- cookie를 가지고 WebConfiguration를 초기화 하는 함수 추가
func prepareWebConfiguration(completion: @escaping (WKWebViewConfiguration?) -> Void) {
guard let authCookie = HTTPCookie(properties: [
.domain: ServiceConfiguration.webBaseDomain,
.path: "/",
.name: authTokenCookieName, // "CID_AUT"
.value: KeychainService.shared.getUserAccessToken(),
.secure: "TRUE",
]) else {
return
}
guard let uuidCookie = HTTPCookie(properties: [
.domain: ServiceConfiguration.webBaseDomain,
.path: "/",
.name: uuidCookieName, // "CID_AUT"
.value: KeychainService.shared.getUUID(),
.secure: "TRUE",
]) else {
return
}
WKWebViewConfiguration.includeCookie(cookies: [authCookie, uuidCookie]) {
completion($0)
}
}
- 위에서 정의한 두 함수를 가지로 cookie설정된 config를 통해서 webView 초기화
prepareWebConfiguration { [weak self] in
if let config = $0 {
webView = WKWebView(frame: .zero, configuration: config)
}
}