Câu trả lời:
Đối với iOS9, Apple đã đưa ra một quyết định triệt để với iOS 9, vô hiệu hóa tất cả lưu lượng HTTP không an toàn từ các ứng dụng iOS, như một phần của App Transport Security (ATS) .
Để đơn giản tắt ATS, bạn có thể làm theo các bước sau bằng cách mở Info.plist và thêm các dòng sau:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Mặc dù cho phép tải tùy ý ( NSAllowsArbitraryLoads = true
) là một giải pháp tốt, bạn không nên tắt hoàn toàn ATS mà hãy bật kết nối HTTP mà bạn muốn cho phép:
<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 buộc các kết nối đang sử dụng HTTPS phải là TLS 1.2 để tránh các lỗ hổng gần đây. Trong iOS 8, ngay cả các kết nối HTTP không được mã hóa cũng được hỗ trợ, do đó các phiên bản cũ hơn của TLS cũng không gây ra bất kỳ vấn đề nào. Để giải quyết vấn đề, bạn có thể thêm đoạn mã này vào Info.plist của mình:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
* tham chiếu đến App Transport Security (ATS)
Nếu bạn chỉ đang nhắm mục tiêu các miền cụ thể, bạn có thể thử và thêm điều này vào Info.plist của ứng dụng của bạn:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Có vẻ như iOS 9.0.2 phá vỡ các yêu cầu đến các điểm cuối HTTPS hợp lệ. Mối nghi ngờ hiện tại của tôi là nó đang yêu cầu chứng chỉ SHA-256 hoặc nó không thành công với lỗi này.
Để tái tạo, hãy kiểm tra UIWebView của bạn bằng safari và thử điều hướng đến một điểm cuối HTTPS tùy ý:
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)
Bây giờ hãy thử vào google (vì tất nhiên họ có chứng chỉ SHA-256):
location.href = "https://google.com"
// no problemo
Thêm một ngoại lệ cho bảo mật truyền tải (như được nêu trong câu trả lời của @ stéphane-bruckert ở trên) có tác dụng khắc phục điều này. Tôi cũng giả định rằng việc tắt hoàn toàn NSAppTransportSecurity
cũng sẽ hoạt động, mặc dù tôi đã đọc rằng việc tắt hoàn toàn nó có thể gây nguy hiểm cho việc xem xét ứng dụng của bạn.
[EDIT] Tôi thấy rằng chỉ cần liệt kê các miền mà tôi đang kết nối trong NSExceptionDomains
dict sẽ khắc phục được sự cố này, ngay cả khi NSExceptionAllowsInsecureHTTPLoads
đặt thành true. : \
Vấn đề là chứng chỉ ssl ở phía máy chủ. Có điều gì đó đang gây nhiễu hoặc chứng chỉ không khớp với dịch vụ. Ví dụ: khi một trang web có chứng chỉ ssl cho www.mydomain.com trong khi dịch vụ bạn sử dụng chạy trên myservice.mydomain.com. Đó là một chiếc máy khác.
Tôi gặp lỗi tương tự khi chỉ định URL HTTPS của mình là: https://www.mywebsite.com . Tuy nhiên, nó hoạt động tốt khi tôi chỉ định nó mà không có ba chữ W là: https://mywebsite.com .
Dự án Xcode -> goto info.plist và Nhấp vào + Nút rồi Thêm (Cài đặt bảo mật truyền tải ứng dụng) Mở rộng, Cho phép tải tùy ý Đặt YES. Cảm ơn
Vấn đề của tôi là NSURLConnection
và điều đó không được dùng nữa trong iOS9, vì vậy tôi đã thay đổi tất cả API thành NSURLSession
và điều đó đã khắc phục sự cố của tôi.
Trong trường hợp của tôi, tôi gặp phải sự cố này trong trình mô phỏng của mình vì ngày máy tính của tôi bị trễ hơn so với ngày hiện tại. Vì vậy, hãy kiểm tra trường hợp này khi bạn gặp lỗi SSL.
Tôi gặp lỗi dưới đây khi phát lại
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>
Tôi đã đảm bảo rằng tôi đã thêm mục nhập trong các miền ngoại lệ trong tệp plist và NSAllowsArbitraryLoads được đặt thành true và tôi vẫn thấy lỗi.
Sau đó, tôi nhận ra rằng tôi đang chơi URL bằng https chứ không phải http.
Tôi đặt url video thành http và vấn đề đã được giải quyết.