Tải xuống HTTP NSURLSession / NSURLC Connectection trên iOS 9


137

Đã thử chạy ứng dụng hiện có của tôi trên iOS9 nhưng bị lỗi trong khi sử dụng AFURLSessionManager.

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

Tôi nhận được lỗi sau đây:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Cũng nhận được các bản ghi sau:

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

Cập nhật: Tôi đã thêm nhiều bản cập nhật vào giải pháp của mình: Tải HTTP HTTP NSURLSession / NSURLC không thành công trên iOS 9


Bạn có chắc chắn lỗi đang xảy ra trên dòng đầu tiên?
BSMP

1
Tôi gặp vấn đề tương tự. Điều này dường như bao gồm vấn đề: stackoverflow.com/questions/30720813/ từ
phillies2628

Câu trả lời:


240

Tìm giải pháp:

Trong iOS9, ATS thực thi các thực tiễn tốt nhất trong các cuộc gọi mạng, bao gồm cả việc sử dụng HTTPS.

Từ tài liệu của Apple:

ATS ngăn chặn tiết lộ ngẫu nhiên, cung cấp hành vi mặc định an toàn và dễ dàng chấp nhận. Bạn nên áp dụng ATS càng sớm càng tốt, bất kể bạn đang tạo ứng dụng mới hay cập nhật ứng dụng hiện có. Nếu bạn đang phát triển một ứng dụng mới, bạn nên sử dụng riêng HTTPS. Nếu bạn có một ứng dụng hiện có, bạn nên sử dụng HTTPS càng nhiều càng tốt ngay bây giờ và tạo một kế hoạch để di chuyển phần còn lại của ứng dụng càng sớm càng tốt.

Trong phiên bản beta 1, hiện tại không có cách nào để xác định điều này trong info.plist. Giải pháp là thêm nó bằng tay:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

nhập mô tả hình ảnh ở đây

Update1: Đây là một cách giải quyết tạm thời cho đến khi bạn sẵn sàng áp dụng hỗ trợ ATS cho iOS9.

Update2: Để biết thêm chi tiết, vui lòng tham khảo liên kết sau: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Cập nhật3: Nếu bạn đang cố gắng kết nối với máy chủ lưu trữ (YOUHOST.COM) chỉ có TLS 1.0

Thêm chúng vào Info.plist của ứng dụng của bạn

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

10
Xin lưu ý rằng bạn đã loại bỏ hoàn toàn Application Transport Security, do đó, một tính năng chính của iOS 9 đã biến mất khỏi ứng dụng của bạn. Đây là một bản hack và tôi sẽ không ngạc nhiên nếu bản hack đó sẽ khiến ap của bạn bị từ chối. Thêm các trang web cụ thể vào từ điển này nhiều khả năng sẽ được cho phép.
gnasher729

2
@StevenPeterson Bạn sẽ chỉ có thể loại bỏ toàn bộ ứng dụng trong từng trường hợp cụ thể của Apple. Tôi giả sử nếu Apple ban phước cho ứng dụng của bạn với khả năng này, họ sẽ hướng dẫn bạn đưa khóa này vào. Hy vọng Apple sẽ làm điều này hiếm khi.
mattyohe

8
Xin vui lòng, làm ơn, làm ơn, làm ơn, làm ơn - đừng chỉ thêm ngoại lệ vào danh sách của bạn và tiếp tục "chỉ vì nó hoạt động". Xem xét tính bảo mật của dữ liệu người dùng của bạn và triển khai SSL và các thực tiễn bảo mật tốt nhất khác.
Ông già Noel

8
@ gnasher729, tôi hiểu rõ hơn về việc hỗ trợ TLS 1.2, thay vì chỉ vô hiệu hóa ATS. Tuy nhiên, bạn có thể làm gì nếu bạn dựa vào dịch vụ web / API của bên thứ 3. Tôi không thể buộc họ nâng cấp, vậy tôi phải làm gì ??
Woodstock

7
Có một lỗi nhỏ trong câu trả lời này: NSTemporaryExceptionMinimumTLSVersionphải là TLSv1.0 thay vì 1.0 , xem các khóa từ điển miền ngoại lệ
NSAppTransportSecurity

54

Cách xử lý SSL trong iOS9 Một giải pháp là làm như sau:

Như Apple nói: nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

iOS 9 và OSX 10.11 yêu cầu SSL TLSv1.2 cho tất cả các máy chủ bạn dự định yêu cầu dữ liệu từ khi bạn chỉ định các miền ngoại lệ trong tệp Info.plist của ứng dụng.

Cú pháp cho cấu hình Info.plist trông như thế này:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Nếu ứng dụng của bạn (chẳng hạn như trình duyệt web của bên thứ ba) cần kết nối với máy chủ tùy ý, bạn có thể định cấu hình như thế này:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Nếu bạn phải làm điều này, có lẽ tốt nhất là cập nhật máy chủ của bạn để sử dụng TLSv1.2 và SSL, nếu họ chưa làm như vậy. Điều này nên được coi là một cách giải quyết tạm thời.

Cho đến ngày hôm nay, tài liệu phát hành trước không đề cập đến bất kỳ tùy chọn cấu hình nào theo bất kỳ cách cụ thể nào. Khi có, tôi sẽ cập nhật câu trả lời để liên kết đến tài liệu liên quan.

Để biết thêm thông tin, hãy truy cập iOS9AdaptationTips


4
SSL và TLS là các lớp mã hóa khác nhau được sử dụng bởi các giao thức HTTPS. Do đó, người ta nên vô hiệu hóa SSL hoàn toàn và sử dụng TLS v1.2 trở lên. Để biết thêm thông tin, tôi khuyên bạn nên bắt đầu với tài nguyên sau: SSL / TLS Security 2015 - Hướng dẫn nhanh được đơn giản hóa
Conrad Taylor

2
Tôi chỉ thêm bất kỳ may mắn nào với ví dụ dưới cùng trong đó bạn đặt NS ALLowsArbitraryLoads thành true. Máy chủ của tôi đang sử dụng độc quyền TLS v1.2 và tôi vẫn phải làm điều này để làm cho nó hoạt động. Rất bực bội.
Xe tay ga

1
Vì vậy, có cách giải quyết nào tôi có thể sử dụng để biết chắc chắn ứng dụng mới của tôi sẽ được phê duyệt trong App Store, chẳng hạn như dịch vụ proxy không?
Josh

41

Technote của Apple trên App Transport Security rất tiện dụng ; nó đã giúp chúng tôi tìm ra giải pháp an toàn hơn cho vấn đề của mình.

Hy vọng điều này sẽ giúp người khác. Chúng tôi đã gặp sự cố khi kết nối với các URL của Amazon S3 có vẻ như hoàn toàn hợp lệ, các URL HTTPS TLSv12. Hóa ra chúng tôi phải vô hiệu hóa NSExceptionRequiresForwardSecrecyđể kích hoạt một số mật mã khác mà S3 sử dụng.

Trong chúng tôi Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

Đây là vấn đề chính xác của tôi, và nó đã khắc phục nó ngay lập tức! Cảm tạ! :)
Alex Zak

Điều này giải quyết vấn đề tôi đã có quá; trường hợp khác nhau có thể yêu cầu cài đặt khác nhau mặc dù. Tin tốt là anh Technote cũng chứa thông tin về cách sử dụng nsurl để giúp bạn tìm các cài đặt chính xác nói chung.
ecotax

Tôi cần phải làm tương tự cho cloudfront.net nếu tôi đã sử dụng CDN trước Amazon S3.
Raymond26

7

Nếu bạn gặp vấn đề này với Amazon S3 như tôi, hãy thử dán nó lên thông tin của bạn. Hãy là người trực tiếp của thẻ cấp cao nhất của bạn

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

Bạn có thể tìm thêm thông tin tại:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolve-the- phát hành


2
Chúa phù hộ bạn
Vervatovskis

5

Tôi tìm thấy giải pháp từ đây. Và nó làm việc cho tôi.

Kiểm tra này, nó có thể giúp bạn.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.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>

4

Chỉ cần thêm các trường sau vào tệp .plist của bạn

nhập mô tả hình ảnh ở đây

Cú pháp trông như thế này:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Điều này sẽ cho phép tất cả các yêu cầu http. Hoạt động, nhưng không khuyến khích.
KVISH 11/03/2016

2

Cập nhật:

Kể từ Xcode 7.1, bạn không cần phải nhập NSAppTransportSecuritytừ điển theo cách thủ công vàoinfo.plist .

Bây giờ nó sẽ tự động hoàn tất cho bạn, nhận ra đó là một cuốn từ điển và sau đó cũng tự động hoàn thành các Allows ArbitraryTải. ảnh chụp màn hình thông tin


Điều này sẽ cho phép tất cả các yêu cầu http. Hoạt động, nhưng không khuyến khích.
KVISH 11/03/2016

2

Giải quyết lỗi tải NSURLConnection http không thành công Chỉ cần thêm Dict sau vào info.plist:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
    </dict>

1

Tôi đã giải quyết nó bằng cách thêm một số khóa trong info.plist. Các bước tôi làm theo là:

Tôi đã mở tập tin info.plist của dự án của tôi

Đã thêm Khóa có tên NSAppTransportSecurity dưới dạng Từ điển.

Đã thêm một Subkey có tên NSAllowsArbitraryLoads dưới dạng Boolean và đặt giá trị của nó thành CÓ như hình ảnh sau đây. nhập mô tả hình ảnh ở đây

Làm sạch dự án và bây giờ mọi thứ đang chạy tốt như trước đây.

Liên kết giới thiệu: https://stackoverflow.com/a/32609970


1

Đây là những gì làm việc cho tôi khi tôi gặp lỗi này:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

1

Bạn có thể thử thêm chức năng này trong tệp RCTHTTPRequestHandler.m

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }


1

Ngoài các câu trả lời được đề cập ở trên, kiểm tra lại url của bạn


Trong trường hợp của tôi, tôi đã cố tải tập tin .html.
Vaishnavi

0

Bạn nên thêm App Transport Security Settingsvào info.plistvà thêm Allow Arbitrary LoadsvàoApp Transport Security Settings

nhập mô tả hình ảnh ở đây

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.