ios - 如何在成功登录 UIWebView 后重定向回应用程序

标签 ios swift uiviewcontroller uiwebview uistoryboard

我正在使用带有 UIWebView 的 UIViewController。在此 UIWebView 中,用户必须登录,并且在成功登录后应将用户重定向回应用程序。 但就我而言,它保留在 UIWebView 中,不会将我重定向回应用程序。

我尝试在 API Delegate 中使用这段代码:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    DispatchQueue.main.async {
        if (url.scheme == "go-back"){
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let controller = storyboard.instantiateViewController(withIdentifier: "WebView") as! ViewController
            self.window?.rootViewController!.present(controller, animated: true, completion: { () -> Void in
            })
        }
    }
    return true
}

并创建了一个 URL 方案,但它不起作用。

最佳答案

第一步:

在您的 ViewController 中使用 WKWebView 而不是 UIWebView

第二步:

让您的 ViewController 成为 WKWebView 的委托(delegate)

    webView.navigationDelegate = self
    webView.uiDelegate = self

第三步:

最后在你的 ViewController 中实现 WKNavigationDelegate

    extension ViewController : WKNavigationDelegate{

        func webView(
            _ webView: WKWebView,
            decidePolicyFor navigationAction: WKNavigationAction,
            decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

            guard let url = navigationAction.request.url else {
                decisionHandler(.allow)
                return
            }

            //now u and ur server team can decide on what url will they redirect and what will be url string on login success
            //lets say u and ur server team decides url to be https://some_base_url/login/success

           if url.absoluteString.contains("/login/success") {
                // this means login successful
                decisionHandler(.cancel)
                _ = self.navigationController?.popViewController(animated: false)
            }
            else {
                decisionHandler(.allow)
            }
        }
}

编辑:

由于 OP 的代码有问题,我正在更新答案以解决问题

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate{

    var webView: WKWebView!


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

    override func viewDidLoad() {
        super.viewDidLoad()

        let myURL = URL(string: "https://")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }

    func webView(
        _ webView: WKWebView,
        decidePolicyFor navigationAction: WKNavigationAction,
        decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

        guard let url = navigationAction.request.url else {
            decisionHandler(.allow)
            return
        }


        if url.absoluteString.contains("/login/success") {
            // this means login successful
            decisionHandler(.cancel)
            _ = self.navigationController?.popViewController(animated: false)
        }
        else {
            decisionHandler(.allow)
        }
    }
}

关于ios - 如何在成功登录 UIWebView 后重定向回应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46278844/

相关文章:

ios - 让图像 if nil 在 swift 3 中消失(或缩小,使其看起来消失)

ios - 在进行最小滚动或点击之前,单元格不会显示在表格 View 中(注意 : nothing happens on a background thread)

ios - 另一个 Collection View 内的 Collection View 单元格的约束

ios - 在 Swift 中以编程方式创建 UITableView

ios - Swift:将 View 从堆栈 View 带到前面

ios - 你如何覆盖只读属性以在子类中读写

ios - 关闭 UIViewController 还是只初始化最顶层?

iphone - 自定义 UIView 子类作为 UIViewController 属性

ios - ios 7工具栏顶部边缘出现一个像素的细线

ios - 如何通过子类化UIButton获得按钮的背景图像名称?