Безопасный и надежный способ включить конфигурацию NSAppTransportSecurity for Release и отключить ее для конфигураций Debug/Staging?

Вопрос говорит обо всем.

Я в курсе NSAllowsArbitraryLoads это можно взять вместе NSExceptionDomains но я немного сбит с толку этим черным списком: я не хочу отключать ATS для всего, кроме определенных рабочих хостов, перечисленных NSExceptionDomains потому что они могут быть изменены, и поэтому мне нужно будет управлять их списком вместе с общей конфигурацией приложения, где у нас есть 3+ разных типов хостов для производства. [Конечно, в идеальном мире Apple предложила бы нам перечислить хосты, для которых мы хотим отключить App Transport Security, и включить его для всех остальных хостов - нет! наоборот]

Я также пытался унаследовать мой пользовательский параметр $(MY_USER_SETTING) (который может поддерживать 3 различных значения, соответствующих Debug/Staging/Release), но он не очень хорошо работает с нестроковыми типами NSAppTransportSecurity который является словарем и NSAllowsArbitraryLoads логическое значение - эти значения просто не наследуют мои пользовательские настройки.

Предыстория: я хочу видеть HTTP-трафик наших конфигураций Debug / Staging с использованием Charles Proxy, а начиная с iOS 9 требуется отключить ATS, и я хочу убедиться, что это никак не повлияет на нашу конфигурацию Release!

2 ответа

Решение

В отличие от того, что можно подумать (один из примеров: РАБОТА С ТРАНСПОРТНОЙ БЕЗОПАСНОСТЬЮ APPLE APPLE) NSAllowsArbitraryLoads НЕ работает как флаг, который переключается между режимами черного / белого списков, по крайней мере, он не очень хорошо работает с Чарльзом:

Подход "черного списка" (НЕ РАБОТАЕТ ДЛЯ МЕНЯ В IOS 9.0 - Чарльз не распознает трафик с / на промежуточный хост):

Пример B: ATS для всех, с некоторыми исключениями

Если вы ожидаете, что все ваши домены будут работать с ATS, за исключением тех, которые, как вы знаете, не будут работать, вы можете указать исключения для случаев, когда не следует использовать ATS, оставив при этом включенным весь остальной трафик. Для этого сценария вам понадобится использовать NSExceptionDomains для указания доменов, для которых вы хотите переопределить настройки ATS по умолчанию.

Подход на основе белого списка (РАБОТАЕТ, но не очень хороший способ сделать это): Если NSAllowsArbitraryLoads установлен в YES тогда функция Application Transport Security отключена для всех доменов, кроме тех, которые перечислены в NSExceptionDomains,

Пример C: ATS отключен, за некоторыми исключениями

И наоборот, вы можете захотеть, чтобы ATS работал только на тех доменах, которые, как вы знаете, могут его поддерживать. Например, если вы разрабатываете клиент для Twitter, вы можете захотеть загрузить бесчисленные URL-адреса, которые могут не поддерживать ATS, хотя вам могут потребоваться такие вещи, как входящие вызовы и другие запросы в Twitter для использования ATS. В этом случае вы можете отключить ATS по умолчанию, а затем указать URL-адрес, который вы хотите использовать ATS.


Другой подход, описанный здесь: Этот странный трюк упрощает разработку приложений для iOS на локальном сервере. Он предлагает добавить этап запуска сценария сборки, который использует PlistBuddy для исправления файла plist приложения на лету. Вот их пример того, как заставить приложение не использовать ATS, когда разработчик работает с сервером на своей локальной машине (конечно, это может быть и промежуточный хост):

/usr/libexec/PlistBuddy -c "Add :NSAppTransportSecurity:NSExceptionDomains:$LOCAL_NETWORK_NAME:NSIncludesSubdomains bool true" $INFO_PLIST
/usr/libexec/PlistBuddy -c "Add :NSAppTransportSecurity:NSExceptionDomains:$LOCAL_NETWORK_NAME:NSThirdPartyExceptionAllowsInsecureHTTPLoads bool true" $INFO_PLIST

IMO, исправление Plist - лучший способ условно отключить ATS для размещения хостов, чем использование описанного выше подхода с использованием белого списка, поэтому мы будем придерживаться PlistBuddy.

Я думаю, что у вас есть ответ прямо здесь. ATS включен по умолчанию для всех хостов. Если вы отключите его только для промежуточных хостов, это не затронет ваши конечные точки производства. То есть просто добавьте свой промежуточный домен к доменам исключений и все. Или я неправильно понял специфику вашего вопроса?

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