【发布时间】:2019-12-05 06:54:58
【问题描述】:
在我的应用程序中,我们使用 Segpay 进行支付,没有合适的 SDK 集成,然后我们从支持的 URL 中创建 URL 并在 SafariViewController 中打开它。
当用户成功完成支付后,我们需要带用户进入首页,如何从SafariViewController知道状态为成功。
【问题讨论】:
标签: ios swift delegates sfsafariviewcontroller
在我的应用程序中,我们使用 Segpay 进行支付,没有合适的 SDK 集成,然后我们从支持的 URL 中创建 URL 并在 SafariViewController 中打开它。
当用户成功完成支付后,我们需要带用户进入首页,如何从SafariViewController知道状态为成功。
【问题讨论】:
标签: ios swift delegates sfsafariviewcontroller
您可以使用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,如果响应失败。(您可以根据自己的要求进行更改)
【讨论】:
任何人都需要使用此代码。
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)
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")
}
}
}
【讨论】: