본문 바로가기
iOS, Swift 개발

Swift WKWebview 웹뷰 공통 모듈 구현

by Nin J 2024. 11. 5.

안녕하세요

오늘은 Swift에서 사용되는 웹뷰에서 공통으로 사용할 수 있는 공통 모듈을 만드는 작업을 확인해 보겠습니다.

이 작업은 하나의 프로젝트에서 하나의 웹뷰 혹은 여러개의 웹뷰를 사용할 때

전역으로 공통적으로 사용할 수 있게 모듈을 만들어서 그 모듈을 통해 데이터를 전달하고 또한 이벤트는 진행하는 프로세스입니다.

일단 WKWebview를 가지고 있는 Class 하나를 만들어주고 

commonWebViewProcess란 Class 안에 공통적으로 적용할 기능들 func들을 필요에 따라 넣어준다.

하나의 예시로 코딩을 작성해 보았다.

class commonWebViewProcess: UIViewController, WKNavigationDelegate, WKUIDelegate {

var webView: WKWebView!

    override func loadView() {

        let webConfiguration = WKWebViewConfiguration()

        webConfiguration.allowsInlineMediaPlayback = true

        webConfiguration.mediaTypesRequiringUserActionForPlayback = []

        

        // 웹뷰 초기화

        webView = WKWebView(frame: .zero, configuration: webConfiguration)

        webView.navigationDelegate = self

        webView.uiDelegate = self

        view = webView

    }

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        // 기본 URL 로드 함수 호출 예제

        if let url = URL(string: "https://example.com") {

            loadURL(url)

        }

    }

    

    // URL을 로드하는 함수

    func loadURL(_ url: URL) {

        let request = URLRequest(url: url)

        webView.load(request)

    }

    

    // JavaScript 실행 함수

    func executeJavaScript(_ script: String, completion: ((Any?, Error?) -> Void)? = nil) {

        webView.evaluateJavaScript(script, completionHandler: completion)

    }

    

    // WKNavigationDelegate 예제 (페이지 로드 완료 시 호출)

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

        print("페이지 로드 완료")

    }

    

    // WKUIDelegate 예제 (JavaScript 경고 처리)

    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {

        let alert = UIAlertController(title: "알림", message: message, preferredStyle: .alert)

        alert.addAction(UIAlertAction(title: "확인", style: .default, handler: { _ in

            completionHandler()

        }))

        present(alert, animated: true, completion: nil)

    }

    

    // 웹 페이지 이동

    func goBack() {

        if webView.canGoBack {

            webView.goBack()

        }

    }

    

    func goForward() {

        if webView.canGoForward {

            webView.goForward()

        }

    }

    

    // 새로고침

    func reloadPage() {

        webView.reload()

    }

 

  • CommonWebView 클래스를 초기화하고 URL을 로드하여 사용할 수 있다.
  • executeJavaScript(_:completion:) 함수를 호출해 JavaScript 코드를 실행할 수 있다.
  • goBack(), goForward(), reloadPage() 등을 사용하여 웹 탐색을 제어할 수 있다.

이제 CommonWebView를 다른 화면에서도 재사용할 수 있으며, 이 클래스에 다양한 WKWebView 관련 기능을 추가해 필요한 기능을 확장할 수 있다.

또한

commonWebViewProcess 필요에 따라 아래처럼 선언 후 필요항목을 가져와 쓸 수 있어 

let apptoWebSendJS: commonWebViewProcess = commonWebViewProcess()

 

 

어디에서나 편안히 재사용이 가능하여 코딩 효율을 줄여준다. 끝