Sumber daya tidak dapat dimuat karena kebijakan Keamanan Transportasi Aplikasi memerlukan penggunaan koneksi yang aman

492

Saya menghadapi masalah ketika saya memperbarui Xcode saya ke 7.0 atau iOS 9.0. Entah bagaimana itu mulai memberi saya kesalahan Judul

"Sumber daya tidak dapat dimuat karena kebijakan Keamanan Transportasi Aplikasi mengharuskan penggunaan koneksi yang aman"

Metode layanan web:

-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString
{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setAllowsCellularAccess:YES];
    [sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]];
    NSLog(@"URl %@%@",url,DataString);
    // Configure the Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"];
    request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPMethod = @"Post";

    // post the request and handle response
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                          {
                                              // Handle the Response
                                              if(error)
                                              {
                                                  NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);

                                                  // Update the View
                                                  dispatch_async(dispatch_get_main_queue(), ^{

                                                      // Hide the Loader
                                                      [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] delegate].window animated:YES];


                                                  });
                                                  return;
                                              }
                                              NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL];
                                              for (NSHTTPCookie * cookie in cookies)
                                              {
                                                  NSLog(@"%@=%@", cookie.name, cookie.value);
                                                  strSessName=cookie.name;
                                                  strSessVal=cookie.value;

                                              }

                                              NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}];
[postDataTask resume];

}

Layanan ini berjalan dengan baik untuk Xcode versi sebelumnya dan iOS versi sebelumnya Tapi ketika saya telah memperbarui ke Xcode 7.0 yang ada di iOS 9.0, itu mulai memberi saya Masalah seperti mengikuti ketika saya memanggil metode layanan web di atas. Kesalahan yang Saya Logged adalah:

Koneksi gagal: Domain Kesalahan = NSURLErrorDomain Code = -1022 "Sumber daya tidak dapat dimuat karena kebijakan Keamanan Transportasi Aplikasi memerlukan penggunaan koneksi yang aman." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Domain Kesalahan = kCFErrorDomainCFNetwork Code = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL dapat menggunakan kebijakan ini karena keamanan tidak dapat menggunakan kebijakan, sehingga tidak dapat menggunakan kebijakan sebagai tempat berlindung. koneksi.}

Saya telah mencoba Mengikuti Pertanyaan dan jawaban tetapi tidak mendapatkan hasil apa pun di sana, apakah ada gagasan sebelumnya bagaimana saya dapat menghapus kesalahan panggilan layanan itu?

  1. Sumber daya yang tidak dapat dimuat adalah ios9
  2. Keamanan Transport Aplikasi Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970
Manab Kumar Mal
sumber
kemungkinan duplikat dari App Transport Security Xcode 7 beta 6
AiOsN

Jawaban:

936

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

  1. Membuka info.plistfile target Proyek saya

  2. Menambahkan Kunci yang disebut NSAppTransportSecuritysebagai a Dictionary.

  3. Menambahkan Subkey disebut NSAllowsArbitraryLoadssebagai Booleandan mengatur nilainya YESseperti gambar berikut.

masukkan deskripsi gambar di sini

Bersihkan Proyek dan Sekarang Semuanya Berjalan Baik seperti sebelumnya.

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

EDIT: ATAU Dalam kode sumber info.plistfile kita dapat menambahkan bahwa:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
       </dict>
  </dict>
Manab Kumar Mal
sumber
5
Awalnya tidak bekerja. Anda perlu menambahkan kunci di dalam Project> Target juga
orafaelreis
4
Berikut ini beberapa pengembang
LargeGlasses
1
@MihirOza: Yap, keamanan transportasi adalah fitur baru iOS 9.
Dominic K
2
Jika Anda tidak memiliki domain pengecualian, cukup hapus kunci apa saja di bawah NSExceptionDomains. Atau kalau tidak, pengecualian NSAllowArbitraryLoads, maka Anda harus menggunakan https untuk mengunjungi iniexception
DawnSong
7
Untuk Xcode 8.3 / Swift 3 itu App Transport Security Settingsdan Allow Arbitrary Loadsmasing
Swapna Lekshmanan
280

