본문 바로가기
iOS

[Xcode] ios에 alert와 confirm 활성화 시키기

by whoyoung90 2022. 7. 26.
반응형

> 이슈

웹킷뷰(WKwebview)를 통해 모바일 앱을 만들었을 때

alert() , confirm()이 안드로이드와 달리 IOS 앱에서는 반응하지 않았다! (클릭하면 묵묵부답...)

 

웹킷뷰(WKWebView)에서 자바스크립트를 실행하기 위해

자바스크립트 모드를 활성화 시키는 기본 로직은 구축해 놓았지만,

 

IOS에서 alert와 confirm을 띄우려면 ViewController에 UIViewController 뿐만 아니라

WKUIDelegate를 추가적으로 설정해야 한다.

 

 

> 해결

⭐️⭐️ WKUIDelegate를 활성화 하기 위해 viewDidLoad에 한줄 추가하고

class ViewController: UIViewController {

  let webView:WKWebView = {
    // ...
  }()
    
  override func viewDidLoad() {
    self.webView.uiDelegate = self ⭐️⭐️
    // ...
  }
    
  override func viewDidLayoutSubviews() {
    // ...
  }
}

 

 

기존 ViewController: UIViewController 아래에 WKUIDelegate 로직을 extension해주면 완료!

extension ViewController: WKUIDelegate {
  // alert() 적용
  func webView(
    _ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String,
    initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void
  ) {
    let alertController = UIAlertController(title: "알림", message: message, preferredStyle: .alert)
    let cancelAction = UIAlertAction(title: "확인", style: .cancel) { _ in
      completionHandler()
    }
    alertController.addAction(cancelAction)
    DispatchQueue.main.async {
      self.present(alertController, animated: true, completion: nil)
    }
  }

  // confirm() 적용
  func webView(
    _ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String,
    initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void
  ) {
    let alertController = UIAlertController(title: "알림", message: message, preferredStyle: .alert)
    let cancelAction = UIAlertAction(title: "취소", style: .cancel) { _ in
      completionHandler(false)
     }
     let okAction = UIAlertAction(title: "확인", style: .default) { _ in
       completionHandler(true)
     }
     alertController.addAction(cancelAction)
     alertController.addAction(okAction)
     DispatchQueue.main.async {
       self.present(alertController, animated: true, completion: nil)
     }
   }
}

 

[참고 URL]

https://mrgamza.tistory.com/489

반응형

댓글