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

В вопросе сказано все.

Я знаю, что 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. !


person Stanislav Pankevich    schedule 23.10.2015    source источник
comment
Вы можете добавить фазу сборки для запуска скрипта, который редактирует plist в ваших отладочных сборках. См.: stackoverflow.com/questions /6912743/   -  person dan    schedule 23.10.2015


Ответы (2)


Вопреки тому, что можно подумать (один пример: РАБОТА С ПРИЛОЖЕНИЕМ APPLE TRANSPORT SECURITY) 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 против a Local Server Way Easier предлагает добавить этап сборки сценария запуска, который использует 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

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

person Stanislav Pankevich    schedule 23.10.2015

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

person cvursache    schedule 23.10.2015
comment
Что делать, если вы не хотите, чтобы ваш промежуточный домен был виден в пакете приложений, который вы публикуете в магазине? - person Vinzzz; 17.01.2018