WKWebView 히스토리 복원 테스트 - my-swift-lab/firefox-ios GitHub Wiki

테스트 URL

let urls = [
        "https://m.youtube.com",
        "https://m.youtube.com/watch?v=okbmCY1eWp0",
        "https://m.youtube.com/watch?v=_J6oX_Q0sWA",
        "https://m.youtube.com/watch?v=-P7DW52LEpg"
    ]

실행 스크립트

func restoreHistory() {
        let script = self.urls.map { (it) in
             return "window.history.pushState({ uuid: '\(UUID().uuidString)' }, '\(it)', '\(it)' );"
        }
        .joined(separator: "\n")
        print(script)
        let userScript = WKUserScript(source: script, injectionTime: .atDocumentStart, forMainFrameOnly: true)
        self.webView.configuration.userContentController.addUserScript(userScript)
    }

WKWebView 생성시 실행하기

init() {
        let configuration = WKWebViewConfiguration()
        configuration.allowsInlineMediaPlayback = true
        self.webView = WKWebView(frame: .zero, configuration: configuration)
        restoreHistory()
        self.webView.allowsBackForwardNavigationGestures = true
        self.webView.allowsLinkPreview = true
        self.webView.navigationDelegate = self.navigationDelegate
        self.webView.uiDelegate = self.uiDelegate
        setupObservers()
}

결론

  • 현재 WKWebView는 히스토리 복원을 위한 API가 없다.
  • 위처럼하면 히스토리가 잘 복원된다.
  • 그러나 pushState의 보안 특성상 document의 Origin이 같아야 한다. 즉 위 예에서 https://m.youtube.com 하위만 되는 것이다. https://www.youtubue.com 도 안된다.
  • 따라서 이 문제를 해결해야 한다.
  • Firefox 의 문서를 참고해 보자.