I have a WKWebView in my app. Everything is running smooth except the website I show has the social media logon buttons. The problem is, they display (or try to display) a popup where you allow it to have access to your social media account. I have researched this and tried a few things, but none seem to fit. Here is what I tried:
in viewDidLoad, I tried to enable Javascript on the 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];
However, this didn't help me. Then I tried to play with the delegates and go that route. I tried playing around with the createWebViewWithConfiguration method, but that seems like overkill because I had to filter out if they are at the login URL then configure a popup and display it. And then this still wasn't working. I also come in here for the if not main frame logic, cancel the request and reload it in the main view, and that is an easy one-line fix where as this was ballooning into 20+ lines.
This seems like a common problem, but I can't seem to find a lot of information out there. Any ideas?
After playing around with Armands answer, I get closer. This is my createWebViewWithConfig method now, which just displays a white screen overlay. It's like I need something to tell the new popup to load the content. Also - I assume I can place this modal window in my current .m file and it doesn't need a completely new file?
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;
}
Swift 4 and Swift 5
Create two instance of WKWebView
var webView : WKWebView!
var newWebviewPopupWindow: WKWebView?
Now implement the methods
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
newWebviewPopupWindow = WKWebView(frame: view.bounds, configuration: configuration)
newWebviewPopupWindow!.autoresizingMask = [.flexibleWidth, .flexibleHeight]
newWebviewPopupWindow!.navigationDelegate = self
newWebviewPopupWindow!.uiDelegate = self
view.addSubview(newWebviewPopupWindow!)
return newWebviewPopupWindow!
}
func webViewDidClose(_ webView: WKWebView) {
webView.removeFromSuperview()
newWebviewPopupWindow = nil
}
Also make sure this string in the Info.plist if your code is still not working.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With