iOS - 실무관련/iOS
WKWebView - 웹사이트의 버튼이 안눌러질 때?
kkkkk1023
2022. 8. 18. 17:29
//busy version
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping
(WKNavigationActionPolicy) -> Void) {
print("scheme: \(navigationAction.request.url?.scheme)")
if let url = navigationAction.request.url
, ["버튼을 클릭했을 때 출력되는 scheme"].contains(url.scheme) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
[시나리오]
WkWebView를 이용해서 웹사이트를 앱에서 띄우는 경우가 있다.
아래와 같이 네이버를 WKWebview로 띄우고 로그인 화면으로 들어가면 앱 로그인과 같은 웹사이트의 버튼이 있다 .
웹만 띄우고 아무처리를 하지 않고 네이버 앱 로그인을 클릭한다면 아래처럼 앱 로그인을 사용할 수 없다는 텍스트가 노출된다.
해결방법
1. 해당 버튼을 클릭했을 때 어떤 scheme으로 이동하는지 알아야하기 떄문에 decidePolicyFor 메소드를 통해서 알아낸다.
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping
(WKNavigationActionPolicy) -> Void) {
print("scheme \(navigationAction.request.url?.scheme)")
decisionHandler(.allow)
}
네이버 앱로그인 같은 경우 클릭했을 때 naversearchthirdlogin로 이동하게된다.
2. decidePolicyFor를 이용해서 들어온 url의 scheme이 해당 scheme이라면 해당 앱을 열어주게된다.
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping
(WKNavigationActionPolicy) -> Void) {
print("scheme \(navigationAction.request.url?.scheme)")
if let url = navigationAction.request.url
, ["naversearchthirdlogin"].contains(url.scheme) { //해당 url에 해당 scheme이 있다면
UIApplication.shared.open(url, options: [:], completionHandler: nil)// 네이버 앱 실행
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}