es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para detectar si se cierra una ventana emergente en WKWebView en iOS

    Una posible solución es utilizar el método webView (_ : runJavaScriptAlertPanelWithMessage: initiatedByFrame: completionHandler :) del protocolo WKUIDelegate. Este método se llama cuando la página web intenta mostrar un panel de alerta JavaScript.

    Puede detectar si el mensaje de alerta contiene la cadena “No se pudo completar la operación” (que se muestra cuando el usuario toca Cancelar en la ventana emergente de autenticación de Apple), y luego cerrar el controlador de vista con la WKWebView.

    Aquí hay una implementación de ejemplo:

    class MyWKWebViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {
    
        var webView: WKWebView!
    
        override func loadView() {
            let config = WKWebViewConfiguration()
            config.preferences.javaScriptEnabled = true
            config.preferences.javaScriptCanOpenWindowsAutomatically = true
    
            webView = WKWebView(frame: .zero, configuration: config)
            webView.navigationDelegate = self
            webView.uiDelegate = self
    
            view = webView
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let url = URL(string: "https://appleid.apple.com/auth/authorize?response_type=code&client_id=...&redirect_uri=...&response_mode=...")
            webView.load(URLRequest(url: url!))
        }
    
        func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
            if message.contains("No se pudo completar la operación") {
                dismiss(animated: true, completion: nil)
            } else {
                completionHandler()
            }
        }
    }
    

    En este ejemplo, la clase MyWKWebViewController implementa los protocolos WKNavigationDelegate y WKUIDelegate. El método WKUIDelegate webView(_:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:) se implementa para capturar el mensaje de alerta JavaScript y determinar si corresponde al cierre de la ventana emergente. Si es así, se cierra el controlador de vista.

    Tenga en cuenta que esta solución solo funciona si la ventana emergente se cierra cuando el usuario toca el botón Cancelar. Si la ventana emergente se cierra de otra manera, este método no la detectará.

Comments are closed.