2013-09-08 21 views
6

Ich verwende derzeit den folgenden Code, um Standardanmeldeinformationen für UIWebView festzulegen. Dies funktioniert in iOS 6.1 und früher. In iOS 7 Beta 6 funktioniert es jedoch überhaupt nicht.setDefaultCredential funktioniert nicht für UIWebView in iOS 7, funktioniert aber in früheren iOS-Versionen einwandfrei

Die Webseiten, die ich laden möchte, verwenden die Windows-Authentifizierung. Ich kann sie in Safari in iOS 7 öffnen. Wenn ich jedoch den untenstehenden Code ausführe und dann die URL in einem UIWebView öffne, bekomme ich ein leeres weißes Rechteck und nichts wird geladen! Wie gesagt, das funktioniert perfekt in iOS 6.1 und früher.

Ich versuchte auch einen zweiten Ansatz, der NSURLConnectionDelegate verwendet, um die Anmeldeinformationen zu übergeben. Dieser zweite Ansatz funktioniert auch in iOS 6.1 und früher, aber ist in iOS 7 gebrochen.

Weiß jemand, warum das passiert? Ähnliche Erfahrungen? Gedanken?

// Authenticate 
NSURLCredential *credential = [NSURLCredential credentialWithUser:@"myusername" 
                 password:@"mypassword" 
                 persistence:NSURLCredentialPersistenceForSession]; 

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] 
             initWithHost:@"mysite.com" 
             port:80 
             protocol:@"http" 
             realm:nil 
             authenticationMethod:NSURLAuthenticationMethodDefault]; 

[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; 
+2

Haben Sie versucht, die Frage in den Apple Entwicklerforen über iOS7 zu stellen? –

+0

Ja - Bis jetzt keine Antworten – jbro91837

+0

Wir haben ein ähnliches Problem mit MPMoviePlayer –

Antwort

4

Ich hatte das gleiche genaue Problem - eine NSURLConnection zu einer Sharepoint-Site, die für die Windows-Authentifizierung konfiguriert wurde, funktionierte in iOS 6.1 einwandfrei. In iOS 7 - unabhängig davon, ob ich die App für 6 oder 7 anvisierte und erstellte - schienen alle Authentifizierungen erfolgreich zu sein (den richtigen Cookie zu erhalten), antworten aber immer noch mit einem 401; Alle nachfolgenden Anfragen, die mit dem Cookie gesendet wurden, würden ebenfalls 401 erhalten.

Ich habe das Problem gelöst, indem ich das dedReceiveAuthenticationChallenge-Delegate-Protokoll zugunsten von willSendRequestForAuthenticationChallenge gedumpt habe. Die Implementierung des 2. Delegate-Protokolls bedeutet, dass der erste nie aufgerufen wird.

In Ihrem Delegierten dieses Delegierten Protokoll implementieren:

- (void)connection:(NSURLConnection *)sender willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge previousFailureCount] > 0]) { 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
    }else{ 
     NSURLCredential *credential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLPersistenceForSession]; 
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
    } 
} 

Nachdem ich dies aus einer Laune heraus umgesetzt, verschwand meine iOS 7 NTLM Authentifizierungsprobleme.

+0

Ich habe etwas ähnliches, aber komplizierter, weil es mehrere verschiedene Möglichkeiten gibt, die ich authentifizieren muss. Die Authentifizierung funktionierte in iOS 6 oder 7, allerdings war dieser einfachere Block nützlich, wenn die App eine bestimmte Anzahl von NSURLConnections erreichte. In meinem Fall konsumiere ich eine Tonne von Web-Services und einige arbeiteten und einige waren nicht so, ich bekam die 401 in didReceiveData. Seltsamer Fehler ... Es sieht so aus, als wenn Sie eine bestimmte Anzahl an Verbindungen geknackt haben, schließt sich die Sitzung und der Server verliert die Anmeldeinformationen. – whyoz

+0

dies wird eine große Menge an Verbindungspooling auf Ihrem Server verursachen, wenn Sie dies in eine Tonne von willSendRequestForAuthenticationChallenge während der Verwendung von NSURLPersistenceForSession setzen müssen und Sie möglicherweise nicht einloggen oder Daten abrufen können, bis der Pool ..use NSURLPersistenceNone wenn Sie haben um dies mehr als einmal zu tun – whyoz

4

Update: Dieses Problem erscheint in iOS fixiert werden 7.0.3

antwortete ich dies in dem Apple-Entwickler-Forum, aber jetzt, dass iOS7 aus der Beta ist, werde ich umbuchen Hier. Derzeit ist die Windows-Authentifizierung in iOS7 unterbrochen. Ich erwarte, dass es in Kürze eine Reparatur geben wird, aber bis dahin können Sie das Problem umgehen, indem Sie Authentifizierungsherausforderungen in Ihrem UIViewController behandeln, der Ihr UIWebView enthält.

Im Wesentlichen Sie

  1. abgeben NSURLRequest und NSURLConnection sich
  2. die Verbindung Griff: didReceiveAuthenticationChallenge:
  3. Im Anschluss: didReceivedResponse Ihre Daten manuell in die UIWebView laden

Below I Ich lade ein PDF, aber der Prozess funktioniert unabhängig von Ihrem Inhaltstyp.

+1

Es ist völlig inakzeptabel, dass Apple Bugs wie diese durch die Tests gleiten ließ (zum zweiten Mal ist das passiert). Es macht das iPad in Microsoft-Unternehmensumgebungen unbrauchbar. – Karlth

+0

Vielen Dank für diese Lösung!Aber ich denke, dass es nicht mit Redirect funktioniert? – NLemay

+1

@NLemay Redirects sollte kein Problem sein. Sie sollten nur bereit sein, mit ihnen umzugehen, wenn Sie sie erwarten. Siehe die 'connection: didReceiveResponse'- und' connection: willSendRequest: redirectResponse'-Methoden [hier] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLConnectionDataDelegate_protocol/Reference/Reference.html) – jpolete

Verwandte Themen