반응형
SwiftUI WKWebView 완전 정리 (쿠키, 로그인 유지, JS 통신까지)
SwiftUI에서 WebView를 붙이는 순간 난이도가 급격히 올라갑니다.
특히 아래 문제는 거의 반드시 겪게 됩니다.
- 쿠키가 안 붙음
- 로그인이 유지되지 않음
- 웹 ↔ 앱 통신이 안됨
이 글에서는 WKWebView를 SwiftUI에서 제대로 사용하는 방법을 실무 기준으로 정리합니다.
1. SwiftUI에서 WKWebView 사용하는 기본 구조
SwiftUI는 UIKit을 직접 사용할 수 없기 때문에 UIViewRepresentable을 사용해야 합니다.
import SwiftUI
import WebKit
struct WebView: UIViewRepresentable {
let url: URL
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ webView: WKWebView, context: Context) {
let request = URLRequest(url: url)
webView.load(request)
}
}
👉 기본 구조는 간단하지만 실무에서는 이것만으로 부족합니다.
2. 쿠키가 안 붙는 이유
WKWebView는 앱의 쿠키 저장소와 분리되어 있습니다.
- URLSession → HTTPCookieStorage
- WKWebView → WKHTTPCookieStore
👉 서로 다른 공간을 사용합니다.
3. 쿠키 동기화 방법
func setCookie() {
let cookie = HTTPCookie(properties: [
.domain: ".example.com",
.path: "/",
.name: "token",
.value: "1234",
.secure: "TRUE"
])!
let store = WKWebsiteDataStore.default().httpCookieStore
store.setCookie(cookie)
}
👉 반드시 WebView 로드 전에 설정해야 합니다.
4. 로그인 유지 전략
실무에서는 다음 방식으로 처리합니다.
- 앱 로그인 → 토큰 저장
- WebView 진입 시 쿠키 주입
- 웹에서 세션 유지
👉 핵심은 WebView 생성 전에 쿠키 세팅
5. WKWebView 설정 (중요)
let config = WKWebViewConfiguration()
config.websiteDataStore = .default()
let webView = WKWebView(frame: .zero, configuration: config)
👉 데이터 저장소 설정이 중요합니다.
6. JavaScript ↔ Native 통신
JS → Native
config.userContentController.add(context.coordinator, name: "callback")
func userContentController(_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage) {
print(message.body)
}
Native → JS
webView.evaluateJavaScript("alert('Hello')")
👉 Web ↔ App 연동의 핵심
7. Coordinator 활용
class Coordinator: NSObject, WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage) {
print(message.body)
}
}
func makeCoordinator() -> Coordinator {
Coordinator()
}
👉 delegate 처리를 위해 필요합니다.
8. WKUserScript (초기 스크립트 주입)
let script = WKUserScript(
source: "document.body.style.background = 'red';",
injectionTime: .atDocumentStart,
forMainFrameOnly: true
)
옵션:
- .atDocumentStart
- .atDocumentEnd
👉 로그인, 쿠키, JS 초기화에 활용
9. 실무에서 자주 하는 실수
- 쿠키 설정 후 WebView 생성
- updateUIView에서 계속 load 호출
- JS handler 중복 등록
10. 실무 추천 구조
- WebView 생성 전에 쿠키 세팅
- Coordinator로 이벤트 처리
- Router와 연결해서 네비게이션 관리
11. 결론
SwiftUI에서 WebView의 핵심은 다음입니다.
- 쿠키는 별도 저장소
- 생성 전에 설정해야 함
- JS 브릿지로 연동
이 구조를 이해하면 대부분의 WebView 문제를 해결할 수 있습니다.
다음 글에서는 SwiftUI Navigation + WebView 연동 (딥링크, 푸시 포함)을 다루면 실무 구조가 완성됩니다.
반응형
'IT' 카테고리의 다른 글
| SwiftUI 성능 문제 실전 케이스 (List, Navigation, WebView 최적화) (0) | 2026.04.03 |
|---|---|
| SwiftUI Navigation + WebView 연동 완벽 가이드 (딥링크, 푸시, 라우팅까지) (0) | 2026.04.03 |
| SwiftUI SafeArea 완벽 이해 (layout 깨짐, NavigationBar 겹침 해결) (0) | 2026.04.03 |
| SwiftUI List / ScrollView 실무 문제 해결 (padding, separator, 성능까지) (0) | 2026.04.03 |
| SwiftUI 상태관리 완전 정리 (@State, @Binding, @ObservedObject, @StateObject 차이) (0) | 2026.04.03 |