관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] WebView cookie 설정 (cache) 본문

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)
            }
        }
Comments