본문 바로가기
네이티브/Ios

Ios webview에서 javascript를 통해 ios 기능 호출하기 ℡

by 우보틀 2022. 4. 20.

WKWebView와 UiWebView의 차이점

원래 UiWebView가 존재하였지만 ios8에서 WKWebView가 등장하였습니다.
이 과정에서 UiWebView는 deprecated 되었습니다.

WKWebView는 UiWebView 보다 성능이 좋고 효율적으로 동작합니다.
WKWebView는 javascript를 비동기 적으로 처리합니다.
Javascript와 네이티브 코드 간의 통신은 비동기 적으로 처리되고 일반적으로 더 빠르게 실행이 됩니다.

하지만 WKWebView에서는 쿠키를 직접 관리해야 합니다.
쿠키 설정이 필요해서 쿠키를 설정하는 스크립트를 시작시에 실행시켜 주어서 원했던 동작을 구현했던 경험이 있습니다.
(이 부분은 좀 더 develop 예정입니다.)

 

Ios의 Webview를 이용할때

window.webkit.messageHandlers.[method].postMessage 를 이용해 javascript에서 네이티브의 함수를 호출할 수 있습니다.

 

swift 웹뷰 설정 코드

class ViewController: UIViewController {
  var webView: WKWebView!
  
  override func viewDidLoad(){
    super.viewDidLoad()
    setConfig()
    
    let urlRequest = URLRequest(url: URL(string: "https://dkrnfls.tistory.com")!);
    webView.load(urlRequest)
    self.view.addSubview(webView)
  }
  
  func setConfig(){
    let contentController = WKUserContentController()
    contentController.add(self, name: "getToast")
    contentController.add(self, name: "getMainToast")
    
    
    let config = WKWebviewConfiguration()
    config.userContentController = contentController
    
    webView = WKWebView(frame: CGRect.zero, configuration: config)
  }

  func showToast(message: String) {
    let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 75, y: self.view.frame.size.height-100, width: 150, height: 35)) 
    toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6) 
    toastLabel.textColor = UIColor.white 
    toastLabel.font = font 
    toastLabel.textAlignment = .center; 
    toastLabel.text = message 
    toastLabel.alpha = 1.0 
    toastLabel.layer.cornerRadius = 10; 
    toastLabel.clipsToBounds = true 
    self.view.addSubview(toastLabel) 
    UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, 
       animations: { toastLabel.alpha = 0.0 }, 
       completion: {(isCompleted) in toastLabel.removeFromSuperview() }
    )
  }
  
  func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptmMessage) {
    switch message.name {
      case "getToast" :
        showToast(message: mmessage.body as! String)
      case "getMainToast" :
        showToast(message: message.body as! String)
      default :
        ()
    }    
  }
}

 

javascript 호출 코드 

getToast, getMainToast가 직접 설정하신 커스텀 함수의 이름이 됩니다.

window.webkit.messageHandlers.getToast.pushMessage('hihi')
window.webkit.messageHandlers.getMainToast.pushMessage('hihi')

 

1. config 설정할때 이름을 등록 

2. config를 webView의 configuration에 넣어줌

3. useContentController 함수에서 이름에 따른 동작을 취해줌

 

위의 1 -> 2 -> 3 흐름으로 javascript에서 swift의 커스텀 함수를 호출할 수 있습니다

 

 

 

 

출처 : https://developer.apple.com/documentation/webkit/wkwebviewconfiguration

 

Apple Developer Documentation

 

developer.apple.com

https://eddiekwon.github.io/swift/2018/08/02/WebView101/

 

iOS에서 WKWebView 붙이는 방법 · eddie's development log

iOS에서 WKWebView 붙이는 방법 02 Aug 2018 | 프로젝트내에 loginPage.html이 있다는 가정하에 다음과 같이 하면 된다. 참고로 import WebKit 를 반드시 해주어야 한다. //request 만들고 guard let htmlUrl = Bundle.main.ur

eddiekwon.github.io

https://royhelen.tistory.com/46

 

[iOS/Swift] Toast Message 만들기

이번 포스팅은 Toast Message를 만드는 방법을 포스팅하겠습니다~ 일단 Toast 메시지가 뭔지부터 보여드리겠습니다~ 바로 이것입니다. 기본적으로 Toast Message를 띄우는건 안드로이드에서는 자체 라이

royhelen.tistory.com

 

'네이티브 > Ios' 카테고리의 다른 글

Ios splash image 띄우기 (Renewal)  (2) 2022.03.01
Ios 웹뷰 alert, confirm 띄우기  (0) 2022.01.23
Ios 웹뷰 쿠키 native에서 세팅  (0) 2022.01.22
Ios 웹뷰 디버깅  (0) 2022.01.19
Ios Apple Native Login  (0) 2021.12.05