我是Xcode的新手,我希望使用UIWebView
创建一个应用程序,它会将我带到具有登录页面的特定URL,并且在成功登录后我希望它重定向到特定的URL。这是我公司的一个网站,当我登录我们的网站时,我正在使这个应用程序变得轻松。我已经成功地创建了一个UIWebView
,它将我带到登录页面,但不确定如何检测登录以重定向下一个URL。
答案 0 :(得分:1)
此时您真的不应该使用UIWebView
来获取新代码。而是使用WKWebView
。
您必须以编程方式将WKWebView添加到视图层次结构中。为此,请添加以下内容:
var webView:WKWebView?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.webView = WKWebView(frame: CGRectZero)
self.webView?.navigationDelegate = self
}
override func viewDidLoad() {
super.viewDidLoad()
if let webView = self.webView
{
view.insertSubview(webView, belowSubview: goButton)
webView.translatesAutoresizingMaskIntoConstraints = false
let height = NSLayoutConstraint(item: webView, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 1, constant: -44)
let width = NSLayoutConstraint(item: webView, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: 1, constant: 0)
let offset = NSLayoutConstraint(item: webView, attribute: .Top, relatedBy: .Equal, toItem: goButton, attribute: .Bottom, multiplier: 1, constant: 0)
view.addConstraints([height, width, offset])
完成后,您可以通过实施WKNavigationDelegate
:
// MARK: - WKNavigationDelegate
func webView(webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
print("didReceiveServerRedirectForProvisionalNavigation")
if ( self.webView!.URL?.absoluteString == "https://myserver.com/successurl" )
{
print("SUCCESS")
self.webView!.stopLoading()
// do something here, like remove this from the nav controller
self.navigationController?.popViewControllerAnimated(true)
}
}
func webView(webView: WKWebView, didCommitNavigation navigation: WKNavigation!) {
print("didCommitNavigation - content arriving?")
}
func webView(webView: WKWebView, didFailNavigation navigation: WKNavigation!, withError error: NSError) {
print("didFailNavigation")
}
func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print("didStartProvisionalNavigation \(navigation)")
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
print("didFinishNavigation")
webView.evaluateJavaScript("document.documentElement.outerHTML.toString()",
completionHandler: { (html: AnyObject?, error: NSError?) in
//print(html)
})
}
您可以在此处对流进行大量控制,正如您可以从委托中的所有协议方法中看到的那样。
答案 1 :(得分:0)
UIWebView
有一个委托,您可以将其设置为实现UIWebViewDelegate
协议的对象。您可以实施:
func webView(_ webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType navigationType: UIWebViewNavigationType) -> Bool
在里面。因此,一种简单的方法是在承载Web视图的VC中实现。添加:
, UIWebViewDelegate
到您的班级声明。
您需要将webView的委托属性设置为视图控制器。
然后添加此功能:
func webView(_ webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType navigationType: UIWebViewNavigationType) -> Bool {
// You can look at request and navigation type and decide to return
// false and redirect the webview yourself.
// If the load is ok, return true.
}
如果您需要比此更多的控制,您可能需要查看此WebKit版本(WKWebView
),这是新应用程序的首选Web视图,并具有许多用于控制它的功能。