Безопасность приложений для транспорта 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 для некоторого родного приложения.

Последовательность шагов:

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

  • Добавлен ключ с именем NSAppTransportSecurity как Dictionary.

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

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

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

Ссылка ссылки:

Ответ 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, как показано на следующем рисунке.

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