Приложение 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 для некоторого родного приложения.

Шаги, которые я выполнил:

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

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

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

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

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

Ссылка:

  1. /questions/5304483/ne-udalos-zagruzit-resurs-poskolku-politika-bezopasnosti-transporta-prilozhenij-trebuet-ispolzovaniya-bezopasnogo-soedineniya/5304495#5304495

  2. /questions/42168912/prilozhenie-transport-security-xcode-7-beta-6/42168917#42168917

Оцените, что вы попытались добавить следующее в ваш 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

  1. Откройте мой проект info.plist файл
  2. Добавить ключ под названием AppTransportSecurity в качестве словаря.
  3. Добавить подраздел с именем AllowsArbitraryLoads как логическое значение и установите его значение YES, как показано на следующем рисунке.

Для XCode 13 я не нашел ни одного Info.plistфайл, и из пользовательского интерфейса сложно добавить указанную настройку.

В App Transport Security Settingsне существует по умолчанию. Вы должны знать наизусть, что нажатие этой кнопки + не добавит подэлемент, а полностью добавит новый элемент.

Я знаю, это звучит не так ясно и умно, но если вы нажмете на это +кнопка, она покажет вам набор ключей, которые не связаны с именем пакета (или любым другим ключом корневого уровня), но позволит вам добавить новые ключи на корневой уровень, включая AppTransportSecurity. Так нетривиально, но они так задумали.

Следовательно, это выглядит так:

Другие вопросы по тегам