답변:
iOS9의 경우 Apple은 App Transport Security (ATS) 의 일환으로 iOS 앱의 모든 보안되지 않은 HTTP 트래픽을 비활성화하는 iOS 9로 급진적 인 결정을 내 렸습니다 .
ATS를 비활성화하려면 Info.plist 를 열고 다음 줄을 추가 하여이 단계를 수행 할 수 있습니다 .
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
임의로드 ( NSAllowsArbitraryLoads = true
)를 허용 하는 것이 좋은 해결 방법이지만 ATS를 완전히 비활성화하는 것이 아니라 허용하려는 HTTP 연결을 활성화해야합니다.
<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에서는 HTTPS를 사용하는 연결을 TLS 1.2로 설정하여 최근의 취약점을 방지합니다. iOS 8에서는 암호화되지 않은 HTTP 연결도 지원되었으므로 이전 버전의 TLS도 문제를 일으키지 않았습니다. 해결 방법으로 다음 코드 조각을 Info.plist에 추가 할 수 있습니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
특정 도메인을 대상으로하는 경우 응용 프로그램의 Info.plist에 다음을 추가 할 수 있습니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
iOS 9.0.2가 유효한 HTTPS 엔드 포인트에 대한 요청을 중단하는 것으로 보입니다. 내 현재 의심은 SHA-256 인증서가 필요 하거나이 오류로 실패한다는 것입니다.
재현하려면 safari로 UIWebView를 검사하고 임의의 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)
이제 Google로 이동하십시오 (물론 SHA-256 인증서가 있기 때문입니다).
location.href = "https://google.com"
// no problemo
전송 보안에 예외를 추가하면 (위의 @ stéphane-bruckert의 답변에 설명 된대로)이 문제를 해결할 수 있습니다. 또한 NSAppTransportSecurity
완전히 비활성화하면 앱 리뷰가 위태로울 수 있다는 것을 읽었지만 완전히 비활성화해도 작동 한다고 가정합니다 .
[편집] 내가 연결하고있는 도메인을 NSExceptionDomains
dict 에서 열거하는 것만 으로도이 문제가 해결 NSExceptionAllowsInsecureHTTPLoads
된다는 사실을 발견했습니다. : \
문제는 서버 측의 SSL 인증서입니다. 간섭이 있거나 인증서가 서비스와 일치하지 않습니다. 예를 들어 사이트에 www.mydomain.com에 대한 SSL 인증서가 있고 사용하는 서비스가 myservice.mydomain.com에서 실행되는 경우입니다. 그것은 다른 기계입니다.
HTTPS URL을 https://www.mywebsite.com 으로 지정하면 동일한 오류가 발생 합니다. 그러나 https://mywebsite.com 과 같이 세 개의 W없이 지정하면 제대로 작동합니다 .
Xcode 프로젝트-> info.plist로 이동하고 + 버튼을 클릭 한 다음 (앱 전송 보안 설정) 추가를 클릭하고 확장, 임의로드 허용을 YES로 설정합니다. 감사
내 문제는 NSURLConnection
iOS9에서 더 이상 사용되지 않아 모든 API를로 변경하여 NSURLSession
문제를 해결했습니다.
제 경우에는 컴퓨터의 날짜가 현재 날짜보다 늦기 때문에 시뮬레이터에서이 문제에 직면했습니다. 따라서 SSL 오류에 직면했을 때도이 경우를 확인하십시오.
재생시 오류가 발생했습니다.
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>
plist 파일의 예외 도메인에 항목을 추가하고 NSAllowsArbitraryLoads가 true로 설정되어 있고 여전히 오류가 표시되는지 확인했습니다.
그런 다음 http가 아닌 https로 URL을 재생하고 있음을 깨달았습니다.
비디오 URL을 http로 설정하고 문제가 해결되었습니다.