2019년 9월 22일 일요일

웹뷰에서 스냅샷 찍기 (Take a SnapShot in WKWebView)

상황 
  • 웹뷰를 로드한 직후, 웹뷰를 스냅샷을 찍어 이미지로 저장하고자 함 

방법 
  • WKNavigationDelegate 를 채택한뒤 webView(_:didFinish:) 메서드에 스냅샷 함수를 호출 
과정 
  • WKNavigationDelegate 채택 및 위임 설정 
  • webView(_:didFinish:) 메서드가 웹뷰가 로드되면 작동함 
  • snapshot 함수 호출 
  • 이미지 뷰 및 레이블에 해당 이미지와 타이틀 설정 
내용
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        let config = WKSnapshotConfiguration()
//        config.rect = CGRect(x: 0, y: 0, width: 150, height: 150)
        config.snapshotWidth = 150
        webView.takeSnapshot(with: config) { (snapImage, error) in
            if error == nil {
                guard let myImage = snapImage else { return }
                self.imageView.image = myImage
                
                guard let guardTitle = self.webView.title else { return }
                self.webViewLabel.text = guardTitle
            }
        }
    }

이슈
  • 만약 웹뷰가 숨김 상태라면 (webView.isHidden = true) 시뮬레이터에서는 스냅샷이 작동하지만 디바이스, 기기에서는 작동하지 않았다. (Xcode 10.2, iOS 12.4) 웹뷰를 화면 밖으로 꺼내놓아 작동시킴 (윈도우 밖에 위치시킴) 
더 확인해 볼 내용 
  • WKUIDelegate 와 WKNavigationDelegate의 작동 내용 
  • webView(_:createWebViewWith:for:windowFeatures:) 로 새 웹뷰를 만드는 과정
API Reference: 

참고: 1, 2