Приложение Transport Security Xcode 7 beta 6
В настоящее время я работаю над Xcode 7 beta 6. Я пытаюсь отправить запрос "УДАЛИТЬ" на http://mysubdomain.herokuapp.com/
Я получаю ошибку:
App Transport Security заблокировала загрузку ресурсов HTTP (http://) открытым текстом, поскольку она небезопасна. Временные исключения могут быть настроены через файл Info.plist вашего приложения.
Ошибка при вызове API: Error Domain=NSURLErrorDomain Code=-1022 Не удалось загрузить ресурс, поскольку политика безопасности транспорта приложений требует использования безопасного соединения.
NSLocalizedDescription = Не удалось загрузить ресурс, поскольку политика безопасности транспорта приложений требует использования безопасного соединения., NSUnderlyingError=0x796f7ef0 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}}
В моем действительном вызове API я поставил "https" вместо "http", и это фактически сработало для моих запросов POST. Но запрос DELETE выдает вышеуказанную ошибку.
Я видел здесь решения, включающие файл pList, но ни одно из них не помогло мне. Я перечислил свои попытки ниже.
Первая попытка:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Вторая попытка:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>herokuapp.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
И, наконец, я даже поместил все эти временные ключи примерно так:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>herokuapp.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSTemporaryThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSTemporaryThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
<key>NSTemporaryRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
Все без удачи! Я всегда получаю одну и ту же ошибку. Запрос DELETE отформатирован правильно, потому что, когда я делаю это вручную из Почтальона, я получаю желаемый результат.
Вот как выглядит мой фактический метод вызова API, на случай, если здесь может возникнуть проблема:
class func makeDELETEALLRequest(completion: (error:Bool) -> Void) {
let session = NSURLSession.sharedSession()
let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "DELETE"
let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if (error != nil) {
print("Error making API call: \(error!)")
completion(error: true)
} else {
let HTTPResponse = response as! NSHTTPURLResponse
let statusCode = HTTPResponse.statusCode
if (statusCode == 200){
print("Successfully deleted!")
completion(error: false)
} else {
print("Different status code: \(statusCode)")
completion(error: true)
}
}
}
task.resume()
}
Еще раз, я использую Xcode 7 beta 6.
О ИЗБРАННОМ ОТВЕТЕ Ответ, который я выбрал как правильный, был правильным для меня, потому что я внес все эти изменения в неправильный файл pList в своем проекте, и этот ответ был единственным, который касался этой возможности. Решения, предлагаемые другими ответами, не являются неправильными, поэтому любой другой человек, столкнувшийся с этой проблемой, должен дать им попытку, поскольку они действительны. Я надеюсь, что это помогает всем, у кого есть подобные проблемы.
6 ответов
У меня тоже возникли проблемы с переопределением App Transport Security после обновления до xCode 7.0, и я пробовал те же самые решения, которые вам не помогли. Отойдя от него на некоторое время, я заметил, что внес изменения в Info.plist в разделе "Вспомогательные файлы" "Тестов MyAppName", а не в самом проекте. Папка "Вспомогательные файлы" в моем проекте не была расширена, поэтому я даже не заметил в ней Info.plist.
Я уверен, что это типичная любительская ошибка, но в Project Navigator они всего на пару строк друг от друга, и это меня расстраивало, пока я не заметил различие. Думаю, я упомяну об этом на случай, если у тебя возникла такая же проблема.
Я решил это с добавлением ключа в info.plist. Поскольку я использую цель C для некоторого родного приложения.
Шаги, которые я выполнил:
Открыл мои проекты
info.plist
файлДобавлен ключ под названием
NSAppTransportSecurity
какDictionary
,- Добавлен подраздел с именем
NSAllowsArbitraryLoads
какBoolean
и установите его значениеYES
как на следующем изображении.
Очистите проект, и теперь все работает как обычно.
Ссылка:
Оцените, что вы попытались добавить следующее в ваш plist-файл:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
... вы можете попробовать изменить свою строку:
let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")
чтобы:
let url = NSURL(string:"http://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")
Извиняюсь, если вы попробовали это. Я могу понять, как это расстраивает, когда вы думаете, что исчерпали все возможности.
Но как только я запустил свое приложение на Xcode 7, чтобы я смог протестировать наши приложения, у одного возникла проблема "Безопасность транспорта приложений". Мы используем веб-сервисы на базе Oracle, и уже слишком поздно начинать настройку цифровых сертификатов для HTTP на основе SSL. Итак, вышеупомянутое дополнение к моему файлу plist добилось цели. Ценю, что вы сказали, что пробовали это. Но, просто чтобы помочь кому-то еще, это действительно сработало для меня. Это необходимо, поскольку у меня нет немедленного способа включить SSL на нашем сервере Oracle.
Я решил как файл plist.
1. Добавить NSAppTransportSecurity : Dictionary
,
2. Добавить подраздел с именем NSAllowsArbitraryLoads
как Boolean : YES
Это сработало хорошо.
В Xcode 8 и Xcode 9
- Откройте мой проект info.plist файл
- Добавить ключ под названием
AppTransportSecurity
в качестве словаря. - Добавить подраздел с именем
AllowsArbitraryLoads
как логическое значение и установите его значение YES, как показано на следующем рисунке.
Для XCode 13 я не нашел ни одного
Info.plist
файл, и из пользовательского интерфейса сложно добавить указанную настройку.
В
App Transport Security Settings
не существует по умолчанию. Вы должны знать наизусть, что нажатие этой кнопки + не добавит подэлемент, а полностью добавит новый элемент.
Я знаю, это звучит не так ясно и умно, но если вы нажмете на это
+
кнопка, она покажет вам набор ключей, которые не связаны с именем пакета (или любым другим ключом корневого уровня), но позволит вам добавить новые ключи на корневой уровень, включая
AppTransportSecurity
. Так нетривиально, но они так задумали.