2015-09-07 19 views
15

Ho un WKWebView che dovrebbe caricare il seguente url:WKWebView non carica l'URL https?

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

Il suo è il codice che uso:

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


} 

Nota: io uso SDK iOS 8.4

Perché Safari Mobile carica questo URL ma non lo fa WKWebView?

+0

Quale SDK si sta utilizzando? iOS8 o iOS 9? – itsji10dra

+0

Io uso l'SDK iOS 8.4 – confile

+0

questa parte dell'url carica bene: http://buchung.salonmeister.de, la parte rimanente potrebbe avere alcuni caratteri non riconosciuti dal kit webview. Prova con una selezione diversa. –

risposta

1

non è sicuro se la stessa ragione errore, ma il problema era lo stesso per me sotto iOS9

alcuni domini non possono essere caricati

è scoperto che il problema era in

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

e fornendo indietro

completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); 

dove Avrei dovuto tornato

completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil); 

stavo usando codice errato da https://github.com/ShingoFukuyama/WKWebViewTips

+0

Non ho capito il tuo punto. Potresti essere più dettagliato nella descrizione? Non uso il metodo '' didReceiveAuthenticationChallenge''. – confile

+0

ho riscontrato un comportamento di errore simile, in cui sembrava che la webview non stesse caricando https, si è scoperto che si trattava di un problema in didReceiveAuthenticationChallenge –

+0

Potresti pubblicare più codice. Come appare il tuo metodo '' didReceiveAuthenticationChallenge''? – confile

19

Aggiungi questo al vostro plist

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

Ecco la spiegazione per questo cambiamento di 9,0 http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

anche se vuoi impostarlo in modo più sicuro ti dà un modo più complesso per farlo.

+3

Gesù, smetti di postare questo. Funziona ...fino a quando l'App Store rifiuta la tua app. – Josh

0

Ho riscontrato un problema simile con un sito protetto anche con un certificato TLS 1.2 ad alta sicurezza. Per consentire a WKWebView di accettare il certificato del server, ho aggiunto questo codice al delegato del controller di visualizzazione 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); 
    } 
}