[iOS] WKWebView
2025. 1. 25. 21:00ㆍiOS
반응형
iOS 앱에서 웹뷰를 통해 웹과 앱 간 연동을 구현하려면 WKWebView를 주로 사용합니다. 웹뷰는 HTML, CSS, JavaScript로 작성된 콘텐츠를 앱 내부에서 표시할 수 있으며, 앱과 웹 간 데이터 교환이 가능하도록 설계됩니다. 아래는 주요 개념과 방법을 설명합니다.
1. 웹뷰 종류
- UIWebView: iOS 12 이전에 사용되던 웹뷰. 현재는 Deprecated로 사용하지 않음.
- WKWebView: iOS 8 이상에서 사용할 수 있는 최신 웹뷰. 성능이 우수하고, 보안 및 기능 지원이 강력함.
2. WKWebView 주요 기능
- 웹 페이지 로드:
- 로컬 HTML 파일 또는 URL로 웹 페이지를 로드합니다.
- load(URLRequest) 또는 loadHTMLString(_:baseURL:)을 사용.
- JavaScript 실행:
- 앱에서 JavaScript 코드를 실행하거나, 웹에서 앱과 통신할 때 활용.
- evaluateJavaScript(_:completionHandler:) 메서드를 통해 실행.
- 앱-웹 간 통신:
- WKScriptMessageHandler를 사용하여 웹에서 앱으로 데이터를 전달.
- JavaScript 함수 호출로 앱에서 웹으로 데이터를 전달.
- 탐색 컨트롤:
- goBack(), goForward(), reload() 등 탐색 기능을 지원.
- 네비게이션 Delegate:
- WKNavigationDelegate: 페이지 로딩 상태나 특정 URL 탐색을 제어.
- WKUIDelegate: 팝업 처리나 웹 뷰의 UI 요소를 관리.
3. 앱과 웹 간 연동 방법
(1) 웹 → 앱: 데이터 전달
- JavaScriptInterface:
- 웹에서 JavaScript 함수로 앱에 데이터를 전달.
- WKUserContentController에 스크립트 메시지 핸들러를 추가.
class ViewController: UIViewController, WKScriptMessageHandler {
let webView = WKWebView()
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
config.userContentController.add(self, name: "appBridge")
webView = WKWebView(frame: self.view.frame, configuration: config)
self.view.addSubview(webView)
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "appBridge" {
print("Received data from web: \(message.body)")
}
}
}
- JavaScript 호출 예제:
window.webkit.messageHandlers.appBridge.postMessage({ key: 'value' });
(2) 앱 → 웹: 데이터 전달
JavaScript 실행:
webView.evaluateJavaScript("yourJavaScriptFunction('data')") { (result, error) in
if let error = error {
print("Error: \(error.localizedDescription)")
} else {
print("Result: \(result ?? "No result")")
}
}
(3) 공유 데이터 관리
- Cookies 및 LocalStorage:
- WKHTTPCookieStore를 활용해 웹 세션이나 로그인 데이터를 공유.
- localStorage를 사용할 수도 있으나 앱에서 직접 접근은 불가.
4. 보안과 최적화
- WKWebView 보안 설정:
- ATS(App Transport Security): HTTPS만 허용하도록 권장.
- WKWebView 기본 설정은 보안에 최적화되어 있음.
- CSP(Content Security Policy):
- 웹에서 실행되는 스크립트를 제한하여 악성 코드 실행 방지.
- 캐시 및 메모리 관리:
- 메모리 사용량을 줄이기 위해 불필요한 리소스 로드 최소화.
5. 기타 고려 사항
- 웹 페이지 디자인:
- 모바일 친화적인 UI/UX 설계.
- 반응형 웹을 적용하여 다양한 디바이스 해상도 지원.
- 로딩 인디케이터:
- 웹뷰 로드가 완료될 때까지 사용자에게 인디케이터 표시.
- 오프라인 동작:
- 네트워크가 없는 경우 로컬 HTML 파일을 로드하거나, 에러 페이지 표시.
6. WKWebView 주요 Delegate
- WKNavigationDelegate:
- 특정 URL의 로딩 시작, 완료, 실패를 처리.
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("Page loaded")
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.request.url?.absoluteString.contains("restricted") == true {
decisionHandler(.cancel)
} else {
decisionHandler(.allow)
}
}
- WKUIDelegate:
- 사용자 상호작용을 처리(예: 팝업).
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alert = UIAlertController(title: "Alert", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default) { _ in
completionHandler()
})
present(alert, animated: true)
}
7. 결론
WKWebView를 사용하면 iOS 앱에서 웹 콘텐츠를 렌더링하고, 앱과 웹 간 연동을 효과적으로 구현할 수 있습니다. 위의 기능들을 조합하여 데이터 전송, UI/UX 최적화, 보안을 강화하는 구조로 개발할 수 있습니다.
반응형
'iOS' 카테고리의 다른 글
[iOS] WebView 백그라운드 시 앱 새로고침 이슈 (1) | 2025.01.25 |
---|---|
[iOS] Webview Deep Link/Universal Link (1) | 2025.01.25 |
iOS의 동시성(Concurrency) (2) | 2025.01.24 |
모바일 개발 시 협업의 중요성 (2) | 2025.01.21 |
[QA] QA담당자와 협업하기 (1) | 2025.01.21 |