Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Javascript Interface (웹뷰와 자바스트립트 연동, WKWebView, WKScriptMessageHandler) 본문

iOS 기본 (swift)

[iOS - swift] Javascript Interface (웹뷰와 자바스트립트 연동, WKWebView, WKScriptMessageHandler)

jake-kim 2021. 4. 4. 14:39

Javascript의 인터렉션 -> iOS에서 받는 방법

  • javacript에서 특정 이벤트가 발생한 경우 메세지를 iOS에 넘기는 방식
  • iOS에서 메세지를 파싱하여, 해당 메세지에 관한 이벤트 처리를 하는 방식(뒤로가기, statusBar색상 변경)
  • iOS에서 WKScriptMessageHandler 델리게이트를 구현하여 이벤트를 받는 형태

javasript interface 정의

시그니처 javascript
statusBar 색상 변경: changeStatusBarColor webkit.messageHandlers.MyJavacriptInterfaces.postMessage([
    action: 'changeStatusBarColor',
    bgColor: '#FFFFFF'
    isDarkIcon: true
])
뒤로가기 버튼 누른 경우: goBack webkit.messageHandlers.MyJavascriptInterfaces.postMessages([
    action: 'goBack',
])

사용 방법

  • 델리게이트 할당
let messageHandlerName = "MyJavascriptInterfaces"

func setUpWebView(with config: KWebViewConfiguration) {
    let contentController = WKUserContentController()
    contentController.add(self, name: messageHandlerName) // delegate와 name설정
    config.userContentController = contentController
    webView = WKWebView(frame: .zero, configuration: config)
}
  • 델리게이트 구현
enum WebAction: String {
    case changeStatusBarColor
    case goBack
}

extension BaseWebViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {

        if message.name == messageHandlerName {
            if let dics: [String: Any] = message.body as? Dictionary, let action = dics["action"] as? String {

                let webAction = WebAction(rawValue: action)
                switch webAction {
                case .changeStatusBarColor:
                    if let color = dics["bgColor"] as? String, let isDarkIcon = dics["isDarkIcon"] as? Bool {
                        self.statusBarView?.backgroundColor = UIColor(hexString: color)
                        if isDarkIcon == true {
                            statusBarStyle = .default
                        } else {
                            statusBarStyle = .lightContent
                        }
                        setNeedsStatusBarAppearanceUpdate()
                    }
                case .goBack:
                    self.popVC()
                default:
                    print("Undefined action: \(String(describing: webAction))")
                }
            }
        }
    }
}

 

Comments