관리 메뉴

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

[iOS - Swift] WKWebsiteDataStore 웹뷰 데이터(쿠키, 디스크, 메모리, 캐시, 초기화) 관리 방법 본문

iOS 응용 (swift)

[iOS - Swift] WKWebsiteDataStore 웹뷰 데이터(쿠키, 디스크, 메모리, 캐시, 초기화) 관리 방법

jake-kim 2022. 9. 5. 23:24

WKWebsiteDataStore 개념

https://developer.apple.com/documentation/webkit/wkwebsitedatastore

  • 웹뷰에서 iOS 네이티브쪽 메모리나 디스크에 데이터를 저장하는 인스턴스
    • 웹뷰안에서 웹쪽코드로부터 특정 데이터를 네이티브 단말기의 디스크에 저장하고 싶은 경우, data storage를 사용하는데, 이것을 사용하면 네이티브의 WKWebsiteDataStore를 통해 관리
  • 네이티브쪽에서 WKWebsiteDataStore를 가지고 할 수 있는 일
    • 웹 사이트에서 사용하는 쿠키 관리
    • 웹 사이트가 저장하는 데이터 타입 확인
    • 원치 않는 웹 사이트 데이터 제거

ex) WKWebsiteDataStore를 통해 쿠키를 관리하는 코드

- 구체적인 코드는 WebView cookie 설정 글 참고

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

WKWebViewConfiguration.includeCookie(
  cookies: [.init()],
  completion: { configuration in
    guard let config = configuration else { return }
    let webView = WKWebView(frame: .zero, configuration: config)
    print("쿠키가 세팅된 webView 완성", webView)
  })

WKWebsiteDataStore 초기화 방법

  • 앱에서 사용자가 로그아웃하거나, 탈퇴하는 경우 초기화해주어야 하는데, 이때 WKWebsiteDataStore에 접근하여 초기화가 필요
  • 초기화할때의 데이터 접근은 크게 2가지가 있는데, 디스크에 저장된 곳에 접근하는 default()와 메모리 공간에 접근하는 nonPersistent가 존재

https://developer.apple.com/documentation/webkit/wkwebsitedatastore

  • 디스크에 저장된 데이터들을 초기화하기 위해 default()로 접근
WKWebsiteDataStore.default()
  • 데이터를 가져올땐 fetchDataRecords()를 사용
    WKWebsiteDataStore.default()
      .fetchDataRecords(
        ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()
      ) { records in print(records) }
  • 데이터 (records)들에 하나씩 접근하면서 removeData를 사용하여 모두 데이터 삭제
    WKWebsiteDataStore.default()
      .fetchDataRecords(
        ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()
      ) { records in
        records
          .forEach {
            WKWebsiteDataStore.default()
              .removeData(
                ofTypes: $0.dataTypes,
                for: [$0],
                completionHandler: {}
              )
          }
      }

* 전체 코드: https://github.com/JK0369/ExWebView

 

* 참고

https://developer.apple.com/documentation/webkit/wkwebsitedatastore

Comments