Не вдалося завантажити ресурс, оскільки політика безпеки транспорту додатків вимагає використання безпечного з'єднання


491

Я зіткнувся з проблемою, коли я оновив свій Xcode до 7.0 або iOS 9.0. Якось почала видавати мені помилку під заголовком

"Не вдалося завантажити ресурс, оскільки політика безпеки транспорту додатків вимагає використання безпечного з'єднання"

Метод веб-сервісу:

-(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];

}

Служба працює нормально для попередніх версій Xcode та попередніх версій iOS Але коли я оновив до Xcode 7.0, що знаходиться на iOS 9.0, він почав створювати мені проблему, як слід, коли я закликаю вищевказаний метод веб-сервісу. Помилка, яку я отримую:

Підключення не вдалося: Error Domain = NSURLErrorDomain Code = -1022 "Не вдалося завантажити ресурс, оскільки політика безпеки транспорту додатків вимагає використання безпечного з'єднання." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Error Domain = kCFErrorDomainCFNetwork Code = -1022 "(нуль)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL , NSLocalizedDescription = Ресурс не може бути завантажений , тому що політика App безпеки транспорту вимагає використання безпечного з'єднання.}

Я спробував наступні запитання та відповіді, але не отримав жодного результату, чи є заздалегідь ідея, як я можу видалити цю помилку виклику служби?

  1. Не вдалося завантажити ресурс - ios9
  2. Безпека прикладного транспорту Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

можливий дублікат App Transport Security Xcode 7 beta 6
AiOsN

Відповіді:


935

Я вирішив це, додавши ключ в info.plist. Наступні кроки:

  1. Відкрив info.plistфайл мого цільового проекту

  2. Додано ключ, названий NSAppTransportSecurityяк Dictionary.

  3. Додано підрозділ, який називається NSAllowsArbitraryLoadsяк Booleanі встановив його значення YESяк, як наступне зображення.

введіть тут опис зображення

Очистіть проект і зараз все працює нормально, як раніше.

Посилання на посилання: https://stackoverflow.com/a/32609970

Редагувати: АБО У вихідний код info.plistфайлу ми можемо додати, що:

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

5
Спочатку це не працює. Вам потрібно додати ключі всередині Project> Target
orafaelreis


1
@MihirOza: Так, транспортна безпека - нова особливість iOS 9.
Домінік К

2
Якщо у вас немає доменів винятків, просто видаліть будь-яку клавішу під NSExceptionDomains. Інакше це буде винятком NSAllowArbitraryLoads, тоді ви повинні використовувати https, щоб відвідати цеexception
DawnSong

7
Для Xcode 8.3 / Swift 3 це App Transport Security Settingsі Allow Arbitrary Loadsвідповідно
Свапна Lekshmanan

279

Будьте в курсі, використання NSAllowsArbitraryLoads = trueв проекті info.plistдозволяє всім підключенням до будь-якого сервера бути небезпечним. Якщо ви хочете переконатися, що доступ до лише певного домену через незахищене з'єднання, спробуйте:

введіть тут опис зображення

Або, як вихідний код:

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

Очистити та скласти проект після редагування.


дякую за вашу відповідь просто NSAllowArbitaryLoads не працював для мене, додаючи NSExceptionAllowsInsecureHTTPLoads зробив свою
справу

1
Я також додав ці два ключі: <! - Включити, щоб дозволити запити HTTP -> <ключ> NSTemporaryExceptionAllowsInsecureHTTPLoads </key> <true /> <! - включити, щоб вказати мінімальну версію TLS -> <key> NSTemvremeExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </string> Це також змусило його швидше завантажуватись.
Сенді Д.

Примітка. Зараз я використовую XCode 8: Якщо ви робите це вручну, переконайтесь, що клацніть правою кнопкою миші на домен> Тип значення> Словник, щоб додати "..AllowsInsecure ..." та "... Включає
піддомен

Не працює, якщо я вказую номер порту після domain.com. (Наприклад , domain.com:3001)
Шамсіддінов

43

Безпека транспорту надається в iOS 9.0 або новішої версії, а також в OS X v10.11 та новіших версій.

