ios - una - permitir ventanas emergentes chrome
WKWebView no abrirá ventanas emergentes de inicio de sesión en las redes sociales (1)
Esos botones de inicio de sesión intentan abrir una nueva pestaña, que no es compatible con WKWebView. Por lo que sé, solo hay una forma de hacerlo.
Primero agregue el método WKUIDelegate
:
-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
NSURL *url = navigationAction.request.URL;
if (navigationAction.targetFrame == nil && [url.absoluteString rangeOfString:@"facebook.com/dialog"].location != NSNotFound) {
//Open new modal WKWebView
}
return nil;
}
En el WKWebView modal, agregue esto:
-(void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
{
NSURL *url = navigationResponse.response.URL;
if ([url.absoluteString rangeOfString:@"close_popup.php"].location != NSNotFound) {
//Close viewController
}
decisionHandler(WKNavigationResponsePolicyAllow);
}
close_popup.php
es para Facebook. Si necesita admitir varias redes sociales, busque algo único en sus URL.
Para que esto funcione, deberá compartir cookies entre WKWebViews. Para hacer esto, debes WKProcessPool
con WKProcessPool
compartido. Prefiero guardarlo en AppDelegate.
WKWebView se puede crear de esta manera:
- (void)createWebView
{
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.processPool = delegate.webViewProcessPool;
self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
self.webView.UIDelegate = self;
self.webView.navigationDelegate = self;
[self.view addSubview:self.webView];
}
En AppDelegate simplemente carga esto:
-(id)webViewProcessPool
{
if (!_webViewProcessPool) {
_webViewProcessPool = [[WKProcessPool alloc] init];
}
return _webViewProcessPool;
}
Tengo un WKWebView en mi aplicación. Todo funciona sin problemas, excepto que el sitio web que muestro tiene los botones de inicio de sesión en las redes sociales. El problema es que muestran (o intentan mostrar) una ventana emergente en la que le permite tener acceso a su cuenta de redes sociales. Investigué esto e intenté algunas cosas, pero ninguna parece encajar. Esto es lo que intenté:
en viewDidLoad, intenté habilitar Javascript en el init:
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
WKPreferences *thePreferences = [[WKPreferences alloc] init];
thePreferences.javaScriptCanOpenWindowsAutomatically = YES;
thePreferences.javaScriptEnabled = YES;
theConfiguration.preferences = thePreferences;
self.wkWeb = [[WKWebView alloc] initWithFrame:screenRect configuration:theConfiguration];
Sin embargo, esto no me ayudó. Luego traté de jugar con los delegados e ir por esa ruta. Intenté jugar con el método createWebViewWithConfiguration, pero eso parece exagerado porque tuve que filtrar si están en la URL de inicio de sesión y configurar una ventana emergente y mostrarla. Y luego, esto todavía no estaba funcionando. También vengo aquí para la lógica de marco principal, si no es así, cancelo la solicitud y la vuelvo a cargar en la vista principal, y esa es una solución fácil de una línea, ya que esta se estaba expandiendo en más de 20 líneas.
Esto parece ser un problema común, pero parece que no puedo encontrar mucha información por ahí. ¿Algunas ideas?
EDITAR - Adición
Después de jugar con la respuesta de Armands, me acerco. Este es mi método createWebViewWithConfig ahora, que solo muestra una superposición de pantalla blanca. Es como si necesitara algo para decirle a la nueva ventana emergente que cargue el contenido. Además, supongo que puedo colocar esta ventana modal en mi archivo .m actual y no necesita un archivo completamente nuevo.
NSURL *url = navigationAction.request.URL;
if(!navigationAction.targetFrame.isMainFrame && [url.absoluteString rangeOfString:@"initiate_"].location != NSNotFound) {
//open new modal webview
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.processPool = [appDelegate getSharedPool];
self.popupLogin = [[WKWebView alloc] initWithFrame:self.wkWeb.bounds configuration:config];
self.popupLogin.frame = CGRectMake(self.wkWeb.frame.origin.x,
self.wkWeb.frame.origin.y,
self.wkWeb.frame.size.width,
self.wkWeb.frame.size.height);
self.popupLogin.navigationDelegate = self;
self.popupLogin.UIDelegate = self;
[webView addSubview:self.popupLogin];
[self.popupLogin loadRequest:navigationAction.request];
return nil;
}