Odpowiedzi:
W przypadku iOS9 Apple podjął radykalną decyzję z iOS 9, wyłączając cały niezabezpieczony ruch HTTP z aplikacji iOS, jako część App Transport Security (ATS) .
Aby po prostu wyłączyć ATS, możesz wykonać następujące kroki, otwierając Info.plist i dodać następujące wiersze:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Mimo że zezwolenie na dowolne ładowanie ( NSAllowsArbitraryLoads = true
) jest dobrym obejściem, nie należy całkowicie wyłączać ATS, ale raczej włączyć połączenie HTTP, na które chcesz zezwolić:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
iOS 9 wymusza na połączeniach używających HTTPS TLS 1.2, aby uniknąć ostatnich luk w zabezpieczeniach. W iOS 8 obsługiwane były nawet nieszyfrowane połączenia HTTP, więc starsze wersje TLS również nie sprawiały problemów. Aby obejść ten problem, możesz dodać ten fragment kodu do swojej Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
* w odniesieniu do App Transport Security (ATS)
Jeśli kierujesz tylko reklamy na określone domeny, możesz spróbować dodać to w Info.plist swojej aplikacji:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Wygląda na to, że iOS 9.0.2 przerywa żądania do prawidłowych punktów końcowych HTTPS. Moje obecne podejrzenie jest takie, że wymaga certyfikatów SHA-256 lub nie powiedzie się z tym błędem.
Aby odtworzyć, sprawdź swój UIWebView za pomocą safari i spróbuj przejść do dowolnego punktu końcowego HTTPS:
location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)
Teraz spróbuj przejść do Google (ponieważ mają oczywiście certyfikat SHA-256):
location.href = "https://google.com"
// no problemo
Dodanie wyjątku do bezpieczeństwa transportu (zgodnie z powyższą odpowiedzią @ stéphane-bruckert) działa, aby to naprawić. Zakładam też, że całkowicie wyłączamNSAppTransportSecurity
by działało, chociaż przeczytałem, że całkowite wyłączenie może zagrozić twojej recenzji aplikacji.
[EDYTUJ] Zauważyłem, że zwykłe wyliczenie domen, z którymi się NSExceptionDomains
łączę w dyktandzie, rozwiązuje ten problem, nawet jeśli pozostawiam NSExceptionAllowsInsecureHTTPLoads
wartość true. : \
Problemem jest certyfikat ssl po stronie serwera. Albo coś przeszkadza, albo certyfikat nie pasuje do usługi. Na przykład, gdy witryna ma certyfikat ssl dla www.moja_domena.com, podczas gdy używana usługa działa pod adresem myservice.mydomain.com. To inna maszyna.
Otrzymuję ten sam błąd, kiedy określam mój adres URL HTTPS jako: https://www.mywebsite.com . Jednak działa dobrze, gdy określę to bez trzech W jako: https://mywebsite.com .
Projekt Xcode -> goto info.plist i kliknij przycisk +, a następnie Dodaj (ustawienia zabezpieczeń transportu aplikacji) Rozwiń, Zezwalaj na dowolne obciążenia ustawione na TAK. Dzięki
Mój problem był NSURLConnection
i został wycofany w iOS9, więc zmieniłem cały interfejs API naNSURLSession
i to rozwiązało mój problem.
W moim przypadku napotkałem ten problem w moim symulatorze, ponieważ data mojego komputera była spóźniona. Więc sprawdź ten przypadek, gdy napotkasz błąd SSL.
Podczas odtwarzania pojawiał się błąd poniżej
finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>
Upewniłem się, że dodałem wpis w domenach wyjątków w pliku plist, a NSAllowsArbitraryLoads jest ustawione na true i nadal widzę błąd.
Wtedy zdałem sobie sprawę, że gram w URL z https a nie http.
Ustawiłem adres URL filmu na http i problem został rozwiązany.