Тож за замовчуванням дозволені лише https- дзвінки, лише в додатках. Щоб вимкнути безпеку транспорту додатків, додайте наступні рядки у файл info.plist ...

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

Для отримання додаткової інформації:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


Але це все ще не дозволяє мені здійснювати дзвінки HTTP в будь-який домен. Чи є якась підказка, чому це відбувається?
Mrug

Навіть HTTP-URL, URL-адреса повинна бути підтверджена або повинна мати сертифікат vlid SSL.
Тея Кумар Бетіна

35

Для iOS 10.x та Swift 3.x [нижче також підтримуються версії] просто додайте наступні рядки у "info.plist"

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

1
Для 10.x та Swift 3.x я десь бачив, що ключі насправді є AppTransportSecurity та AllowsArbitraryLoads, але вони помилялися. для цих клавіш ще потрібен префікс NS, навіть для Swift 3.x. Помилка усунулася, коли я покладався на префікс NS для цих клавіш.
Джазмін

27

У Swift 4 Ви можете використовувати

-> Перейти Info.plist

-> Клацніть плюс список списку властивостей інформації

-> Додати параметри безпеки транспорту додатків як словник

-> Клацніть значок Плюс Параметри безпеки транспорту програми

-> Додати дозволити довільні вантажі встановити ТАК

Зображення нижче виглядають так

введіть тут опис зображення


23

Я вирішив як файл-список.

Додайте NSAppTransportSecurity: Словник.

Додайте підрозділ під назвою "NSAllowsArbitraryLoads" як логічний: ТАК

введіть тут опис зображення


18

Не вдалося завантажити ресурс, оскільки політика безпеки транспорту вимагає використання захищеного з'єднання, що працює в Swift 4.03.

Відкрийте свій pList.info як вихідний код та вставте:

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

13

З документації Apple

Якщо ви розробляєте новий додаток, вам слід використовувати виключно HTTPS. Якщо у вас є вже наявний додаток, ви повинні використовувати HTTPS наскільки це можливо зараз, і якнайшвидше створити план міграції іншої частини програми. Крім того, ваше спілкування через API вищого рівня має бути зашифровано за допомогою TLS версії 1.2 з попередньою секретністю. Якщо ви спробуєте встановити з'єднання, яке не відповідає цій вимозі, помилка видається. Якщо вашому додатку потрібно подати запит на незахищений домен, потрібно вказати цей домен у файлі Info.plist додатка.

Щоб обійти безпеку транспорту додатків:

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

Щоб дозволити всі небезпечні домени

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

Детальніше: Налаштування винятків безпеки транспорту додатків у iOS 9 та OSX 10.11




9

Це спосіб Apple змусити посилити безпеку на apis (змушений використовувати https через http). Я поясню, як видалити цей параметр безпеки.


Більшість відповідей тут вказують на додавання цього ключа до вашого списку info.plist введіть тут опис зображення

Це одне не вирішило для мене цю проблему. Мені довелося додати всередину той самий ключ

Project -> Targets -> Info -> Custom iOS Target Properties введіть тут опис зображення


Це дозволить забезпечити незахищені зв’язки з ким завгодно. Якщо ви хочете дозволити використовувати лише певний домен для створення небезпечних з'єднань, ви можете додати наступне до свого списку info.plist.

введіть тут опис зображення


Дякую, це працювало для мене! Я лише редагував файл плісту, перед яким не працював. Im здивований , як інші люди отримали це працює , що шлях
Джоунс

8

Вам просто потрібно використовувати HTTPS, а не HTTP у своїй URL-адресі, і це буде працювати


3
Якщо, звичайно, ви не можете використовувати HTTPS, тому що Apple не любить самопідписані сертифікати. У вас немає такої проблеми?
Тоні Б

1
У моєму випадку це прекрасно працює, оскільки я змінив HTTPS
pierre23

1
але ви використовуєте сертифікат, який підписує власний підпис або CA? Просто цікаво. Сорт окремого питання, звичайно, але я зрозумів, що запитаю.
Тоні Б

