Próbowałem uruchomić moją istniejącą aplikację na iOS9, ale nie udało mi się uruchomić AFURLSessionManager
.
__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
if (error) {
} else {
}
}];
[task resume];
Otrzymuję następujący błąd:
Error Domain=NSURLErrorDomain Code=-999 "cancelled.
Otrzymuję również następujące dzienniki:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
CFNetwork SSLHandshake failed (-9824)
Aktualizacja: Dodałem wiele aktualizacji do mojego rozwiązania: ładowanie HTTP NSURLSession / NSURLConnection nie powiodło się w systemie iOS 9
ios
afnetworking
nsurlsession
ios9
tls1.2
Tariq
źródło
źródło
Odpowiedzi:
Znalezione rozwiązanie:
W iOS9 ATS wymusza najlepsze praktyki podczas połączeń sieciowych, w tym użycie HTTPS.
Z dokumentacji Apple:
ATS zapobiega przypadkowemu ujawnieniu, zapewnia bezpieczne zachowanie domyślne i jest łatwy do zastosowania. Powinieneś wdrożyć ATS tak szybko, jak to możliwe, niezależnie od tego, czy tworzysz nową aplikację, czy aktualizujesz istniejącą. Jeśli tworzysz nową aplikację, powinieneś używać wyłącznie protokołu HTTPS. Jeśli masz już istniejącą aplikację, powinieneś używać protokołu HTTPS tak często, jak to możliwe w tej chwili, i jak najszybciej utwórz plan migracji reszty aplikacji.
W wersji beta 1 obecnie nie ma możliwości zdefiniowania tego w info.plist. Rozwiązaniem jest dodanie go ręcznie:
Aktualizacja 1: jest to tymczasowe obejście, dopóki nie będziesz gotowy do przyjęcia obsługi ATS systemu iOS9.
Aktualizacja 2: Aby uzyskać więcej informacji, zapoznaj się z następującym linkiem: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
Aktualizacja3: Jeśli próbujesz połączyć się z hostem (YOURHOST.COM), który ma tylko protokół TLS 1.0
Dodaj je do Info.plist swojej aplikacji
źródło
NSTemporaryExceptionMinimumTLSVersion
musi to być np. TLSv1.0 zamiast 1.0 , patrz NSAppTransportSecurity Exception klucze słownika domenJak radzić sobie z SSL w iOS9 , Jednym z rozwiązań jest:
Jak mówi Apple :
iOS 9 i OSX 10.11 wymagają TLSv1.2 SSL dla wszystkich hostów, od których planujesz żądać danych, chyba że określisz domeny wyjątków w pliku Info.plist swojej aplikacji.
Składnia konfiguracji Info.plist wygląda następująco:
Jeśli Twoja aplikacja (na przykład przeglądarka internetowa innej firmy) musi łączyć się z dowolnymi hostami, możesz to skonfigurować w następujący sposób:
Jeśli musisz to zrobić, prawdopodobnie najlepiej zaktualizuj swoje serwery, aby korzystały z TLSv1.2 i SSL, jeśli jeszcze tego nie robią. Należy to uznać za tymczasowe obejście.
Na dzień dzisiejszy dokumentacja wstępna nie wspomina w żaden konkretny sposób o żadnej z tych opcji konfiguracyjnych. Gdy to nastąpi, zaktualizuję odpowiedź tak, aby zawierała link do odpowiedniej dokumentacji.
Aby uzyskać więcej informacji, przejdź do iOS9 AdaptationTips
źródło
Technote Apple na temat bezpieczeństwa transportu aplikacji jest bardzo przydatny ; pomogło nam to znaleźć bezpieczniejsze rozwiązanie naszego problemu.
Mam nadzieję, że pomoże to komuś innemu. Mieliśmy problemy z łączeniem się z adresami URL Amazon S3, które wydawały się całkowicie prawidłowe, adresami URL TLSv12 HTTPS. Okazało się, że musieliśmy wyłączyć,
NSExceptionRequiresForwardSecrecy
aby włączyć kolejną garść szyfrów używanych przez S3.W naszym
Info.plist
:źródło
Jeśli masz ten problem z Amazon S3 tak jak ja, spróbuj wkleić go na swojej liście info.pl jako bezpośrednie dziecko twojego tagu najwyższego poziomu
Więcej informacji można znaleźć pod adresem:
http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue
źródło
Znalazłem rozwiązanie stąd. I to działa dla mnie.
Sprawdź to, może ci to pomóc.
źródło
Po prostu dodaj następujące pola do pliku .plist
Składnia wygląda następująco:
źródło
Aktualizacja:
Począwszy od Xcode 7.1, nie trzeba ręcznie wprowadzać
NSAppTransportSecurity
słownika winfo.plist
.Będzie teraz automatycznie uzupełniany, uświadamia sobie, że jest to słownik, a następnie automatycznie uzupełni również
Allows Arbitrary
obciążenia. zrzut ekranu info.plistźródło
Rozwiąż błąd NSURLConnection Http ładowanie nie powiodło się Po prostu dodaj następujący Dict w info.plist:
źródło
Rozwiązałem to dodając jakiś klucz w info.plist. Kroki, które podjąłem to:
Otworzyłem plik info.plist mojego projektu
Dodano klucz o nazwie NSAppTransportSecurity jako słownik.
Dodano podklucz o nazwie NSAllowsArbitraryLoads jako Boolean i ustaw jego wartość na TAK, jak na poniższym obrazku. wprowadź opis obrazu tutaj
Wyczyść projekt i teraz wszystko działa dobrze, jak poprzednio.
Link referencyjny: https://stackoverflow.com/a/32609970
źródło
Oto, co zadziałało, gdy miałem ten błąd:
źródło
Możesz spróbować dodać tę funkcję w pliku RCTHTTPRequestHandler.m
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }
źródło
Oprócz wyżej wymienionych odpowiedzi sprawdź ponownie swój adres URL
źródło
Należy dodać
App Transport Security Settings
, abyinfo.plist
dodaćAllow Arbitrary Loads
doApp Transport Security Settings
źródło