2015-09-07 19 views
15

Ich habe eine WKWebView, die die folgende URL geladen werden sollen:WKWebView lädt keine https-URL?

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

Her ist der Code, den ich verwenden:

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 
     } 
    } 
    } 


} 

Hinweis: Ich benutze SDK iOS 8,4

Warum mobile Safari lädt diese URL aber WKWebView nicht?

+0

Welches SDK verwenden Sie? iOS8 oder iOS 9? – itsji10dra

+0

Ich benutze SDK iOS 8.4 – confile

+0

dieser Teil der URL lädt gut: http://buchung.salmeister.de, der verbleibende Teil kann einige Zeichen nicht durch das Webview-Kit erkannt haben. Versuchen Sie es mit einer anderen Auswahl. –

Antwort

1

nicht sicher, ob der gleiche Fehler Grund, aber das Problem das gleiche für mich war unter iOS9

einige Domains nicht

geladen werden konnte

stellte sich heraus, dass das Problem in

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

und zurück

completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); 

Bereitstellung wo Ich hätte

completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil); 
zurück

Ich war mit falschen Code aus https://github.com/ShingoFukuyama/WKWebViewTips

+0

Ich habe Ihren Standpunkt nicht verstanden. Könnten Sie bitte detaillierter in Ihrer Beschreibung sein? Ich verwende nicht die Methode '' didReceiveAuthenticationChallenge''. – confile

+0

Ich stieß auf ähnliche Fehler Verhalten, wo es schien, dass die Webansicht lädt nicht https, stellte sich heraus, es war ein Problem in didReceiveAuthenticationChallenge –

+0

Könnten Sie bitte mehr Code posten. Wie sieht Ihre Methode '' didReceiveAuthenticationChallenge'' aus? – confile

19

Fügen Sie diese auf Ihre plist

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

Hier ist die Erklärung für diese Änderung in 9,0 http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Auch wenn Sie möchten es sicherer einrichten, es gibt Ihnen eine komplexere Möglichkeit, dies zu tun.

+3

Jesus, hör auf dies zu veröffentlichen. Es klappt ...bis der App Store deine App ablehnt. – Josh

0

Ich hatte ein ähnliches Problem mit einer Website, die auch mit einem Hochsicherheitszertifikat TLS 1.2 geschützt war. Um das WKWebView dazu zu bringen, das Zertifikat des Servers zu akzeptieren, habe ich diesen Code zu meinem Web-View-Controller-Delegaten hinzugefügt:

-(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); 
    } 
}