Lined Notebook

[swift] javascript 연동했는데 alert이 안뜰 때 ㅋㅋ

by 사슴비행기

https://doorganizedcoding.tistory.com/31

 

[objective-c] javascript 연동했는데 alert 안뜰 때

https://doorganizedcoding.tistory.com/29 swift 글 참고 추가한 코드만 적었다. #import @interface EasyWKWebViewController : UIViewController @end _webView.UIDelegate =..

doorganizedcoding.tistory.com

Objective-C는 위에 참고.

 

ㅠㅠ 되게 간단한 문제다.

일단 문제 : <script></script> 코드 안에 alert("아무말"); 을 적어도 어떠한 alert도 뜨지 않는다. 그런데 해당 html 파일을 더블클릭하여 웹에서 열었을 경우, 대화상자가 아주 잘! 뜬다.

여기서 도출 할 수 있는 것은 일단, Swift에서 뭔가 설정을 잘못했기 때문이다.

 

바로 결론을 말하면,

네이티브에서 <script> 코드 안에서 사용한 alert이 작동하게 하려면 WKUIDelegate(WKWebView를 썼다고 가정)를 extension해서

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void)

해당 메소드를 정의해주어야 한다.

 

애플 개발문서에 보면

alert의 모습에 따라서 여러 메소드가 있는데

설명에 나와있듯이,

alert은 runJavaScriptAlertPanelWithMessage를 재정의하고

confirm은 runJavaScriptConfirmPanelWithMessage를 재정의하고

input은 runJavaScriptTextInputPanelWithPrompt를 재정의하면 된다.

 

Javascript에서는 alert은 버튼이 [확인] 한개이고

confirm은 버튼이 [취소] [확인] 두개이고

input은 .. 나도 모르는데 ㅋㅋㅋㅋ 암튼 이것도 대화상자에 입력필드가 있는 뭐시기였던 것 같다..

이건 나중에 수정하던지 더 공부해서 포스팅하던지 해야할 듯!

 

아무튼 WKWebView를 사용한다면 헤메지 말고 꼭 재정의 해주자.

 

    //javaScript의 alert을 띄웁니다. [확인]버튼
    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
                 completionHandler: @escaping () -> Void) {
        
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "확인", style: .default, handler: { (action) in
            completionHandler()
        }))
        
        present(alertController, animated: true, completion: nil)
    }
    //javaScript의 alert을 띄웁니다. [확인], [취소]버튼
    func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
                 completionHandler: @escaping (Bool) -> Void) {
        
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert)
        
        alertController.addAction(UIAlertAction(title: "확인", style: .default, handler: { (action) in
            completionHandler(true)
        }))
        
        alertController.addAction(UIAlertAction(title: "취소", style: .default, handler: { (action) in
            completionHandler(false)
        }))
        
        present(alertController, animated: true, completion: nil)
    }
    
    //javaScript의 alert을 띄웁니다. [확인], [취소]버튼 + 텍스트 입력 패널
    func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo,
                 completionHandler: @escaping (String?) -> Void) {
        
        let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .alert)
        
        alertController.addTextField { (textField) in
            textField.text = defaultText
        }
        
        alertController.addAction(UIAlertAction(title: "확인", style: .default, handler: { (action) in
            if let text = alertController.textFields?.first?.text {
                completionHandler(text)
            } else {
                completionHandler(defaultText)
            }
        }))
        
        alertController.addAction(UIAlertAction(title: "취소", style: .default, handler: { (action) in
            completionHandler(nil)
        }))
        
        present(alertController, animated: true, completion: nil)
    }

 

블로그의 정보

Beautiful Coding

사슴비행기

활동하기