iOS/Swift

Swift - WKWebView란?

seongpil Heo 2026. 3. 21. 00:34
728x90

  👨🏻‍💻  Swift - WKWebView

[ WKWebView란 무엇인가? ] 

WKWebView는 iOS 앱 내부에서 웹 콘텐츠(HTML, CSS, JS)를 렌더링 하고 표시할 수 있게 해주는 프레임워크 객체이다.

쉽게 말해 앱 내부에서 작은 브라우저를 띄운다고 생각하면 된다.

 

[ 왜 WKWebView를 써야 할까? ] 

① 강력한 성능 (Nitro Engine)

사파리 브라우저와 동일한 Nitro 자바스크립트 엔진을 사용합니다. 덕분에 하이브리드 앱이나 복잡한 웹 페이지도

네이티브에 준하는 빠른 속도로 구동됩니다.

 

② 멀티 프로세스 구조 (Stability)

가장 중요한 기술적 차이가 있습니다.

WKWebView는 앱의 메인 프로세스가 아닌 별도의 프로세스에서 실행됩니다.

 

UIWebView : 웹뷰에서 메모리가 터지면 앱 전체가 같이 꺼짐

WKWebView : 웹뷰 프로세스가 비정상 종료되어도 앱은 살아남으며, 델리게이트 메서드로 복구 기회를 얻음

 

③ 유연한 커스터마이징

단순히 웹을 보여주는 것에 그치지 않고, 네이티브 코드(Swift)와 웹 코드(JavaScript) 사이에서 데이터를 주고

받으며 앱의 기능을 확장할 수 있습니다. (예 : 웹뷰 내의 "결제하기" 버튼을 누르면 아이폰의 "Apple Pay"가 실행되도록 구현 가능)

 

[ 실무에서 주로 쓰이는 케이스 ] 

1. 공지사항 및 이용약관 : 내용이 자주 바뀌는 문서를 서버 점검 없이 즉시 업데이트하고 싶을 때

2. 하이브리드 앱 : 앱의 전체적인 틀은 네이티브로 짜고, 콘텐츠 영역만 웹으로 구성할 때

3. 외부 링크 연결 : 사용자에게 앱을 나가지 않고도 외부 기사나 웹사이트를 보여주고 싶을 때

 

[ WKWebView에 데이터를 넣는 방법]

1. 로컬 파일 로드 : loadFileURL(_:allowingReadAccessTo: )

 

앱 번들(Bundle) 안에 포함된 HTML 파일이나, 사용자 도큐먼트 폴더에 저장된 파일을 불러올 때 사용합니다.

- 데이터 타입 : URL (파일 경로)

- 사용 예시 : 오프라인 상태에서도 보여줘야 하는 이용약관이나 가이드 페이지

if let filePath = Bundle.main.path(forResource: "index", ofType: "html") {
    let fileURL = URL(fileURLWithPath: filePath)
    
    // allowingReadAccessTo: 이 파일이 참조하는 다른 자원(CSS/이미지)이 있는 상위 폴더 경로
    webView.loadFileURL(fileURL, allowingReadAccessTo: fileURL.deletingLastPathComponent())
}

 

2. 바이너리 데이터 로드 : load(_:mineType:characterEncodingName:baseURL:)

 

서버에서 HTML 코드를 String이 아닌 Data(바이너리) 형태로 받았거나, PDF/이미지 같은 파일을 직접 웹뷰에 띄울 때

사용합니다.

- 데이터 타입 : Data

- 사용 예시 : 서버로부터 암호화된 HTML 데이터를 받아 복호화한 후 바로 띄워야 할 때

let htmlData = Data(yourHtmlString.utf8)
webView.load(htmlData, 
             mimeType: "text/html", 
             characterEncodingName: "utf-8", 
             baseURL: URL(string: "https://example.com")!)

 

3. 웹 서버 URL 로드 : load(_:)

 

가장 흔히 사용하는 방식으로, 실제 웹 사이트 주소(HTTP/HTTPS)를 호출합니다.

- 데이터 타입 : URLRequest

- 사용 예시 : 네이버, 구글 같은 외부 사이트로 연결 또는 우리 회사의 웹 서비스 연결

if let url = URL(string: "https://www.google.com") {
    let request = URLRequest(url: url)
    webView.load(request)
}

 

참고 자료
 

WKWebView | Apple Developer Documentation

An object that displays interactive web content, such as for an in-app browser.

developer.apple.com

 

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string:"https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
}

  🎯 WKWebView 사용 예시

[ 이용약관을 WKWebView를 사용해서 표시해 보자 ]

공지사항, 이용약관과 같은 내용이 자주 바뀌지만 서버의 점검(재부팅) 없이 즉시 업데이트 하고 싶을 때

WKWebView를 이용한다고 한다.

 

나는 이용약관을 서버에서 HTML로 받아서 View에서 WKWebView를 이용해서 화면에 표시해 보려고 한다.

// 웹 뷰
private let webView: WKWebView = {
    let wv = WKWebView()
    wv.backgroundColor = .backgroundWhite
    wv.scrollView.showsVerticalScrollIndicator = false

    return wv
}()

private func configureUI() {

    [webView].forEach {
        view.addSubview($0)
    }

    webView.snp.makeConstraints { make in
        make.horizontalEdges.equalToSuperview().inset(16)
        make.top.equalToSuperview().offset(16)
        make.bottom.equalToSuperview()
    }
}

먼저 웹뷰를 만들고, 레이아웃을 잡아준다.

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>서비스 이용약관</title>
</head>
<body>
    <h3>제1조(목적)</h3>
    <p>본 약관은 소분해요(이하 "회사"라 합니다)가 운영하는 웹사이트 및 모바일 애플리케이션(이하 "서비스"라 합니다)을 이용함에 있어 "회사"와 이용자의 권리, 의무 및 책임사항을 규정함을 목적으로 합니다.</p>

    <h3>제2조(용어의 정의)</h3>
    <ol>
        <li>"서비스"란 회사가 제공하는 재화의 판매 및 용역 제공 등 회사의 업무 범위를 말합니다.</li>
        <li>"이용자"란 "서비스"에 접속하여 본 약관에 따라 "회사"가 제공하는 서비스를 받는 회원 및 비회원을 말합니다.</li>
        <li>"회원"이란 "서비스"에 개인정보를 제공하여 회원등록을 한 자로서, "서비스"의 정보를 지속적으로 제공받으며 "서비스"를 계속적으로 이용할 수 있는 자를 말합니다.</li>

서버에서 받아오는 html 데이터이다.

 

// HTML 콘텐츠 바인딩
reactor.state.map { $0.content }
    .distinctUntilChanged()
    .filter { !$0.isEmpty }
    .observe(on: MainScheduler.instance)
    .subscribe(onNext: { [weak self] content in
        guard let self = self else { return }

        self.webView.loadHTMLString(content, baseURL: nil)
    })
    .disposed(by: disposeBag)

WKWebView에 데이터를 바인딩하기 위해서는

loadHTMLString 함수를 사용한다.

 

html 태그로 오는 content를 loadHTMLString 함수에 넣어주면 끝이다.

728x90

'iOS > Swift' 카테고리의 다른 글

iOS) Hit Testing과 Responder Chain  (1) 2026.03.05
애플 개발자 계정 등록하기  (0) 2026.02.11
CoreLocation이란 뭘까?  (0) 2025.10.17
KeyChain에 저장하기  (0) 2025.09.09
카카오로 간편 로그인하기  (1) 2025.09.08