【问题标题】:How to get the text from SafariViewController to our application swift?如何从 SafariViewController 快速获取文本到我们的应用程序?
【发布时间】:2019-12-05 06:54:58
【问题描述】:

在我的应用程序中,我们使用 Segpay 进行支付,没有合适的 SDK 集成,然后我们从支持的 URL 中创建 URL 并在 SafariViewController 中打开它。

当用户成功完成支付后,我们需要带用户进入首页,如何从SafariViewController知道状态为成功。

我在SafariViewController 上收到来自后端的回复,在 webview 页面上是这样的:

【问题讨论】:

    标签: ios swift delegates sfsafariviewcontroller


    【解决方案1】:

    您可以使用WKWebview 代替 Safari,如下所示。

    创建WKWebView的属性

    private var webView: WKWebView!
    

    viewDidLoad方法中初始化webview如下...

    let jScript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"
    let wkUScript = WKUserScript(source: jScript, injectionTime: .atDocumentStart, forMainFrameOnly: true)
    let wkUController = WKUserContentController()
    wkUController.addUserScript(wkUScript)
    
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.userContentController = wkUController
    
    webView = WKWebView(frame: view.bounds, configuration: webConfiguration)
    webView.navigationDelegate = self
    view.addSubview(webView)
    let url = URL(string: "https://...") //set url to load in webview
    let req = URLRequest(url: url)
    webView.load(req)
    

    实现WKWebView的如下委托方法。

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("document.getElementById('response_success').textContent", completionHandler: { (html, error) in
    
            if let content = html as? String {
                print(content)
    
                if content.lowercased().contains("ok") { //here you can place the status coming from server for comparison
    
                   //handle success response
                }
            }
        })
        webView.evaluateJavaScript("document.getElementById('response_fail').textContent", completionHandler: { (html, error) in
    
            if let content = html as? String {
                print(content)
    
                if content.lowercased().contains("fail") { //here you can place the status coming from server for comparison
    
                   //handle fail response
                }
            }
        })
    }
    

    注意:您需要让您的后端团队使用ID为response_success的标签在webview中发布数据,如果响应成功&response_fail,如果响应失败。(您可以根据自己的要求进行更改)

    【讨论】:

    • 您是否设置了要在 webview 中加载的 URL?
    • 你为什么需要所有的javascript?我认为最好只解析从 Segpay 获得的 Json,仅此而已。还是我在问题中遗漏了什么?
    • jscrip 用于将网页覆盖到设备宽度。
    【解决方案2】:

    任何人都需要使用此代码。

    对于加载 URL:

     let webConfiguration = WKWebViewConfiguration()
            webView = WKWebView(frame: .zero, configuration: webConfiguration)
            webView.uiDelegate = self
            webView.navigationDelegate = self
            view = webView
            let myURL = URL(string: "YOUR_URL")
            let myRequest = URLRequest(url: myURL!)
            webView.load(myRequest)
    

    处理 URL 的委托方法:

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    
            if let url = webView.url?.absoluteString{
                if url.contains("success.php"){
                    print("SUCCESS CASE")
                }else if url.contains("fail.php"){
                    print("FAILURE CASE")
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多