NSURLSession / NSURLConnection HTTP load gagal di iOS 9

137

Mencoba menjalankan aplikasi saya yang ada di iOS9 tetapi mendapatkan kegagalan saat menggunakan AFURLSessionManager.

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

    } else {

    }
}];

[task resume];

Saya mendapatkan kesalahan berikut:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Juga mendapatkan log berikut:

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

Pembaruan: Saya telah menambahkan beberapa pembaruan ke solusi saya: NSURLSession / NSURLConnection HTTP load gagal di iOS 9

Tariq
sumber
Anda yakin kesalahan terjadi pada baris pertama?
BSMP
1
Saya memiliki masalah yang sama. Ini sepertinya mencakup masalah: stackoverflow.com/questions/30720813/…
phillies2628

Jawaban:

240

Solusi yang ditemukan:

Di iOS9, ATS memberlakukan praktik terbaik selama panggilan jaringan, termasuk penggunaan HTTPS.

Dari dokumentasi Apple:

ATS mencegah pengungkapan yang tidak disengaja, memberikan perilaku default yang aman, dan mudah diadopsi. Anda harus mengadopsi ATS sesegera mungkin, terlepas dari apakah Anda membuat aplikasi baru atau memperbarui yang sudah ada. Jika Anda mengembangkan aplikasi baru, Anda harus menggunakan HTTPS secara eksklusif. Jika Anda memiliki aplikasi yang sudah ada, Anda harus menggunakan HTTPS sebanyak yang Anda bisa saat ini, dan membuat rencana untuk memigrasikan sisa aplikasi Anda sesegera mungkin.

Dalam beta 1, saat ini tidak ada cara untuk mendefinisikan ini di info.plist. Solusi adalah menambahkannya secara manual:

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

masukkan deskripsi gambar di sini

Pembaruan1: Ini adalah solusi sementara sampai Anda siap untuk mengadopsi dukungan iOS9 ATS.

Pembaruan2: Untuk lebih jelasnya silakan lihat tautan berikut: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Pembaruan3: Jika Anda mencoba untuk terhubung ke host (YOURHOST.COM) yang hanya memiliki TLS 1.0

Tambahkan ini ke Info.plist aplikasi Anda

<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>
Tariq
sumber
10
Ketahuilah bahwa Anda baru saja menghapus Keamanan Transport Aplikasi, jadi satu fitur iOS 9 utama baru saja hilang dari aplikasi Anda. Ini adalah hack, dan saya tidak akan terkejut jika hack itu akan membuat aplikasi Anda ditolak. Menambahkan situs web tertentu ke kamus ini kemungkinan besar akan diizinkan.
gnasher729
2
@StevenPeterson Anda hanya akan bisa mendapatkan seluruh aplikasi dikecualikan berdasarkan kasus per kasus oleh Apple. Saya berasumsi jika Apple memberkati aplikasi Anda dengan kemampuan ini, mereka akan memerintahkan Anda untuk memasukkan kunci ini. Harapkan Apple jarang melakukan ini.
mattyohe
8
Tolong, tolong, tolong, tolong, tolong - jangan hanya menambahkan pengecualian ke daftar Anda dan lanjutkan "hanya karena itu berfungsi". Pertimbangkan keamanan data pengguna Anda dan terapkan SSL dan praktik terbaik keamanan lainnya.
Sinterklas
8
@ gnasher729, saya mengerti lebih baik untuk mendukung TLS 1.2, daripada hanya menonaktifkan ATS. Namun, apa yang dapat Anda lakukan jika Anda mengandalkan API pihak ketiga / layanan web. Saya tidak bisa memaksa mereka untuk melakukan upgrade, jadi apa yang bisa saya lakukan ??
Woodstock
7
Ada bug halus dalam jawaban ini: NSTemporaryExceptionMinimumTLSVersionharus mis. TLSv1.0 bukannya 1.0 , lihat NSAppTransportSecurity Exception domain kunci kamus
mbi
54

Cara menangani SSL di iOS9 , Salah satu solusinya adalah melakukan seperti:

Seperti yang dikatakan Apple : masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

iOS 9 dan OSX 10.11 memerlukan TLSv1.2 SSL untuk semua host yang Anda rencanakan untuk meminta data dari kecuali Anda menentukan domain pengecualian di file Info.plist aplikasi Anda.

Sintaks untuk konfigurasi Info.plist terlihat seperti ini:

<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>

Jika aplikasi Anda (browser web pihak ketiga, misalnya) perlu terhubung ke host sewenang-wenang, Anda dapat mengonfigurasinya seperti ini:

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

Jika Anda harus melakukan ini, mungkin yang terbaik adalah memperbarui server Anda untuk menggunakan TLSv1.2 dan SSL, jika mereka belum melakukannya. Ini harus dianggap sebagai solusi sementara.

Sampai hari ini, dokumentasi pra-rilis tidak menyebutkan opsi konfigurasi ini dengan cara tertentu. Setelah itu, saya akan memperbarui jawaban untuk menautkan ke dokumentasi yang relevan.

