본문 바로가기
iOS - 실무관련/iOS

WKWebView - 웹사이트의 버튼이 안눌러질 때?

by print_soo 2022. 8. 18.
//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)
}