
iOS 8 이전: UIWebView
iOS 8 이후: WKWebView

import UIKit
import WebKit
class WebViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
title = "Web View"
navigationController?.navigationBar.prefersLargeTitles = false
setWebView()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.prefersLargeTitles = true
}
//MARK: - webView에 JavaScript 세팅
private func setWebView() {
// JavaScript에서 호출할 핸들러 등록
let contentController = WKUserContentController()
contentController.add(self, name: "iosListener")
contentController.add(self, name: "urlListener")
let config = WKWebViewConfiguration()
config.userContentController = contentController
webView = WKWebView(frame: view.bounds, configuration: config)
webView.uiDelegate = self
webView.navigationDelegate = self
view.addSubview(webView)
// HTML 파일 로드
if let htmlPath = Bundle.main.path(forResource: "index", ofType: "html") {
let url = URL(fileURLWithPath: htmlPath)
webView.loadFileURL(url, allowingReadAccessTo: url)
}
}
}
extension WebViewController: WKScriptMessageHandler, WKNavigationDelegate {
//MARK: - JavaScript의 alert 처리
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alert = UIAlertController(title: "JavaScript Alert", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default) { _ in
completionHandler()
})
present(alert, animated: true, completion: nil)
}
//MARK: - JavaScript에서 메시지 받았을 때 호출
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
let messageName = message.name
if let messageBody = message.body as? String {
switch messageName {
// Swift에서 JavaScript 함수 호출
case "iosListener":
print("JavaScript에서 받은 메시지: \(messageBody)")
let jsCode = "showMessageFromSwift('Hello from Swift!')"
webView.evaluateJavaScript(jsCode) { (result, error) in
if let error = error {
print("JavaScript 실행 오류: \(error.localizedDescription)")
} else {
print("JavaScript 실행 성공: \(String(describing: result))")
}
}
// JavaScript에서 URL을 받아 WebView 이동
case "urlListener":
print("JavaScript에서 받은 URL: \(messageBody)")
if let url = URL(string: messageBody) {
let request = URLRequest(url: url)
webView.load(request)
}
default: break
}
}
}
}
let contentController = WKUserContentController()
contentController.add(self, name: "iosListener")
contentController.add(self, name: "urlListener")
let config = WKWebViewConfiguration()
config.userContentController = contentController
webView = WKWebView(frame: view.bounds, configuration: config)
webView.uiDelegate = self
webView.navigationDelegate = self
view.addSubview(webView)
if let htmlPath = Bundle.main.path(forResource: "index", ofType: "html") {
let url = URL(fileURLWithPath: htmlPath)
webView.loadFileURL(url, allowingReadAccessTo: url)
}
WKScriptMessageHandler를 구현하여 JavaScript에서 호출되는 메시지 처리
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alert = UIAlertController(title: "JavaScript Alert", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default) { _ in
completionHandler()
})
present(alert, animated: true, completion: nil)
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
let messageName = message.name
if let messageBody = message.body as? String {
switch messageName {
case "iosListener":
print("JavaScript에서 받은 메시지: \(messageBody)")
let jsCode = "showMessageFromSwift('Hello from Swift!')"
webView.evaluateJavaScript(jsCode) { (result, error) in
if let error = error {
print("JavaScript 실행 오류: \(error.localizedDescription)")
} else {
print("JavaScript 실행 성공: \(String(describing: result))")
}
}
case "urlListener":
print("JavaScript에서 받은 URL: \(messageBody)")
if let url = URL(string: messageBody) {
let request = URLRequest(url: url)
webView.load(request)
}
default: break
}
}
}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WKWebView JS Test</title>
</head>
<body>
<h1>WKWebView & JavaScript 통신</h1>
<button onclick="sendMessageToiOS()">iOS로 메시지 보내기</button>
<hr>
<!-- 주소 입력 창 및 이동 버튼 추가 -->
<input type="text" id="urlInput" placeholder="이동할 주소 입력 (예: https://www.apple.com)">
<button onclick="navigateToURL()">이동</button>
<script>
function sendMessageToiOS() {
if (window.webkit && window.webkit.messageHandlers.iosListener) {
window.webkit.messageHandlers.iosListener.postMessage("Hello from JavaScript!");
}
}
function showMessageFromSwift(message) {
alert("Swift에서 보낸 메시지: " + message);
}
function navigateToURL() {
let url = document.getElementById("urlInput").value.trim();
if (url) {
if (!url.startsWith("http")) {
url = "https://" + url; // URL이 http나 https로 시작하지 않으면 https 추가
}
if (window.webkit && window.webkit.messageHandlers.urlListener) {
window.webkit.messageHandlers.urlListener.postMessage(url);
}
} else {
alert("URL을 입력하세요.");
}
}
</script>
</body>
</html>
WebViewController
https://github.com/zongbeen/AboutiOS/blob/main/AboutiOS/VIew/WebViewController.swift