Sadarilah, menggunakan NSAllowsArbitraryLoads = truedalam proyek ini info.plistmemungkinkan semua koneksi ke server apa pun menjadi tidak aman. Jika Anda ingin memastikan hanya domain tertentu yang dapat diakses melalui koneksi tidak aman, coba ini:

masukkan deskripsi gambar di sini

Atau, sebagai kode sumber:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>domain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Proyek Bersihkan & Bangun setelah diedit.

Arjan
sumber
terima kasih atas jawaban Anda, hanya NSAllowArbitaryLoads tidak berfungsi untuk saya menambahkan NSExceptionAllowsInsecureHTTPLoads melakukan trik
neeta
1
Saya juga menambahkan dua kunci ini: <! - Termasuk untuk membolehkan permintaan HTTP -> <key> NST temporaryExceptionAllowsInsecureHTTPLoads </key> <true /> <! - Sertakan untuk menentukan versi TLS minimum -> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </string> Itu membuatnya memuat BANYAK lebih cepat juga.
Sandy D.
Catatan: Saya menggunakan XCode 8 sekarang: Jika Anda melakukan ini secara manual, pastikan untuk mengklik kanan pada domain> Jenis Nilai> Kamus untuk menambahkan "..MemungkinkanInsecure ..." dan "... IncludesSubdomains"
ArielSD
Tidak berfungsi jika saya menentukan nomor port setelah domain.com. (domain.com:3001 misalnya)
Shamsiddin
43

Keamanan transportasi disediakan di iOS 9.0 atau lebih baru, dan di OS X v10.11 dan yang lebih baru.

Jadi secara default hanya https panggilan saja yang diizinkan di aplikasi. Untuk mematikan Keamanan Transport Aplikasi tambahkan baris berikut dalam file info.plist ...

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

Untuk info lebih lanjut:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

Teja Kumar Bethina
sumber
Tapi, ini masih tidak memungkinkan saya untuk membuat panggilan HTTP ke domain apa pun. Adakah petunjuk mengapa ini terjadi?
Mrug
Bahkan dengan URL HTTP, URL tersebut harus dibverver atau harus memiliki sertifikat SSL yang sah.
Teja Kumar Bethina
35

Untuk iOS 10.x dan Swift 3.x [versi di bawah ini juga didukung] cukup tambahkan baris berikut di 'info.plist'

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Mr Bean
sumber
1
Untuk 10.x dan Swift 3.x, saya telah melihat di tempat lain bahwa kunci-kunci itu sebenarnya AppTransportSecurity dan AllowsArbitraryLoads tetapi itu salah. awalan NS masih diperlukan untuk kunci-kunci ini, bahkan untuk Swift 3.x. Kesalahan hilang ketika saya mengandalkan awalan NS untuk kunci-kunci ini.
Jazzmine
27

Di Swift 4 Anda bisa menggunakan

-> Go Info.plist

-> Klik plus daftar properti Informasi

-> Tambahkan Pengaturan Keamanan Transport Transport sebagai kamus

-> Klik ikon Plus Pengaturan Keamanan Transport Aplikasi

-> Tambah Izinkan Beban Sewenang-wenang, atur YA

Gambar di bawah ini terlihat seperti

masukkan deskripsi gambar di sini

Enamul Haque
sumber
23

Saya telah menyelesaikan sebagai file plist.

Tambahkan NSAppTransportSecurity: Kamus.

Tambahkan Subkey bernama "NSAllowsArbitraryLoads" sebagai Boolean: YES

masukkan deskripsi gambar di sini

Avinash651
sumber
18

Sumber daya tidak dapat dimuat karena kebijakan Keamanan Transportasi Aplikasi mengharuskan penggunaan koneksi aman yang bekerja di Swift 4.03.

Buka pList.info Anda sebagai kode sumber dan tempel:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Keshav Gera
sumber
13

Dari dokumentasi Apple

Jika Anda mengembangkan aplikasi baru, Anda harus menggunakan HTTPS secara eksklusif. Jika Anda memiliki aplikasi yang ada, Anda harus menggunakan HTTPS sebanyak yang Anda bisa saat ini, dan membuat rencana untuk memigrasikan sisa aplikasi Anda sesegera mungkin. Selain itu, komunikasi Anda melalui API tingkat tinggi perlu dienkripsi menggunakan TLS versi 1.2 dengan kerahasiaan ke depan. Jika Anda mencoba membuat koneksi yang tidak mengikuti persyaratan ini, kesalahan terjadi. Jika aplikasi Anda perlu membuat permintaan ke domain tidak aman, Anda harus menentukan domain ini dalam file Info.plist aplikasi Anda.

