Swift

ios 웹뷰와 통신 (Native <-> JavaScript 통신)

kkimin 2021. 7. 21. 18:24

WKWebView

https://developer.apple.com/documentation/webkit/wkwebview

 

Apple Developer Documentation

 

developer.apple.com

WKWebView before IOS 11.0 (NSCoding support was broken in previous versions)

 

이 오류는

stackoverflow에서 찾아보니 iOS 11 이전 버전인 경우 storyboard에서 WebKit View를 사용못하는거 같습니다.

아래처럼 코드로 작성해주면 된다.

	override func loadView() {
		let webConfiguration = WKWebViewConfiguration()
		webView = WKWebView(frame: .zero, configuration: webConfiguration)
		webView.uiDelegate = self
		view = webView
	}

 

계속 흰 화면으로 안뜨는데 어이없게도,,, simulator에서만 그렇다는 사실을 알게되었다...그런데 아무리 서칭을 해도 이유를 모르겠다. 

아래 방법으로 했는데,,, 실물기기에서만 화면이 출력되었다.

override func viewDidLoad() {
		super.viewDidLoad()
		webView.load("https://www.apple.com")
	}
    
    
extension WKWebView {
	func load(_ urlString: String) {
		if let url = URL(string: urlString) {
			let request = URLRequest(url: url)
			load(request)
		}
	}
}

 

따라서, 다른 방법을 도입해보기로 했다. (우선 통신이 필요한 상황이었으니, 프로젝트내의 html파일을 작성)

 


WKScriptMessageHandler 사용.

 

WKUserContentController

https://developer.apple.com/documentation/webkit/wkusercontentcontroller

웹뷰

let contentController = WKUserContentController()
webView.configuration.userContentController = contentController
webView.configuration.userContentController.add(self, name: "name string")

 

WKScriptMessageHandler 

위 프로토콜을 채택하여 didReceive 함수로 이벤트를 받아옵니다.

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
		if message.name == "name string" {
			print(message.body as? String)
		}
	}

 

 

세션 유지 관련된 내용도 필요하다.

 

728x90