//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)
}
'iOS - 실무관련 > iOS' 카테고리의 다른 글
왜 @IBOutlet에 didSet으로 설정을 몰아 놓는가? (0) | 2022.09.20 |
---|---|
WidgetKit에 대한 간단한 설명 (0) | 2022.09.13 |
NotificationCenter로 다른 VC 조종하기 (0) | 2022.08.17 |
IBSegueAction사용해서 화면전환하기 (0) | 2022.08.04 |
Designated Init / Convenience Init / Failable Init / Super.init / required init (0) | 2022.07.30 |