Не удалось загрузить ресурс, поскольку политика безопасности транспорта приложений требует использования безопасного соединения.
Я столкнулся с проблемой, когда я обновил свой 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 не может быть загружен из-за отсутствия безопасности. соединение.}
Я пробовал следующие вопросы и ответы, но не получил никакого результата, есть ли какая-либо предварительная идея, как я могу устранить эту ошибку вызова службы?
24 ответа
Я решил это с добавлением ключа в info.plist. Шаги, которые я выполнил:
Открыл цели моего проекта
info.plist
файлДобавлен ключ под названием
NSAppTransportSecurity
какDictionary
,- Добавлен подраздел с именем
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 12.5. IOS 14. Я сделал следующие записи
Так выглядит исходный код info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Вам просто нужно использовать HTTPS, а не HTTP в вашем URL, и это будет работать
Для тех из вас, кто разрабатывает на localhost, выполните следующие действия:
- Нажмите кнопку "+" рядом с
Information Property List
и добавитьApp Transport Security Settings
и присвоить емуDictionary
Тип - Нажмите кнопку "+" рядом с только что созданным
App Transport Security Settings
запись и добавитьNSExceptionAllowsInsecureHTTPLoads
типаBoolean
и установите его значение наYES
. - Щелкните правой кнопкой мыши на
NSExceptionAllowsInsecureHTTPLoads
запись и щелкните опцию "Сдвинуть строку вправо", чтобы сделать ее дочерней по отношению к указанной выше записи. - Нажмите кнопку "+" рядом с
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
Мне удалось решить это с помощью комбинации множества упомянутых вариантов. Я включу контрольный список всех вещей, которые я должен был сделать, чтобы заставить это работать.
Короче:
- Задавать
NSAllowsArbitraryLoads
истинно для моего расширения часов (не мое приложение часов). - Убедитесь, что я использовал
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
Не стесняйтесь взглянуть на мои файлы конфигурации