НейроАгент

Конфигурация исключений ATS в Info.plist для iOS

Узнайте, как настроить Info.plist для включения HTTP-соединений для example.com в приложениях iOS. Полное руководство с пошаговыми инструкциями и рекомендациями по безопасности.

Вопрос

Какой параметр мне нужно добавить в мой info.plist, чтобы включить HTTP режим, согласно следующему сообщению об ошибке?

“Система транспортной безопасности заблокировала загрузку ресурса в виде открытого HTTP (http://), так как это небезопасно. Временные исключения можно настроить в файле Info.plist вашего приложения.”

Предположим, что мой домен - example.com.

НейроАгент

Чтобы включить HTTP-соединения для example.com в вашем iOS-приложении, вам необходимо добавить конфигурацию исключения домена в файл Info.plist в словаре NSAppTransportSecurity. Рекомендуемый подход — использовать NSExceptionDomains для указания точных доменов, которым требуется доступ по HTTP, при этом сохраняя ATS включенным для других доменов.


Содержание


Понимание App Transport Security

App Transport Security (ATS) — это функция безопасности, представленная Apple, которая обеспечивает соблюдение лучших практик для сетевых соединений в iOS-приложениях. По умолчанию ATS требует, чтобы все сетевые соединения использовали HTTPS с определенными требованиями к безопасности. Когда ваше приложение пытается установить HTTP-соединение с example.com, ATS блокирует его и отображает сообщение об ошибке, с которым вы столкнулись.

ATS направлена на:

  • Предотвращение случайных небезопасных соединений
  • Заставление разработчиков использовать безопасные HTTPS-соединения
  • Защиту пользовательских данных от перехвата и подделки

Однако существуют законные случаи, когда вам может потребоваться подключаться к сервисам, которые еще не поддерживают HTTPS, таким как серверы разработки, устаревшие API или сторонние сервисы, находящиеся под вашим контролем.

Базовая конфигурация для example.com

Самый простой способ разрешить HTTP-соединения для example.com — добавить конфигурацию исключения домена в файл Info.plist. Вот минимальная требуемая конфигурация:

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

Эта конфигурация:

  • Включает HTTP-соединения для example.com и его поддоменов
  • Сохраняет безопасность ATS для всех других доменов
  • Является рекомендуемым подходом для производственных приложений, требующих определенных HTTP-соединений

Важно: Имя домена в plist должно точно соответств тому, как оно появляется в вашем коде. Если вы используете http://www.example.com в коде, вы должны указать www.example.com в plist, а не просто example.com.

Расширенные настройки исключений

Для более детального контроля над исключением вы можете добавить дополнительные ключи в свою конфигурацию:

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSRequiresCertificateTransparency</key>
            <true/>
        </dict>
    </dict>
</dict>

Доступные ключи исключений:

Ключ Тип Описание
NSIncludesSubdomains Boolean Если true, исключение применяется ко всем поддоменам указанного домена
NSExceptionAllowsInsecureHTTPLoads Boolean Разрешает HTTP-соединения с доменом
NSThirdPartyExceptionAllowsInsecureHTTPLoads Boolean Альтернатива NSExceptionAllowsInsecureHTTPLoads, специально для стороннего контента
NSExceptionMinimumTLSVersion String Требуемая минимальная версия TLS (например, “TLSv1.1”, “TLSv1.2”)
NSExceptionRequiresForwardSecrecy Boolean Требует прямого шифрования для соединений
NSRequiresCertificateTransparency Boolean Требует прозрачности сертификата для домена

Согласно документации Apple Developer, использование этих ключей позволяет поддерживать безопасность, делая исключения для определенных доменов.

Пошаговое руководство по реализации

Метод 1: Использование редактора свойств Xcode

  1. Откройте ваш проект в Xcode
  2. Выберите цель вашего приложения в навигаторе проекта
  3. Откройте файл Info.plist
  4. Щелкните правой кнопкой мыши в пустой области и выберите “Добавить строку”
  5. Добавьте ключ: NSAppTransportSecurity
  6. Установите тип: Dictionary
  7. Нажмите треугольник, чтобы развернуть словарь NSAppTransportSecurity
  8. Добавьте новую строку: NSExceptionDomains (тип: Dictionary)
  9. Добавьте ваш домен: example.com (тип: Dictionary)
  10. Настройте параметры исключения:
    • NSIncludesSubdomains: Boolean (true)
    • NSExceptionAllowsInsecureHTTPLoads: Boolean (true)

Метод 2: Редактирование Info.plist как исходного кода

  1. Щелкните правой кнопкой мыши по Info.plist в Xcode
  2. Выберите “Открыть как” → “Исходный код”
  3. Добавьте следующий XML внутри верхнего элемента <dict>:
xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

Метод 3: Использование CocoaPods или параметров сборки

Для более сложных конфигураций вы можете использовать параметры сборки. Как показано в документации Corona Labs, вы можете настроить ATS в файле build.settings:

lua
settings = {
    iphone = {
        plist = {
            NSAppTransportSecurity = {
                NSExceptionDomains = {
                    ["example.com"] = {
                        NSIncludesSubdomains = true,
                        NSThirdPartyExceptionAllowsInsecureHTTPLoads = true,
                    },
                },
            },
        },
    },
}

Соображения по безопасности

При использовании исключений ATS учитывайте эти лучшие практики безопасности:

1. Используйте исключения для конкретных доменов

Избегайте использования NSAllowsArbitraryLoads = true, так как это полностью отключает ATS для вашего приложения. Вместо этого укажите точные домены, требующие исключений.

2. Ограничьте область действия

Добавляйте исключения только для доменов, которыми вы управляете или которым доверяете. Согласно рекомендациям Apple, вы должны:

  • Использовать максимально возможную ограничительную конфигурацию
  • Тщательно тестировать, чтобы убедиться, что только запланированные соединения обходят ATS
  • Документировать причину каждого исключения

3. Рассмотрите временные исключения

Для целей разработки вы можете использовать условную компиляцию для включения исключений ATS только в отладочных сборках:

swift
#if DEBUG
    // Конфигурация исключения ATS
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>example.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>
#endif

Распространенные проблемы и устранение неполадок

Проблема 1: Все еще получаете ошибку после настройки

Решение: Тщательно проверьте, что:

  • Имя домена в plist точно соответствует тому, что вы используете в коде
  • Вы не используете https://example.com, когда исключение предназначено для http://example.com
  • Синтаксис plist правильный (все теги правильно закрыты)

Проблема 2: Поддомен не работает

Решение: Убедитесь, что NSIncludesSubdomains установлено в true и что имя поддомена точно совпадает.

Проблема 3: Отклонение App Store

Решение: Apple был строг в отношении исключений ATS с iOS 10. Согласно обсуждениям на Stack Overflow, вы должны:

  • Документировать причину необходимости исключения
  • Использовать максимально возможную ограничительную конфигурацию
  • Рассмотреть возможность использования HTTPS, если это возможно

Проблема 4: Сторонний контент все еще блокируется

Решение: Используйте NSThirdPartyExceptionAllowsInsecureHTTPLoads вместо или в дополнение к NSExceptionAllowsInsecureHTTPLoads.

Альтернативные подходы

1. Прокси-сервер на стороне сервера

Вместо прямых HTTP-запросов настройте безопасный HTTPS-прокси-сервер, который перенаправляет запросы к HTTP-сервису. Ваше приложение общается с прокси через HTTPS, сохраняя сквозную безопасность.

2. Сетевое расширение

Для корпоративных приложений рассмотрите использование сетевого расширения для изменения сетевого трафика при сохранении безопасности на уровне приложения.

3. Гибридный подход

Используйте разные конфигурации для разных целей сборки:

  • Отладка: Более разрешительные настройки ATS
  • Релиз: Минимальные исключения или их отсутствие

Согласно документации Mobix, вы можете настроить разные параметры ATS для разных конфигураций приложения.


Заключение

Включение HTTP-соединений для example.com в вашем iOS-приложении требует настройки исключений ATS в Info.plist. Вот основные выводы:

  1. Используйте NSExceptionDomains для указания точных доменов, требующих доступа по HTTP
  2. Настраивайте минимальные исключения с помощью NSIncludesSubdomains и NSExceptionAllowsInsecureHTTPLoads
  3. Сохраняйте безопасность, избегая полного отключения ATS
  4. Тщательно тестируйте, чтобы убедиться, что только запланированные соединения обходят ATS
  5. Документируйте ваши исключения для проверки в App Store и обслуживания

Рекомендуемая конфигурация для example.com:

xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

Не забудьте ознакомиться с текущими рекомендациями App Transport Security перед отправкой в App Store, так как требования могут меняться со временем.

Источники

  1. Apple Developer - Тонкая настройка параметров App Transport Security
  2. Stack Overflow - Transport security has blocked a cleartext HTTP
  3. Google for Developers - App Transport Security
  4. CocoaCasts - How To Add App Transport Security Exception Domains
  5. Corona Labs - Managing App Transport Security
  6. Apple Developer Documentation - NSExceptionDomains
  7. Hacking with Swift - How to handle the HTTPS requirements in iOS with App Transport Security