Безопасность приложений для транспорта Xcode 7 beta 6
В настоящее время я работаю над Xcode 7 beta 6. Я пытаюсь отправить запрос "DELETE" на http://mySubdomain.herokuapp.com
Получаемая ошибка:
App Transport Security заблокировала загрузку ресурса с открытым текстом HTTP (http://), поскольку она небезопасна. Временные исключения можно настроить через файл приложения Info.plist.
Ошибка при вызове API: Ошибка Домен = NSURLErrorDomain Code = -1022 Ресурс не может быть загружен, так как для политики безопасности приложения требуется использование безопасного соединения.
NSLocalizedDescription = Ресурс не может быть загружен, потому что для политики безопасности приложения требуется использование безопасного соединения. NSUnderlyingError = 0x796f7ef0 {Ошибка домена = 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 отформатирован правильно, потому что, когда я вручную его делаю из Postman, я получаю желаемый результат.
Вот как выглядит мой фактический метод вызова 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 в свой проект, и этот ответ был единственным, который рассматривал эту возможность. Решения, предлагаемые другими ответами, не являются ошибочными, поэтому любые другие люди, испытывающие эту проблему, должны дать им попробовать, так как они действительны. Я надеюсь, что это поможет любому, у кого есть подобные проблемы.
Ответы
Ответ 1
У меня также возникли проблемы с переопределением App Transport Security после обновления до xCode 7.0 и попробовали те же решения, которые вам не нужны. Некоторое время отходя от него, я заметил, что внес изменения в Info.plist в разделе "Файлы поддержки" "Тесты MyAppName", а не тот, что был в самом проекте. Папка поддерживающих файлов в моем проекте не была расширена, поэтому я даже не заметил Info.plist.
Типичная ошибка любителя, я уверен, но это всего лишь пара строк в Project Navigator, и это меня расстроило, пока я не заметил различия. Думаю, я упомянул об этом, если у вас возникнут те же проблемы.
Ответ 2
Я решил это с добавлением некоторого ключа в info.plist. Поскольку я использую объективный C для некоторого родного приложения.
Последовательность шагов:
![введите описание изображения здесь]()
Очистите проект, и теперь все работает нормально, как раньше.
Ссылка ссылки:
Ответ 3
Оцените, что вы пытались добавить в свой файл 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.
Ответ 4
Я решил как файл plist.
1. Добавьте a NSAppTransportSecurity : Dictionary
.
2. Добавьте подраздел под названием NSAllowsArbitraryLoads
в качестве Boolean : YES
Это сработало хорошо.
Ответ 5
В Xcode 8
- Откройте файл моих проектов info.plist
- Добавить ключ под названием
AppTransportSecurity
в качестве словаря.
- Добавьте подраздел под названием
AllowsArbitraryLoads
как Boolean и установите для него значение YES, как показано на следующем рисунке.
![введите описание изображения здесь]()