Swift에서 userContentController(_:didReceive:) 메서드는 WKScriptMessageHandler 프로토콜의 요구사항으로 구현되는 메서드입니다. 이 메서드는 JavaScript에서 WebView로 전달된 메시지를 처리하는 데 사용됩니다.
userContentController(_:didReceive:) 메서드는 다음과 같은 형태로 정의됩니다.
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
WKScriptMessage 매개변수에는 JavaScript에서 전달된 메시지가 포함되어 있습니다. 이 매개변수를 사용하여 다형성을 구현할 수 있습니다. WKScriptMessage는 body라는 속성을 통해 메시지 내용을 포함하고 있으며, 이를 활용하여 메시지의 타입에 따라 다른 작업을 수행할 수 있습니다.
예를 들어, JavaScript에서 다음과 같이 메시지를 전달하는 경우를 생각해 봅시다.
// JavaScript
var message = {
type: "greeting",
content: "Hello, World!"
};
webkit.messageHandlers.myHandler.postMessage(message);
Swift에서 userContentController(_:didReceive:) 메서드를 구현하여 메시지를 처리하는 방법은 다음과 같습니다.
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
guard let messageType = message.body as? [String: Any],
let type = messageType["type"] as? String else {
return
}
switch type {
case "greeting":
if let content = messageType["content"] as? String {
handleGreetingMessage(content)
}
case "otherMessageType":
// Handle other message type
break
default:
break
}
}
func handleGreetingMessage(_ content: String) {
// Handle greeting message
print(content)
}
위의 예제에서는 "greeting" 메시지 타입과 "otherMessageType" 메시지 타입을 처리하는 방법을 보여줍니다.
- "greeting" 메시지 타입: messageType["content"]를 추출하여 content 변수로 캐스팅한 후, handleGreetingMessage(_:) 함수를 호출하여 메시지 내용을 처리합니다.
- "otherMessageType" 메시지 타입: messageType["data"]를 추출하여 [String: Any] 형식으로 캐스팅한 다음, 내부에서 필요한 값을 추출합니다. 이 예제에서는 "value" 키를 사용하여 Int 값으로 추출한 후, handleOtherMessage(_:) 함수를 호출하여 해당 값을 처리합니다.
이와 같이 switch 문을 활용하여 메시지의 다양한 유형을 처리할 수 있습니다. 각각의 메시지 유형에 대한 작업을 추가하고, 필요한 데이터를 추출하여 해당하는 함수를 호출하면 됩니다.
따라서, 메시지의 타입에 따라 다른 작업을 수행하고자 할 때, userContentController(_:didReceive:) 메서드에서 message.body를 적절히 캐스팅하여 다형성을 구현하고, 추출된 데이터를 활용하여 처리하는 방식으로 진행하면 됩니다.
댓글