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

Я столкнулся с проблемой, когда я обновил свой 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 загруженного ресурса не требуется, так как NSL не может быть загружен из-за отсутствия безопасности. соединение.}

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

  1. Не удалось загрузить ресурс ios9
  2. Приложение Transport Security Xcode 7 beta 6
  3. /questions/42168912/prilozhenie-transport-security-xcode-7-beta-6/42168917#42168917

24 ответа

Решение

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

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

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

  3. Добавлен подраздел с именем NSAllowsArbitraryLoads как Boolean и установите его значение YES как на следующем изображении.

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

Очистите проект, и теперь все работает как обычно.

Ссылка: /questions/42168912/prilozhenie-transport-security-xcode-7-beta-6/42168917#42168917

РЕДАКТИРОВАТЬ: ИЛИ В исходном коде 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>

Быть в курсе, используя NSAllowsArbitraryLoads = true позволяет любое соединение с любым сервером быть небезопасным. Если вы хотите убедиться, что через небезопасное соединение доступен только определенный домен, попробуйте следующее:

Или, как исходный код:

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

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

Транспортная безопасность обеспечивается в 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

Для iOS 10.x и Swift 3.x [поддерживаются также версии ниже) просто добавьте следующие строки в "info.plist"

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

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

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

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

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

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

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

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

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

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

Добавьте NSAppTransportSecurity: словарь.

Добавить подраздел с именем " NSAllowsArbitraryLoads " в качестве логического значения: ДА

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

Это способ Apple усилить безопасность вашего API (принудительно использовать https вместо http). Я объясню, как удалить эту настройку безопасности.


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

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

Project -> Targets -> Info -> Custom iOS Target Properties


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

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

Откройте ваш pList.info как исходный код и вставьте:

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

Из документации 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

Если вы используете Xcode 8.0 и swift 3.0 или 2.2

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

В Xcode 7.1 и более поздних версиях (Swift 2.0)

В XCode 12.5. IOS 14. Я сделал следующие записи

Так выглядит исходный код info.plist

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

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

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

Для тех из вас, кто разрабатывает на 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

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

https://stackru.co m/images/708ea18c702d8e0b09d2f1f33134d99afc7d40f1.png

Если вы используете 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: stackru.com)

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

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

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

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

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

Убедитесь, что вы изменили правильный файл info.plist.

Это второй раз, когда я трачу впустую время на эту проблему, потому что я не заметил, что я изменяю info.plist в MyProjectNameUITests.

Откройте свой 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. Благодарю.

Если вы используете firebase, он добавит NSAllowsArbitraryLoadsInWebContent = true в NSAppTransportSecurity раздел и NSAllowsArbitraryLoads = true не будет работать

Звонки рекомендуется использовать только в приложениях. Транспортная безопасность была введена в iOS 9.0 и по умолчанию разрешала вызовы только из приложений.

Однако, если вы по-прежнему хотите разрешить все неhttpsвызовы — Добавить (Словарь) в Info.plist и Добавить Подключ с логическим значением YES. После обновления plist должен выглядеть так

ШАГИ

  • Открыть Info.plist
  • Нажмите + под списком свойств информации.
  • Добавить параметры безопасности транспорта приложений (NSAppTransportSecurity) как словарь
  • Нажмите + под добавленными настройками безопасности транспорта приложений.
  • Добавить Разрешить произвольные загрузки(NSAllowsArbitraryLoads) как логическое значение и установите значение YES

Для XCode 13 добавление Allow Arbitrary Loadsне такая уж тривиальная работа. Поскольку по умолчанию нет ключа с именем App Transport Security Settings.

Вы должны узнать, как добавить новый ключ корневого уровня, нажав любую из кнопок «плюс», которые вы видите в разделе «Информация / Пользовательские свойства цели iOS».

Подробности смотрите по этой ссылке:

/questions/42168912/prilozhenie-transport-security-xcode-7-beta-6/62327675#62327675

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

Короче:

  1. Задавать NSAllowsArbitraryLoads истинно для моего расширения часов (не мое приложение часов).
  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”];

Я решил эту проблему в случае самодостаточного сервера синтаксического анализа, использующего сертификат, подписанный на один год, а не параметр "NSAllowsArbitraryLoads"

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

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

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

Другие вопросы по тегам