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


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

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

Webservice Метод:

-(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 код=-1022 "в не удалось загрузить ресурс, так как политика безопасности транспорта приложения требуется использование защищенного соединения." UserInfo={NSUnderlyingError=0x7fada0f31880 {ошибка Домен=Kcferrordomaincfnetwork Code=-1022 "(null)"}, NSErrorFailingURLStringKey=MyServiceURL, NSErrorFailingURLKey=MyServiceURL, NSLocalizedDescription=не удалось загрузить ресурс, так как Политика безопасности транспорта приложений требует использования безопасного соединение.}

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

  1. ресурс не может быть загружен iOS 9 охота
  2. приложение Transport Security Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970
18 381

18 ответов:

я решил его с добавлением некоторого ключа в информации.файл plist. Шаги, которые я следовал:

  1. открыл цель моего проекта info.plist file

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

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

enter image description here

очистите проект, и теперь все работает нормально, как как и раньше.

ссылка на ссылку:https://stackoverflow.com/a/32609970

EDIT: Или в исходном коде

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

enter image description here

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

<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 звонки только в приложениях. Чтобы отключить безопасность транспорта приложений, добавьте следующие строки в информация.файл plist...

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

дополнительные info:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

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

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

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

добавить NSAppTransportSecurity : словарь.

добавить подраздел с именем "NSAllowsArbitraryLoads" как Boolean: YES

enter image description here

в Xcode 7.1 и далее (swift 2.0)

enter image description here

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

enter image description here

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

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

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

из документации Apple

если вы разрабатываете новое приложение, вы должны использовать HTTPS исключительно. Если у вас есть существующее приложение, вы должны использовать HTTPS столько, сколько вы можете прямо сейчас, и создать план для миграции остальной части вашего приложения как можно скорее. Кроме того, ваша связь через API более высокого уровня должна быть зашифрована с помощью TLS версии 1.2 с прямой секретностью. При попытке установить соединение, которое не соответствует этому требованию, возникает ошибка брошенный. Если ваше приложение должно сделать запрос к небезопасным домена, вы должны указать этот домен в инфо вашего приложения.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

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

- > Go Info.файл plist

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

->добавить Настройки Безопасности Транспорта Приложения как Dictionary

-> нажмите значок "плюс" Настройки Безопасности Транспорта Приложения

-> добавить Разрешить Произвольные Нагрузки set да

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

enter image description here

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

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

enter image description here

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

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

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

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

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

короче:

  1. Set NSAllowsArbitraryLoads true для моего расширения часов (не мое приложение для часов).
  2. убедитесь, что я был с помощью https, а не http.

Шаг первый:

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

enter image description here

или

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

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

enter image description here

откройте 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. Спасибо.

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

разбирать сервер как любой узел.сервер JS представляет собой общественные HTTPS в URL-адрес что вы должны указать. Например:

parse-server --appId --masterKey --publicServerURL https://your.общественный.URL-адрес/some_nodejs

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

убедитесь, что вы изменили правильную информацию.plist file.

Это второй раз Я трачу время на этот вопрос, потому что я не заметил, что я меняю информацию.plist под MyProjectNameUITests.