Не удалось загрузить ресурс, поскольку политика безопасности транспорта приложений требует использования безопасного соединения


492

Я столкнулся с проблемой, когда я обновил свой 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, у меня возникла проблема, подобная следующей, когда я вызываю вышеуказанный метод веб-службы. Зарегистрированная ошибка, которую я получаю:

Ошибка подключения: ошибка Domain = NSURLErrorDomain Code = -1022 «Не удалось загрузить ресурс, поскольку политика безопасности транспорта приложений требует использования безопасного подключения». UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Error Domain = kCFErrorDomainCFNetwork Code = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL загружен, поскольку безопасность не может быть использована, т.к. соединение.}

Я пробовал следующие вопросы и ответы, но не получил никакого результата, есть ли какая-либо предварительная идея, как я могу устранить эту ошибку вызова службы?

  1. Не удалось загрузить ресурс ios9
  2. Приложение Transport Security Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

Возможная
копия

Ответы:


936

Я решил это с добавлением ключа в info.plist. Шаги, которые я выполнил:

  1. Открыл info.plistфайл цели моего проекта

  2. Добавлен ключ под NSAppTransportSecurityназванием Dictionary.

  3. Добавлен подраздел с именем NSAllowsArbitraryLoadsas 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

4
Вот некоторая полезная документация Apple developer.apple.com/library/ios/documentation/General/Reference/…
LargeGlasses

1
@MihirOza: Да, транспортная безопасность - это новая функция iOS 9.
Доминик К,

2
Если у вас нет исключительных доменов, просто удалите любой ключ в NSExceptionDomains. Или же это будет исключением NSAllowArbitraryLoads, тогда вы должны использовать https, чтобы посетить этоexception
DawnSong

7
Для Xcode 8.3 / Swift 3 это App Transport Security Settingsи Allow Arbitrary Loadsсоответственно
Swapna Lekshmanan

280

Имейте 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 -> <ключ> NSTevenExceptionAllowsInsecureHTTPLoads </ key> <true /> <! - Включить, чтобы указать минимальную версию TLS -> <ключ> NSTevenExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </ string> Это также ускорило загрузку LOT.
Сэнди Д.

Примечание: я сейчас использую XCode 8: если вы делаете это вручную, убедитесь, что щелкните правой кнопкой мыши домен> Тип значения> Словарь, чтобы добавить «..AllowsInsecure ...» и «...
IncludeSubdomains

Не работает, если я укажу номер порта после domain.com. (domain.com:3001 например)
Шамсиддин

43

Транспортная безопасность обеспечивается в iOS 9.0 или новее, а также в OS X v10.11 и новее.

Таким образом, по умолчанию только вызовы https разрешены только в приложениях. Чтобы отключить App Transport Security, добавьте следующие строки в файл 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-адрес должен быть проверен или иметь сертификат SSL vlid.
Теджа Кумар Бетина

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 для этих ключей.
Jazzmine

27

В Swift 4 можно использовать

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

-> Нажмите плюс из списка свойств информации

-> Добавить параметры безопасности транспорта приложения в качестве словаря

-> Щелкните значок «Плюс». Настройки безопасности транспорта приложения.

-> Добавить Разрешить произвольные нагрузки установить ДА

Ниже изображение выглядит

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


23

Я решил как файл plist.

Добавьте 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 обеспечить более строгую защиту вашего API (принудительно использовать https через http). Я объясню, как удалить этот параметр безопасности.


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

Одно это не решило эту проблему для меня. Я должен был добавить тот же ключ внутрь

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


Это позволит небезопасным соединениям происходить от кого бы то ни было. Если вы хотите разрешить использовать незащищенные соединения только для определенного домена, вы можете добавить следующее в ваш info.plist.

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


Спасибо, это сработало для меня! Я только отредактировал файл plist, до которого не работал. Я удивлен, как другие люди сделали это так
Джонс

8

Вам просто нужно использовать HTTPS, а не HTTP в вашем URL, и он будет работать


3
Если, конечно, вы не можете использовать HTTPS, потому что Apple не любит самозаверяющие сертификаты. У вас нет этой проблемы?
Тони Б

1
В моем случае это работает отлично, так как я перешел на HTTPS
pierre23

1
но вы используете самоподписанный или подписанный сертификат CA? Просто любопытно. Вроде как отдельная тема, конечно, но подумал, я бы спросил.
Тони Б,

Я не работал на стороне сервера, я не знаю, если честно :(
pierre23

Настройка HTTPS-соединения в некоторых серверных средах (общий хостинг) может быть затруднена.
Raptor

7

Если вы не большой поклонник XML, просто добавьте тег ниже в ваш файл plist.

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


5

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

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

Это означает, что запуск метеоритного запуска ios или запуск метеоритного ios-устройства (вероятно?) Больше не будет работать.

В info.plist приложения NSAppTransportSecurity [Dictionary]должен быть ключ, NSAllowsArbitraryLoads [Boolean]который нужно установить, YESили Метеор должен скоро httpsего использовать localhost server.


5

Если вы используете Xcode 8.0 до 8.3.3 и swift 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 записи и выберите опцию «Shift Row Right», чтобы сделать ее дочерней по отношению к вышеуказанной записи.
  4. Нажмите кнопку «+» рядом с NSExceptionAllowsInsecureHTTPLoadsзаписью и добавьте Allow Arbitrary Loadsтип Booleanи установите его значениеYES

Примечание: в итоге оно должно выглядеть примерно так, как показано на следующем рисунке.

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


2

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

Короче говоря:

  1. Набор NSAllowsArbitraryLoads значение true для моего расширения часов (не мое приложение часов).
  2. Убедитесь, что я использовал httpsи нет http.

Шаг первый:

Во-первых и наиболее очевидно, что мне нужно было добавить NSAppTransportSecurityключ в качестве словаря в моих расширениях часов info.plistс подключом, называемым NSAllowsArbitraryLoadsкак логическое значение true. Установите это только в расширении часов, а не в списке приложений часов. Хотя обратите внимание, что это разрешает все соединения и может быть небезопасным.

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

или

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

Parse Server как любой сервер node.js представляет общедоступный URL-адрес https, который вы должны указать. Например:

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

Не стесняйтесь взглянуть на мои файлы конфигурации

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.