[iOS,Swift] App과 Web 통신하기 (Webkit MessageHandlers)
하이브리드 앱을 만들면서 앱과 웹 사이에 정보교류가 필요하게된다
웹에서 앱을 호출하여 네이티브적인 요소를 동작시키거나
반대로 앱에서 웹을 호출하여 웹에서의 동작 또는 데이터를 넘겨주거나 할때 말이다
우선 웹에서 앱을 호출하게 될때를 알아보자
let configuration = WKWebViewConfiguration()
class ViewController: UIViewController,WKScriptMessageHandler {
...
let contentController = WKUserContentController()
contentController.add(self,name:"setId")
configuration.userContentController = contentController
webView = WKWebView.init(frame: .zero, configuration: configuration)
...
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print("message","msg in",message.name)
if message.name == "setId"{
print("message","body",message.body)
}
}
}
우선 웹과의 통신을 하기위해서 WKScriptMessageHandler 프로토콜을 사용한다
WKWebViewConfiguration 를 생성한뒤 WKUserContentController 를 통해서 연결을 시켜주는 방식이다
contentController에 setId 로 호출할수있도록 add 시켜주고 이를 configuration.userController 로 만들어준다
그리고 webView를 만들때 해당 configuration을 설정해주면 만들어진 웹뷰에 Webkit MessageHandlers 를 통하여
setId를 호출할수 있게된다
웹에서 호출하게되면 앱에서는 message로 받아지며 호출된 name 이름과 body 전달된 string 데이터 이렇게 되게된다
이번에는 웹에서 앱을 호출하는 코드를 보자
window.webkit.messageHandlers.setId.postMessage("아이디입니다");
이처럼 스크립트를 호출해주면 setId 는 message.name 으로 postMessage 의 값인 "아이디입니다" 부분은 message.body로
앱으로 전달이되며 이를 통해서 네이티브적인 동작을 하면된다
빈값을 보낸다고하여도 "" 빈값의 String을 보내야 에러없이 동작하게 되며 많은 값의 데이터를 보내야 하는경우에는
json으로 해서 전달한뒤 파싱하여 사용하는 방식을 쓰고있다
이제 다시 앱에서 처리를한뒤 웹으로 데이터를 주게 된다면 스크립트를 호출하게 되는데
안드로이드와 다르게 urlLoad 등으로 호출하는것이 아닌 webView.evaluateJavaScript 를 이용하여 스크립트를 호출하면된다
webView.evaluateJavaScript("setToken('\(token)')", completionHandler: nil)
전달 후 콜백을 받고싶다면 handler를 연결하여 다음동작도 이어갈수있다