Всплывающее окно WKWebView не отображается - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над простым приложением, которое делает веб-просмотр веб-сайта, где студенты могут сдавать экзамены.

Итак, в основном проблема, с которой я столкнулся, заключается в том, что, когда студенты закончили, они должны нажать на кнопку, которая отправит ответы. Появится всплывающее окно, чтобы заставить их подтвердить. https://i.stack.imgur.com/5GhB8.png За исключением того, что это не обнаруживается. Ничего не происходит, когда кнопка нажата. Он работает безупречно в Safari, и я заметил, что он работает в устаревшем веб-представлении (UIWebview), но я пытался заставить его работать в WKWebView.

Я определенно не быстрый эксперт, поэтому я прошу прощения, если ответ прост. Я пытался найти ответы на некоторые вопросы о своей проблеме, но я не уверен, как ее решить.

Заранее спасибо за любую помощь,

import UIKit
import WebKit

class webViewController: UIViewController {

    @IBOutlet weak var webview: WKWebView!

    override func viewDidLoad() {

        super.viewDidLoad()

        let lien = "***"
        if let url = URL(string: lien) {
            let request = URLRequest(url: url)
            _ = webview.load(request);
        }
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Я попробовал наоборот, и это сработало для меня. Вот код: Создать экземпляр WebView

fileprivate var webView: WKWebView?

Инициализируйте экземпляр и сделайте его назначенным для просмотра.

override func loadView() {
    webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
    webView?.uiDelegate = self
    webView?.navigationDelegate = self
    view = webView
}

После этого просто добавьте следующий метод делегата:

func webView(_: WKWebView, createWebViewWith _: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures _: WKWindowFeatures) -> WKWebView? {
    self.webView?.load(navigationAction.request)
    return nil
}

Вуаля! Все будет работать так же, как UIWebView.

Примечание. Вы не сможете нажать несколько ссылок на веб-сайте, потому что это будет HTTP вместо HTTPS. WKWebView по умолчанию блокирует все незащищенные HTTP-запросы.

Чтобы обойти, просто добавьте NSExceptionAllowsInsecureHTTPLoads как true в info.plist файл.

0 голосов
/ 14 июня 2019

Мое решение заключалось в реализации WKUIDelegate и добавлении функций для различных сценариев (оповещений), которые может отображать веб-представление:

extension WKWebViewController: WKUIDelegate {

    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)

        alertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "OK button"), style: .default, handler: { (action) in
            completionHandler()
        }))

        present(alertController, animated: true, completion: nil)
    }

    func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)

        alertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "OK button"), style: .default, handler: { (action) in
            completionHandler(true)
        }))

        alertController.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: "Cancel button"), style: .default, handler: { (action) in
            completionHandler(false)
        }))

        present(alertController, animated: true, completion: nil)
    }

    func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
        let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet)

        alertController.addTextField { (textField) in
            textField.text = defaultText
        }

        alertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "OK button"), style: .default, handler: { (action) in
            if let text = alertController.textFields?.first?.text {
                completionHandler(text)
            } else {
                completionHandler(defaultText)
            }
        }))

        alertController.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: "Cancel button"), style: .default, handler: { (action) in
            completionHandler(nil)
        }))

        present(alertController, animated: true, completion: nil)
    }

}
0 голосов
/ 04 июля 2018

Я также сталкивался с подобной проблемой, у меня всплывающее окно для подключения Facebook не отображается в WKWebView, но отлично работает в браузере Safari.

Этот код вызывал проблему.

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
//This condition was causing the problem while trying to get popup
    if (!navigationAction.targetFrame.isMainFrame) {
        [webView loadRequest:navigationAction.request];
    }
    return nil;
}

Я изменил его на следующий код, и он работал

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
    if (navigationAction.targetFrame == nil) {
        NSURL *tempURL = navigationAction.request.URL;
        NSURLComponents *URLComponents = [[NSURLComponents alloc] init];
        URLComponents.scheme = [tempURL scheme];
        URLComponents.host = [tempURL host];
        URLComponents.path = [tempURL path];
        if ([URLComponents.URL.absoluteString isEqualToString:@"https://example.com/Account/ExternalLogin"]) {
            WKWebView *webViewtemp = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
            webViewtemp.UIDelegate = self;
            webViewtemp.navigationDelegate = self;
            [self.view addSubview:webViewtemp];
            return webViewtemp;
        } else {
            [webView loadRequest:navigationAction.request];
        }
    }
    return nil;
}

Swift версия:

func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    if navigationAction.targetFrame == nil {
        let tempURL = navigationAction.request.url
        var components = URLComponents()
        components.scheme = tempURL?.scheme
        components.host = tempURL?.host
        components.path = (tempURL?.path)!
        if components.url?.absoluteString == "https://example.com/Account/ExternalLogin" {
            let webViewtemp = WKWebView(frame: self.view.bounds, configuration: configuration)
            webViewtemp.uiDelegate = self
            webViewtemp.navigationDelegate = self
            self.view.addSubview(webViewtemp)
            return webViewtemp
        } else {
            webView.load(navigationAction.request)
        }
    }
    return nil
}

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...