Untuk Memintas Keamanan Transportasi Aplikasi:

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

Untuk mengizinkan semua domain tidak aman

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Baca selengkapnya: Mengkonfigurasi Pengecualian Keamanan Transport Aplikasi di iOS 9 dan OSX 10.11

Ashok R
sumber
11

Jika Anda menggunakan Xcode 8.0 dan swift 3.0 atau 2.2

masukkan deskripsi gambar di sini

Anit Kumar
sumber
9

Di Xcode 7.1 dan seterusnya (cepat 2.0)

masukkan deskripsi gambar di sini

AG
sumber
9

Ini adalah cara Apple untuk memaksakan keamanan yang lebih ketat pada apis Anda (dipaksa untuk menggunakan https melalui http). Saya akan menjelaskan cara menghapus pengaturan keamanan ini.


Sebagian besar jawaban di sini menunjukkan menambahkan kunci ini ke info.plist Anda masukkan deskripsi gambar di sini

Ini saja tidak menyelesaikan masalah ini untuk saya. Saya harus menambahkan kunci yang sama ke dalam

Project -> Targets -> Info -> Custom iOS Target Properties masukkan deskripsi gambar di sini


Ini akan memungkinkan koneksi tidak aman terjadi dari siapa pun. Jika Anda hanya ingin mengizinkan domain tertentu untuk menggunakan koneksi yang tidak aman, Anda dapat menambahkan yang berikut ini ke info.plist Anda.

masukkan deskripsi gambar di sini

Sam
sumber
Terima kasih, ini berhasil untuk saya! Saya hanya mengedit file plist yang sebelumnya tidak berfungsi. Saya terkejut bagaimana orang lain membuatnya bekerja seperti itu
jones
8

Anda hanya perlu menggunakan HTTPS dan bukan HTTP di URL Anda dan itu akan berfungsi

