누군가에게 알려주기 보다는 나 스스로 정리 하며 언젠가 다시 사용할 때를 대비하는 글을 작성할것이다.
참고자료 : WKUserContentController 공식문서
Document: WKUserContentController
WKUserContentController 오브젝트는 앱과 웹 뷰에서 실행 중인 JavaScript 코드 사이의 연결을 제공한다.
다음의 오브젝트를 사용해 다음의 작업을 수행할 수 있다.
전체적으로 웹 뷰 설정으로 WKUserContentController 오브젝트를 생성하고 구성한다.
웹 뷰 생성 전 해당 오브젝트를 WKWebViewConfiguration 오브젝트의 userContentController 프로퍼티에 할당한다.
해당 기능을 사용하기 위해서는 웹 뷰는 코드로 생성을 해야 한다.
웹 뷰 초기화 함수의 configuration
을 사용해야 하는데 이는 코드로만 접근이 가능하기 때문이다.
let contentController = WKUserContentController()
let cofiguration = WKWebViewConfiguration()
contentController.add(self, name: "MyInterfaceName")
configuration.userContentController = contentController
let webView = WKWebView(frame: .zero, configuration: configuration)
WKScriptMessageHandler
를 채택해 해당 프로토콜의 func userContentController(WKUserContentController, didReceive: WKScriptMessage)
함수로 이벤트를 받아온다.
WKScriptMessage 은 다음과 같은 형태를 띄고 있다.
open class WKScriptMessage : NSObject {
open var body: Any { get }
weak open var webView: WKWebView? { get }
@NSCopying open var frameInfo: WKFrameInfo { get }
open var name: String { get }
@available(iOS 14.0, *)
open var world: WKContentWorld { get }
}
프로토콜을 채택해서 함수로 이벤트를 받아오는 방법은 다음과 같다.
class WebViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
let name = message.name
if let body = message.body as? String {
...
}
}
}
이런식으로 message
를 사용하여 받아온 값을 다루면 된다.
이거 테스트 하는 방법은 웹을 직접 할 수 있는 분이 개발자용 도구 열어서 하라고는 하는데
필자는 진행하는 프로젝트에서 사용하는 부분인지라 다 구현이 되어있어서 따로 직접 웹 관련 무언가는 하지 않아서 해당 부분에 대해서는 따로 말을 해줄 수는 없다.
당연 틀린 부분 지적은 감사하나 비난은 정중하게 사양하겠다.