2014-11-24 61 views
15

iOS 8 için bir WKWebView uygulamasında kendinden imzalı bir sertifikaya sahip bir HTTPS url yüklemeye çalışıyorum ve bu hata devam ediyor. UIWebView ile kullanılan geçici çözüm (NSUrlRequest'ten setAllowsAnyHTTPSCertificate kullanılarak) işe yaramıyor. Herhangi bir geçici çözüm bilen var mı?WKWebView'da doğrulanmamış ssl sertifikalarına izin ver

Üretim aşamasında değil, yalnızca geliştirme aşamalarında kendinden imzalı sertifika sitelerine erişmem gerektiğinden, AppStore için geçerli bir çözüme ihtiyacım yok, ancak geliştirme ve deneme sunucu örnekleri için gerçekten bir sorun.

Önceden teşekkür ederiz.

cevap

-1

URL nesnesi:

NSURL *url = [NSURL URLWithString:urlAddress]; 
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:requestObj delegate:self]; 
[connection start]; 

Ve sonra, yetki verdiğiniz için bu ekleyin:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
    } 
    else 
    { 
     [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [resultData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSString *htmlString = [[NSString alloc] initWithBytes:[resultData bytes] length:[resultData length] encoding:NSUTF8StringEncoding]; 
    [webView loadHTMLString:htmlString baseURL:url]; 
} 
+1

Teşekkür, ama bu sadece ilk URL yükü için yararlı olacağını, ama her şeyi HTTPS ile olup olmadığını web uygulaması geri kalanı gezinmek mümkün olmayacaktır. Kullanıcı herhangi bir bağlantıya tıkladığında, yeni URL’yi yüklemeyi deneyen web sayfası olacak ve sonra başarısız olacak, doğru mu? – Roi

0

açın URL Safari'de cihazda bir kez, orada kabul etmek seçeneği ile istenir sertifika. Kabul edildikten sonra, sertifikanın artık cihaza bildirildiğinden, uygulamanızda da çalışmalıdır. Bu, cihaz başına bir çözümdür, uygulamanızı hiçbir zaman yayın süresinde etkilemez.

+3

Bu benim için işe yaramıyor ... – Roi

+0

Bu tuhaflık - genel> profil bölümünde cihaz ayarlarınızdaki sertifikayı görüyor musunuz? – dogsgod

4

Bu aşamada bir çözüm bulunmayabilir (iOS 8.1.1). Bu işlemin yapılması WKNavigationDelegate yönteminin webView:didReceiveAuthenticationChallenge:completionHandler: olmasını beklemiş olabilir, ancak bu Apple developer forum discussion bir Apple çalışanı, kendinden imzalı sertifikalarla karşılaşıldığında bu temsilci yönteminin şu anda çağrılmadığını doğrular.

23

Bu, iOS 9'da giderilmiştir! WKWebView nihayet WKNavigationDelegate üzerindeki webView (_: didReceiveAuthenticationChallenge: completionHandler :) öğesine çağrı yapar. Ne yazık ki, bu kod, iOS 8 cihazlarda Xcode 7'de oluşturulmuş kodu çalıştırıyorsanız çalışmaz (en azından ilk testimde değil).

Aşağıdaki örneğimde, aslında sertifikayla hiçbir şey yapmıyorum ve yalnızca başka bir doğrulama yapmadan geçmesine izin vermiyorum (açıkça üretim kodu için kötü bir plan). Burada yapmak istediklerini daha fazla bilgi için bkz. Apple's docs (Liste 3).

Swift:

func webView(webView: WKWebView, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge, 
    completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 
     let cred = NSURLCredential.init(forTrust: challenge.protectionSpace.serverTrust!) 
     completionHandler(.UseCredential, cred) 
} 

Swift 3:

let cred = URLCredential(trust: challenge.protectionSpace.serverTrust!) 
completionHandler(.useCredential, cred) 

Swift 4:

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
    let cred = URLCredential(trust: challenge.protectionSpace.serverTrust!) 
    completionHandler(.useCredential, cred) 
} 

amaç-Cı

NSURLCredential * credential = [[NSURLCredential alloc] initWithTrust:[challenge protectionSpace].serverTrust]; 
completionHandler(NSURLSessionAuthChallengeUseCredential, credential); 
+0

Bu kodu nasıl kullanacağımı lütfen bana bildirir misiniz? Ben hızlı bir şekilde tam bir acemi değilim, 'viewDidLoad' işlevini geçersiz kıldım ve url'yi şu web sitesini kullanarak yüklüyorum:' webView.loadRequest (NSURLRequest (URL: url)) 'ama aslında işlevinizi nasıl kullanırım? Eğer cevabınız – MonsieurNinja

+0

ise yine özür dilerim. WKWebView 'WKNavigationDelegate'i uygulayan bir sınıf vermelisiniz. WKNavigationDelegate'inizde yukarıdaki yöntemi geçersiz kılabilirsiniz. Bu yöntemde, isteğin gerçekleşmesine izin vermek için yukarıdaki gibi bir şey isteyeceksiniz (yapmak istediğinizi varsayarak). – jvoll

2

Aynı hatayı alıyorum ve yukarıdaki En Çok Oylanan yanıtı kullanarak çözmeye çalışıyorum, NSURLCredential nesnesini oluşturmak için aşağıdaki kodu kullandım, ancak başarısız oldu.

Sonra Apple Developer Forums içinde bir çözüm buldum. Bu bana yardımcı oldu: kodu için

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { 
    NSLog(@"Allow all"); 
    SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; 
    CFDataRef exceptions = SecTrustCopyExceptions (serverTrust); 
    SecTrustSetExceptions (serverTrust, exceptions); 
    CFRelease (exceptions); 
    completionHandler (NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:serverTrust]); 
    }