import Network
import WebKit

@available(iOS 17.0, macOS 14.0, *)
@MainActor
func makeWebView(username: String, password: String) -> WKWebView {
    let endpoint = NWEndpoint.hostPort(
        host: "proxy.example.net", port: 8080)
    let proxy = ProxyConfiguration(
        httpCONNECTProxy: endpoint, tlsOptions: nil)
    proxy.applyCredential(username: username, password: password)

    let store = WKWebsiteDataStore.nonPersistent()
    store.proxyConfigurations = [proxy]

    let configuration = WKWebViewConfiguration()
    configuration.websiteDataStore = store
    return WKWebView(frame: .zero, configuration: configuration)
}

반환된 뷰는 전용 비영구 WKWebsiteDataStore을 사용합니다. 원하는 웹사이트는 그 뷰를 통해 불러오세요. 중개자의 계정을 사용하거나 자격 증명이 필요 없는 프록시라면 applyCredential을 생략합니다. 인증이 없는 이 HTTP 분기에서는 HTTP 프록시 목록이 데이터 저장소용 후보 엔드포인트를 제공합니다.

이 저장소를 공유하는 모든 뷰는 해당 프록시 정책을 공유합니다. 이 전용 저장소는 임시 웹사이트 데이터도 가지므로 다른 뷰의 기존 웹사이트 로그인을 상속하지 않습니다.

구성은 탐색보다 앞서 유지하세요. WebKit은 저장소의 프록시 구성을 변경하면 현재 네트워킹이 중단될 수 있다고 경고합니다.

별도의 URLSession 가져오기와 이어지는 loadHTMLString은 해당 HTML 가져오기만 처리합니다. 이미지, 스크립트, 이후 탐색은 여전히 뷰의 네트워킹을 사용합니다. 저장소는 그 경로를 구성하는 공개 훅입니다.

관련 글