2015-06-18 17 views
5

Otrzymuję błąd: NSURLSession/NSURLConnection Załadowanie HTTP nie powiodło się (kCFStreamErrorDomainSSL, -9802) i podejrzewam, że dzieje się tak z powodu odpytywania obrazów z analizy. Oto metoda, gdzie jestem zapytań:NSURLSession/NSURLConnection Nie udało się załadować HTTP (kCFStreamErrorDomainSSL, -9802)

func fetchImageForEmployee(employee: PFEmployee, completion: (error: String?, image: UIImage?) -> Void) { 
    if (employee.profilePicture == nil) { 
     completion(error: "No image file", image: nil) 
    } else { 
     employee.profilePicture!.getDataInBackgroundWithBlock({ (data, error) -> Void in 
      if let error = error { 
       let errorString = error.userInfo["error"] as? String 
       completion(error: errorString, image: nil) 
      } else if (data != nil) { 
       let image = UIImage(data: data!) 
       completion(error: nil, image: image) 
      } else { 
       completion(error: nil, image: nil) 
      } 
     }) 
    } 
} 

ja również drukowane błąd, i to, co pojawiło się w debuggera: Próba załadowania widoku kontrolera widoku, gdy jest on dealokując jest zabronione i może skutkować w niezdefiniowanym zachowaniu (UISearchController: 0x13ee44dc0)

Nie wiem, co się dzieje, więc wszystkie odpowiedzi są mile widziane.

+0

możliwe duplikat [NSURLSession/NSURLConnection HTTP obciążenia zawiodły na iOS 9] (http://przepełnienie stosu.com/questions/30739473/nsurlsession-nsurlconnection-http-load-failed-on-ios-9) – EnriMR

Odpowiedz

10

prawym przyciskiem myszy na pliku Info.plist> Otwórz jako> kod źródłowy i dodać następujące przed ostatnim </dict>:

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

W iOS9 ATS wymusza najlepszych praktyk podczas połączeń sieciowych, w tym wykorzystanie HTTPS. Przeczytaj więcej na ten temat w Apple Documentation.

+0

zadziałało, dziękuję. – kernix

+0

Mam ten sam cholerny problem ... Dodałem ten fragment xml, ale wciąż otrzymuję komunikat "NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)" ... dlaczego? :( –

+0

Nie rób tego, chyba że masz bardzo konkretny powód (np. Tworzysz przeglądarkę internetową lub czytnik rss, który naprawdę potrzebuje dostępu do dowolnych źródeł) .W przeciwnym razie będzie to zagrażać bezpieczeństwu –

5

Nie polecam niczego.

Musisz zdefiniować adres URL, na który chcesz zastosować te zasady, na liście Info.Plist celu kompilacji.

można znaleźć odpowiednie oświadczenie na stronie dokumentacji Apple: https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/

Więc w zasadzie swoją Info.plist powinien wyglądać i obejmować domenę.

Uwaga: dla lepszej przejrzystości, ja też redeclared wartość domyślną dla NSAllowsArbitraryLoads się fałszywe

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <false/> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>yourdomain.com</key> 
     <dict> 
      <key>NSIncludesSubdomains</key> 
      <true/> 
      <key>NSAllowsArbitraryLoads</key> 
      <true/> 
      <key>NSTemporaryExceptionMinimumTLSVersion</key> 
      <string>TLSv1.1</string> 
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
     </dict> 
    </dict> 
</dict> 

poważaniem.

W przypadku, po prostu nie dbają o wszystkie te bałagany ssl (nie polecam tego) i chcę tylko przejść do debugowania swojego interfejsu użytkownika, można alternatywnie przejść tymczasowo i użyć domyślnego dla App TransportSecurity i pozwalają byle czego:

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

nie jestem pewien, czy Apple będzie niech to podanie w AppStore Przegląd ;-)

Btw: wyśledzić wszystkie połączenia z aplikacji zaglądając Pod ustanowione połączenia. Możesz teraz wyłowić ruch aplikacji, który jest generowany przez narzędzia innych firm, lub korzystasz z rejestrowania całego ruchu sieciowego, o którym tutaj mowa: How can I figure out which URL is being blocked by App Transport Security?

Łatwo jest wyśledzić wszystkie występujące błędy w tym dzienniku (nie za bardzo Trudno znaleźć kod błędu). W ten sposób mogłem łatwo zobaczyć, jakie połączenia zostały ustanowione i być może nie udało się, z powodu ograniczeń obciążenia (oczywiście, dobrzy inżynierowie oprogramowania wiedzą na pamięć;)) Aby uzyskać dostęp do dziennika, możesz użyć na przykład iFunBox lub czegoś, jeśli jego na urządzeniu mobilnym.

Krótka podpowiedź: aby sprawdzić, która wersja TLS serwer jest uruchomiony, jestem wykorzystanie nmap:

nmap --script ssl-enum-ciphers -p 443 your-domain-without-https.com