Respostas:
Para o iOS9, a Apple tomou uma decisão radical com o iOS 9, desabilitando todo o tráfego HTTP inseguro de aplicativos iOS, como parte do App Transport Security (ATS) .
Para simplesmente desativar o ATS, você pode seguir estas etapas abrindo Info.plist e adicionar as seguintes linhas:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Mesmo que permitir cargas arbitrárias ( NSAllowsArbitraryLoads = true
) seja uma boa solução alternativa, você não deve desativar totalmente o ATS, mas sim ativar a conexão HTTP que deseja permitir:
<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>
O iOS 9 força conexões que usam HTTPS a serem TLS 1.2 para evitar vulnerabilidades recentes. No iOS 8, até mesmo conexões HTTP não criptografadas eram suportadas, de modo que as versões anteriores do TLS também não causavam problemas. Como alternativa, você pode adicionar este snippet de código ao seu Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
* referenciado a App Transport Security (ATS)
Se você está apenas almejando domínios específicos, pode tentar adicionar isso ao Info.plist do seu aplicativo:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Parece que o iOS 9.0.2 interrompe as solicitações para endpoints HTTPS válidos. Minha suspeita atual é que ele está exigindo certificados SHA-256 ou falha com este erro.
Para reproduzir, inspecione seu UIWebView com safari e tente navegar para um ponto de extremidade HTTPS arbitrário:
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)
Agora tente ir ao google (porque é claro que eles têm um certificado SHA-256):
location.href = "https://google.com"
// no problemo
Adicionar uma exceção à segurança de transporte (conforme descrito pela resposta de @stéphane-bruckert acima) corrige isso. Eu também presumo que a desativação completa NSAppTransportSecurity
funcionaria também, embora eu tenha lido que desativá-la completamente pode prejudicar a análise do seu aplicativo.
[EDIT] Descobri que simplesmente enumerar os domínios aos quais estou me conectando no NSExceptionDomains
dicionário corrige o problema, mesmo quando NSExceptionAllowsInsecureHTTPLoads
definido como verdadeiro. : \
O problema é o certificado SSL no lado do servidor. Algo está interferindo ou o certificado não corresponde ao serviço. Por exemplo, quando um site tem um certificado SSL para www.mydomain.com enquanto o serviço que você usa é executado em myservice.mydomain.com. Essa é uma máquina diferente.
Recebo o mesmo erro ao especificar meu URL HTTPS como: https://www.mywebsite.com . No entanto, ele funciona bem quando eu o especifico sem os três W como: https://mywebsite.com .
Projeto Xcode -> goto info.plist e clique no botão + e depois em Adicionar (Configurações de segurança de transporte do aplicativo) Expanda, Permitir cargas arbitrárias, defina YES. obrigado
Meu problema era NSURLConnection
e foi descontinuado no iOS9, então mudei toda a API para NSURLSession
e isso corrigiu meu problema.
No meu caso, enfrentei esse problema no meu simulador porque a data do meu computador estava atrasada em relação à data atual. Portanto, verifique também este caso quando encontrar um erro de SSL.
Eu estava recebendo um erro abaixo da reprodução
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>
Verifiquei se adicionei a entrada em domínios de exceção no arquivo plist e NSAllowsArbitraryLoads está definido como verdadeiro e ainda estava vendo um erro.
Então percebi que estou jogando URL com https e não http.
Defini o url do vídeo como http e o problema foi resolvido.