2015-09-07 53 views
15

我有应装入以下网址WKWebView:WKWebView不会加载https URL?

https://buchung.salonmeister.de/place/#offer-details-page?id=907599&venueId=301655 

她是我使用的代码:

import UIKit 
import WebKit 


class MMWKBrowserController: UIViewController { 

    private let closeButtonSelector: Selector = "closeButtonTapped:" 

    private var urlString: String 
    private let request: NSMutableURLRequest 

    private var webView: WKWebView! 
    private var twoLineTitleView: UIView! 
    private var titleLabel: UILabel? 
    private var subTitleLabel: UILabel? 
    private var indicator: UIActivityIndicatorView! 


    init(urlString: String) { 
    self.urlString = urlString 

    println("*** Using MMWKBrowserController ***") 

    var url: NSURL? = NSURL(string: urlString) 
    if url == nil { 
     var escapedString: String = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
     self.urlString = escapedString 
     url = NSURL(string: escapedString) 
    } 

    println("url: \(url)") 
    request = NSMutableURLRequest(URL: url!) 

    request.setValue("Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H141 Safari/600.1.4", forHTTPHeaderField: "UserAgent") 

    super.init(nibName: nil, bundle: nil) 
    } 

    required init(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
    } 


    deinit { 
    self.webView.removeObserver(self, forKeyPath: "loading") 
    self.webView.removeObserver(self, forKeyPath: "title") 
    self.webView.removeObserver(self, forKeyPath: "URL") 
    self.webView.removeObserver(self, forKeyPath: "estimatedProgress") 
    self.webView.stopLoading() 
    } 


    override func viewDidLoad() { 
    super.viewDidLoad() 
    createNavigationView() 


    self.navigationController?.navigationBar.tintColor = MGColor.actionColor 

    let config = WKWebViewConfiguration() 
    self.webView = WKWebView(frame: self.view.bounds, configuration: config) 
    self.view.addSubview(self.webView) 


    indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray) 
    //indicator.backgroundColor = UIColor(white: 0.1, alpha: 0.5) 
    webView.addSubview(indicator) 

    self.webView.snp_makeConstraints { (make) -> Void in 
     make.edges.equalTo(self.view) 
    } 

    indicator.snp_makeConstraints { (make) -> Void in 
     make.center.equalTo(self.webView) 
    } 

    webView.addObserver(self, forKeyPath: "loading", options: NSKeyValueObservingOptions.New, context: nil) 
    webView.addObserver(self, forKeyPath: "title", options: NSKeyValueObservingOptions.New, context: nil) 
    webView.addObserver(self, forKeyPath: "URL", options: NSKeyValueObservingOptions.New, context: nil) 
    webView.addObserver(self, forKeyPath: "estimatedProgress", options: NSKeyValueObservingOptions.New, context: nil) 
    } 


    override func viewDidDisappear(animated: Bool) { 
    super.viewDidDisappear(animated) 
    self.webView.stopLoading() 
    } 


    private func createNavigationView() { 
    let closeItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Stop, target: self, action: closeButtonSelector) 
    self.navigationItem.leftBarButtonItem = closeItem 

    // create center view 
    let titleViewWidth = self.view.frame.size.width - 100 

    twoLineTitleView = UIView(frame: CGRectMake(0, 0, titleViewWidth, 44)) 

    titleLabel = UILabel(frame: CGRectMake(0, 6, titleViewWidth, 16)) 
    titleLabel?.backgroundColor = UIColor.clearColor() 
    titleLabel?.font = UIFont.boldSystemFontOfSize(16) 
    titleLabel?.textAlignment = NSTextAlignment.Center 

    subTitleLabel = UILabel(frame: CGRectMake(0, 21, titleViewWidth, 20)) 
    subTitleLabel?.backgroundColor = UIColor.clearColor() 
    subTitleLabel?.font = UIFont.systemFontOfSize(10) 
    subTitleLabel?.textAlignment = NSTextAlignment.Center 

    twoLineTitleView.addSubview(titleLabel!) 
    twoLineTitleView.addSubview(subTitleLabel!) 
    self.navigationItem.titleView = twoLineTitleView 
    } 



    override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    self.webView.loadRequest(self.request) 

    } 


    func closeButtonTapped(sender: UIBarButtonItem) { 
    self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil) 
    } 


    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 

    if let wk = object as? WKWebView { 
     switch keyPath { 
     case "loading": 
     if let val: AnyObject = change[NSKeyValueChangeNewKey] { 
      if let val = val as? Bool { 
      if val { 
       self.indicator.startAnimating() 
      } 
      else { 
       self.indicator.stopAnimating() 
      } 
      } 
     } 
     case "title": 
     self.titleLabel?.text = self.webView.title 
     case "URL": 
     self.subTitleLabel?.text = self.webView.URL?.URLString 
     case "estimatedProgress": 
     println("progress: \(Int32(self.webView.estimatedProgress*100))") 

     default: break 
     } 
    } 
    } 


} 

注:我使用SDK的iOS 8.4

为什么移动Safari浏览器加载此网址,但WKWebView不?

+0

您正在使用哪个SDK? iOS8或iOS 9? – itsji10dra

+0

我使用SDK iOS 8.4 – confile

+0

这部分url加载正常:http://buchung.salonmeister.de,其余部分可能有一些字符不能被webview套件重新识别。尝试不同的选择。 –

回答

1

不知道,如果同样的错误原因,但问题是一样的,我iOS9

一些领域无法加载

下横空出世,这个问题是

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler { 

,并提供后台

completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); 

哪里我应该我是用错误的代码从https://github.com/ShingoFukuyama/WKWebViewTips

+0

我没有明白你的观点。你能否在描述中更详细些?我不使用方法''didReceiveAuthenticationChallenge''。 – confile

+0

我确实遇到类似的错误行为,似乎webview没有加载https,原来这是一个问题在didReceiveAuthenticationChallenge –

+0

您可以请发布更多的代码。你的''didReceiveAuthenticationChallenge''方法是怎样的? – confile

19

添加到您的plist

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 

下面是9.0 http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

此外,如果这一变化的解释返回

completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil); 

你想更安全地设置它,它会给你一个更复杂的方法来做到这一点。

+3

耶稣,停止发布这个。有用 ...直到App Store拒绝你的应用。 – Josh

0

我有一个网站也有一个类似的问题,它也受到高安全性TLS 1.2证书的保护。为了让WKWebView接受服务器的证书,我将这段代码添加到了我的Web视图控制器代理中:

-(void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler 
{ 
    if ([[[challenge protectionSpace]authenticationMethod] isEqualToString: @"NSURLAuthenticationMethodServerTrust"]) { 
     SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; 
     CFDataRef exceptions = SecTrustCopyExceptions(serverTrust); 
     SecTrustSetExceptions(serverTrust, exceptions); 
     CFRelease(exceptions); 
     newCredential = [NSURLCredential credentialForTrust:serverTrust]; 
     completionHandler(NSURLSessionAuthChallengeUseCredential, newCredential); 
    } else { 
     completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, newCredential); 
    } 
}