pierre23
sumber
3
Kecuali, tentu saja, Anda tidak dapat menggunakan HTTPS karena Apple tidak suka sertifikat yang ditandatangani sendiri. Apakah kamu tidak memiliki masalah itu?
Tony B
1
Dalam kasus saya, ini berfungsi dengan baik karena saya berubah menjadi HTTPS
pierre23
1
tetapi apakah Anda menggunakan sertifikat yang ditandatangani sendiri atau ditandatangani CA? Hanya penasaran. Agak masalah yang terpisah, tentu saja, tetapi kupikir aku akan bertanya.
Tony B
Saya tidak bekerja di sisi server, saya tidak tahu harus jujur ​​:(
pierre23
Menyiapkan koneksi HTTPS pada beberapa lingkungan server (shared hosting) mungkin sulit.
Raptor
7

Jika Anda bukan penggemar XML, maka tambahkan saja tag di bawah ini dalam file plist Anda.

masukkan deskripsi gambar di sini

MrWaqasAhmed
sumber
5

iOS 9 (mungkin) memaksa pengembang untuk menggunakan Keamanan Transport Aplikasi secara eksklusif. Saya mendengar ini di suatu tempat secara acak jadi saya tidak tahu apakah ini benar sendiri. Tapi saya curiga dan sampai pada kesimpulan ini:

Aplikasi yang berjalan di iOS 9 akan (mungkin) tidak lagi terhubung ke server Meteor tanpa SSL.

Ini berarti menjalankan meteor run ios atau meteor run ios-perangkat akan (mungkin?) Tidak lagi berfungsi.

Dalam info.plist aplikasi, NSAppTransportSecurity [Dictionary]perlu memiliki kunci NSAllowsArbitraryLoads [Boolean]untuk diatur ke YESatau Meteor perlu menggunakan httpsuntuk localhost serversegera.

Mahesh
sumber
5

Jika Anda menggunakan Xcode 8.0 hingga 8.3.3 dan cepat 2.2 ke 3.0

Dalam kasus saya perlu mengubah URL http: // ke https: // (jika tidak berfungsi maka coba)

Add an App Transport Security Setting: Dictionary.
Add a NSAppTransportSecurity: Dictionary.
Add a NSExceptionDomains: Dictionary.
Add a yourdomain.com: Dictionary.  (Ex: stackoverflow.com)

Add Subkey named " NSIncludesSubdomains" as Boolean: YES
Add Subkey named " NSExceptionAllowsInsecureHTTPLoads" as Boolean: YES

masukkan deskripsi gambar di sini

Md Imran Choudhury
sumber
3

Buka pList.info Anda sebagai Kode Sumber dan di bagian bawah sebelum </dict>menambahkan kode berikut,

 <!--By Passing-->
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>your.domain.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>
    <!--End Passing-->

Dan akhirnya ganti your.domain.comdengan Url basis Anda. Terima kasih.

Najam
sumber
3

Bagi Anda yang mengembangkan di localhost ikuti langkah-langkah ini:

  1. Ketuk tombol "+" di sebelah Information Property Listdan tambahkan App Transport Security Settingsdan tetapkan itu DictionaryTipe
  2. Ketuk tombol "+" di sebelah App Transport Security Settingsentri yang baru dibuat dan tambahkan NSExceptionAllowsInsecureHTTPLoadstipe Booleandan tetapkan nilainya YES.
  3. Klik kanan pada NSExceptionAllowsInsecureHTTPLoadsentri dan klik opsi "Shift Row Right" untuk menjadikannya anak dari entri di atas.
  4. Ketuk tombol "+" di sebelah NSExceptionAllowsInsecureHTTPLoadsentri dan tambahkan Allow Arbitrary Loadstipe Booleandan tetapkan nilainyaYES

Catatan: Seharusnya pada akhirnya terlihat seperti disajikan pada gambar berikut

masukkan deskripsi gambar di sini

ISS
sumber
2

Saya berhasil menyelesaikan ini dengan kombinasi dari banyak opsi yang disebutkan. Saya akan menyertakan daftar periksa semua hal yang harus saya lakukan untuk menyelesaikannya.

Pendeknya:

  1. Setel NSAllowsArbitraryLoadske true untuk ekstensi arloji saya (bukan aplikasi arloji saya).
  2. Pastikan saya menggunakan httpsdan tidak http.

Langkah pertama:

Pertama dan yang paling jelas saya harus menambahkan NSAppTransportSecuritykunci sebagai kamus di ekstensi arloji saya info.plistdengan subkunci yang disebut NSAllowsArbitraryLoadssebagai boolean yang disetel ke true. Hanya setel ini di ekstensi jam tangan dan bukan daftar aplikasi jam tangan. Meskipun perhatikan bahwa ini memungkinkan semua koneksi dan bisa jadi tidak aman.

masukkan deskripsi gambar di sini

atau

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

Langkah dua:

Kemudian saya harus memastikan bahwa url yang saya coba muat adalah httpsdan bukan hanya http. Untuk setiap url yang masih http saya gunakan:

Cepat :

let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")

Obj-C:

NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];

Gordonium
sumber
2

Pastikan Anda mengubah file info.plist yang tepat .

Ini adalah kedua kalinya saya membuang waktu untuk masalah ini, karena saya tidak melihat bahwa saya mengubah info. Daftar di bawah MyProjectNameUITests.

Shefy Gur-ary
sumber
1

Jika Anda menggunakan firebase, itu akan menambah NSAllowsArbitraryLoadsInWebContent = truedi NSAppTransportSecuritybagian, dan NSAllowsArbitraryLoads = truetidak akan berfungsi

cn00
sumber
Terima kasih atas informasi ini. Anda telah menyelamatkan saya dari masalah selama berjam-jam.
pAkY88
0

Saya telah memecahkan masalah ini dalam kasus server parse yang di-host sendiri menggunakan sertifikat yang ditandatangani satu tahun daripada opsi "NSAllowsArbitraryLoads"

Parse Server sebagai server node.js menyajikan url https publik yang harus Anda tentukan. Contohnya:

parse-server --appId --masterKey --publicServerURL https: //your.public.url/some_nodejs

Jangan ragu untuk melihat file konfigurasi saya

CyrIng
sumber