Я не працював на стороні сервера, я не знаю, щоб бути чесним :(
pierre23

Налаштування HTTPS-з'єднання в деяких серверах (спільний хостинг) може бути складним.
Раптор

7

Якщо ви не є великим шанувальником XML, то просто додайте тег нижче у свій список плістів.

введіть тут опис зображення


5

iOS 9 (може) змусити розробників використовувати виключно App Transport Security . Я чула це десь випадковим чином, тому не знаю, чи це правда сама. Але я підозрюю це і дійшов такого висновку:

Додаток, що працює на iOS 9, (можливо) більше не підключатиметься до Meteor-сервера без SSL.

Це означає, що запуск метеорологічного запуску ios або метеорний ios-пристрій більше (мабуть?) Більше не працюватимуть.

У інформаційному списку додатків NSAppTransportSecurity [Dictionary]потрібно мати ключ, NSAllowsArbitraryLoads [Boolean]який потрібно встановити, YESабо Метеор повинен використовувати httpsйого localhost serverнезабаром.


5

Якщо ви використовуєте Xcode 8.0 до 8.3.3 та швидкий 2.2 до 3.0

У моєму випадку потрібно змінити URL-адресу http: // на https: // (якщо не працює, то спробуйте)

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

введіть тут опис зображення


3

Відкрийте свій pList.info як вихідний код і внизу безпосередньо перед </dict>додаванням наступного коду,

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

І, нарешті, змініть your.domain.comсвою базу URL-адреси. Дякую.


3

Для тих, хто ви розвиваєтеся на localhost, виконайте наступні кроки:

  1. Торкніться кнопки "+" поруч із ними Information Property Listта додайте App Transport Security Settingsта призначте DictionaryТип
  2. Торкніться кнопки "+" біля новоствореної App Transport Security Settingsзаписи та додайте NSExceptionAllowsInsecureHTTPLoadsтип Booleanі встановіть його значення YES.
  3. Клацніть правою кнопкою миші на NSExceptionAllowsInsecureHTTPLoadsвході та натисніть на опцію "Зсунути рядок вправо", щоб зробити її дитиною вищевказаного.
  4. Торкніться кнопки "+" поруч із NSExceptionAllowsInsecureHTTPLoadsзаписом та додаванням Allow Arbitrary Loadsтипу Booleanта встановіть його значенняYES

Примітка. Зрештою, це має виглядати приблизно так, як представлено на наступному малюнку

введіть тут опис зображення


2

Мені вдалося вирішити це за допомогою поєднання багатьох згаданих варіантів. Я включу контрольний список всіх речей, які мені довелося зробити, щоб це працювати.

Коротко:

  1. Встановлено NSAllowsArbitraryLoadsзначення true для мого розширення для годинника (не для мого додатка для годинника).
  2. Переконайтесь, що я використовував, httpsа ні http.

Крок перший:

По-перше, і найочевидно, що мені довелося додати NSAppTransportSecurityключ у словник до розширення годинника info.plistз підрозділом, який називається NSAllowsArbitraryLoadsбулевим рівнем true. Тільки встановити це в продовження годин і не Plist Сторожовий програми. Хоча зауважте, що це дозволяє всі з'єднання і може бути небезпечним.

введіть тут опис зображення

або

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

Крок другий:

Тоді я повинен був переконатися, що URL-адреса, яку я намагався завантажити, є, httpsа не просто http. Для будь-яких URL-адрес, які ще були http, я використовував:

Швидкий :

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

Obj-C:

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


2

Переконайтеся, що ви змінили потрібний файл info.plist .

Це вже вдруге я витрачаю час на це питання, тому що я не помітив, що я змінюю info.plist під MyProjectNameUITests.


1

Якщо ви використовуєте firebase, вона буде додана NSAllowsArbitraryLoadsInWebContent = trueв NSAppTransportSecurityрозділ, і NSAllowsArbitraryLoads = trueне працюватиме


Дякуємо за цю інформацію. Ви врятували мені години усунення несправностей.
pAkY88

0

Я вирішив цю проблему у випадку власного сервера розбору, використовуючи сертифікат на один рік, а не опцію "NSAllowsArbitraryLoads"

Сервер розбору як будь-який сервер node.js представляє відкритий https-URL, який потрібно вказати. Наприклад:

парсер-сервер --appId --masterKey --publicServerURL https: //your.public.url/some_nodejs

Не соромтесь переглядати мої файли конфігурації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.