如何从 SafariViewController 快速获取文本到我们的应用程序?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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")
            
        
    

【讨论】:

以上是关于如何从 SafariViewController 快速获取文本到我们的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

在 AppDelegate 中设置 UIButton 外观时如何更改 SafariViewController 中导航栏的色调

通过 SafariViewController 安装 MDM 配置文件

区分来自 MobileSafari 与 SafariViewController 的请求

Swift SafariViewController 动画

使用 SafariViewController 打开 url 时如果不成功则处理完成

在 UIWebview 之类的 ViewController 中使用 SafariViewController