No se puede detectar si el usuario ha presionado el botón de Cancelar en la ventana emergente de inicio de sesión de Apple en WKWebView.
Tengo un WKWebView que carga una URL del tipo “https://appleid.apple.com/auth/authorize?responsetype=code&clientid=…&redirecturi=…&responsemode=…” y así sucesivamente. Cuando se carga, veo una ventana emergente de autenticación de Apple como esta.
Quiero cerrar el viewController con este webView si el usuario toca Cancelar en esta ventana emergente, pero no puedo detectar este evento. Agregar un escuchador de eventos como este no está funcionando:
let config = WKWebViewConfiguration()
let source = "document.addEventListener('AppleIDSignInOnFailure', (error) => { window.webkit.messageHandlers.iosListener.postMessage('Got error'); })"
let script = WKUserScript(source: source, injectionTime: .atDocumentStart, forMainFrameOnly: false)
config.userContentController.addUserScript(script)
config.userContentController.add(self, name: 'iosListener')
webView = WKWebView(frame: .zero, configuration: config)
¿Alguien podría decirme si hay alguna manera de detectar si se cerró la ventana emergente?
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:
En este ejemplo, la clase
MyWKWebViewController
implementa los protocolosWKNavigationDelegate
yWKUIDelegate
. El métodoWKUIDelegate
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á.