Untuk info lebih lanjut, pergi ke iOS9AdaptationTips

ElonChan
sumber
4
SSL dan TLS adalah lapisan enkripsi yang berbeda yang digunakan oleh protokol HTTPS. Dengan demikian, seseorang harus menonaktifkan SSL sama sekali dan menggunakan TLS v1.2 atau yang lebih baru. Untuk informasi lebih lanjut, saya akan merekomendasikan mulai dengan sumber daya berikut: SSL / TLS Security 2015 - A Quick Guide Sederhana
Conrad Taylor
2
Saya hanya menambahkan keberuntungan dengan contoh bawah di mana Anda mengatur NSAllowsArbitraryLoads menjadi true. Server saya menggunakan TLS v1.2 secara eksklusif dan saya masih harus melakukan ini untuk membuatnya berfungsi. Sangat membuat frustrasi.
Scooter
1
Jadi apakah ada solusi yang bisa saya gunakan untuk mengetahui pasti aplikasi baru saya akan disetujui di App Store, seperti layanan proxy?
Josh
41

Technote Apple di Keamanan Transportasi Aplikasi sangat berguna ; itu membantu kami menemukan solusi yang lebih aman untuk masalah kami.

Semoga ini bisa membantu orang lain. Kami mengalami masalah saat menyambung ke URL Amazon S3 yang tampaknya benar-benar valid, URL TLTv12 HTTPS. Ternyata kami harus menonaktifkan NSExceptionRequiresForwardSecrecyuntuk mengaktifkan beberapa cipher yang digunakan S3.

Di kami 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>
Ben Kreeger
sumber
Ini adalah masalah saya yang sebenarnya, dan langsung memperbaikinya! Terima kasih! :)
Alex Zak
Ini memecahkan masalah saya juga; kasus yang berbeda mungkin memerlukan pengaturan yang berbeda pula. Kabar baiknya adalah bahwa ia juga memberikan info tentang cara menggunakan nsurl untuk membantu Anda menemukan pengaturan yang benar secara umum.
ecotax
Saya perlu melakukan hal yang sama untuk cloudfront.net jika saya menggunakan CDN di depan Amazon S3.
Raymond26
7

Jika Anda mengalami masalah dengan Amazon S3 ini seperti saya, coba tempel ini di info Anda. Daftar sebagai anak langsung dari tag tingkat atas Anda

<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>

Anda dapat menemukan info lebih lanjut di:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue

David Cespedes
sumber
2
Tuhan memberkatimu
kawan
5

Saya menemukan solusi dari sini. Dan ini bekerja untuk saya.

Lihat ini, mungkin membantu Anda.

<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>
Ashvin Ajadiya
sumber
4

Cukup tambahkan bidang berikut dalam file .plist Anda

masukkan deskripsi gambar di sini

Sintaksnya terlihat seperti ini:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
geet Sebastian
sumber
Ini akan memungkinkan semua permintaan http. Bekerja, tetapi tidak disarankan.
KVISH
2

Memperbarui:

Pada Xcode 7.1, Anda tidak perlu memasukkan NSAppTransportSecurityKamus secara manual di info.plist.

Sekarang akan melengkapi secara otomatis untuk Anda, menyadari bahwa ini adalah kamus, dan kemudian melengkapi secara otomatis Allows ArbitraryLoads juga. tangkapan layar info.plist

Ben
sumber
Ini akan memungkinkan semua permintaan http. Bekerja, tetapi tidak disarankan.
KVISH
2

Memecahkan NSURLConnection Http bug yang gagal Hanya Tambahkan Dict berikut di info.plist:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
    </dict>
Sakir Sherasiya
sumber
1

Saya telah menyelesaikannya dengan menambahkan beberapa kunci di info.plist. Langkah-langkah yang saya ikuti adalah:

Saya Membuka file info.plist proyek saya

Menambahkan Kunci yang disebut NSAppTransportSecurity sebagai Kamus.

Menambahkan Subkey yang disebut NSAllowsArbitraryLoads sebagai Boolean dan mengatur nilainya menjadi YA seperti gambar berikut. masukkan deskripsi gambar di sini

Bersihkan Proyek dan Sekarang Semuanya Berjalan Baik seperti sebelumnya.

Tautan Ref: https://stackoverflow.com/a/32609970

tania_S
sumber
1

Inilah yang bekerja untuk saya ketika saya memiliki kesalahan ini:

<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>
KVISH
sumber
1

Anda dapat mencoba menambahkan fungsi ini dalam file RCTHTTPRequestHandler.m

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

eliprodigy
sumber
1

Selain jawaban yang disebutkan di atas, periksa kembali url Anda

Vaishnavi
sumber
Dalam kasus saya, saya mencoba memuat file .html.
Vaishnavi
0

Anda harus menambahkan App Transport Security Settingsuntuk info.plistdan menambahkan Allow Arbitrary LoadskeApp Transport Security Settings

masukkan deskripsi gambar di sini

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