如何从 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 的请求