Как определить, какой URL-адрес блокируется App Transport Security?

Я обновляю приложение iOS до iOS 9, и у меня есть некоторые небезопасные URL-адреса, и мне нужно несколько исключений для безопасности транспорта приложений. Я добавил два, о которых я знаю, но теперь есть некоторые предупреждения, в которых говорится:

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

Мне нужно знать, какие URL-адреса блокируются, чтобы я мог добавить их в Info.plist, возможно, это изображения или медиафайлы. Как я могу заставить систему регистрировать URL-адреса, которые она решила не загружать?


person Micah Hainline    schedule 02.07.2015    source источник


Ответы (2)


Примечание редактора: @jessedc указывает в комментариях под ссылкой на официальную документацию Apple о том, как это сделать: https://developer.apple.com/library/content/qa/qa1887/_index.html

Хорошо, у меня есть ответ, который мне не нравится! Я все еще очень хочу лучшего.

В моем методе application:didFinishLaunchingWithOptions: я добавил строку

setenv("CFNETWORK_DIAGNOSTICS", "3", 1);

Когда я запустил приложение, в журнале я могу найти запись, которая выглядит так:

2015-07-02 15:27:56.152 MyApp[45041:9125662] CFNetwork diagnostics log file
created at: /Users/micah.hainline/Library/Developer/CoreSimulator/Devices/
11BCA581-5F5F-494D-932A-2ECFCA33EA93/data/Containers/Data/Application/
9ACC6941-8039-4B86-B5E8-A6C66E2AD520/Library/Logs/CrashReporter/CFNetwork_com
.myapp.MyApp_45041.nwlrb.log

Когда я открываю этот файл, у меня появляется огромное количество записей в журнале обо всем, что происходит в сети. Я ищу kCFErrorDomainCFNetwork в этом файле и получаю журналы неудачных сетевых запросов. Я могу использовать это, чтобы увидеть, какие URL-адреса пыталась использовать система, а затем добавить этот URL-адрес в исключения для App Transport Security.

person Micah Hainline    schedule 02.07.2015
comment
плюнь за творчество, если не за что, ха-ха :) - person Max von Hippel; 07.07.2015
comment
Разве вы не получаете обратные вызовы об ошибках, когда ваше URL-соединение или задача данных завершаются с ошибкой? Если это так, IIRC, в объекте NSError есть информация, которая сообщает вам, почему он был отклонен, в том числе, произошел ли сбой из-за HSTS. - person dgatwood; 24.08.2015
comment
Спасибо за это решение. Я бы хотел, чтобы Apple каким-то образом позволяла нам устанавливать точку останова каждый раз, когда это происходит. - person bugloaf; 11.09.2015
comment
Этот ответ на самом деле является задокументированным способом сделать это: developer.apple.com /library/mac/qa/qa1887/_index.html Предлагаю добавить источник в ответ - person Jessedc; 28.09.2015
comment
Обычно предпочтительнее устанавливать переменные среды через схему. developer.apple.com/library/mac/recipes/ - person quellish; 28.09.2015
comment
когда я попробовал это, путь к файлу, который он мне выдал, не существовал. Он говорит, что выводит в /private/var/mobile/...long path name..., но каталог mobile на самом деле не существует - person chiliNUT; 07.10.2015
comment
@chiliNUT это потому, что вы отлаживаете свое мобильное устройство. В этом случае журналы также находятся на вашем устройстве. Просто извлеките контейнер приложения через Xcode и получите журналы из папки /AppData/Library/Logs/CrashReporter. Это подробно описано в конце раздела «Вопросы и ответы по ведению журнала диагностики CFNetwork». - person Alexander Dvornikov; 22.10.2015
comment
Вам даже не нужно извлекать его из вашего устройства. Если вы откроете Xcode->Devices и выберете свое устройство, выходные данные консоли будут содержать сообщения CFNetwork, которые она записывает в файл. - person Ian MacDonald; 23.06.2016
comment
Могу ли я использовать это только на симуляторе? - person KarenAnne; 20.03.2017
comment
@KarenAnne ты получила ответ? - person nr5; 13.09.2017
comment
В настоящее время вы можете редактировать схему, а в разделе «Аргументы» вы можете добавить CFNETWORK_DIAGNOSTICS и 3 к переменным среды. При этом расширенные журналы выводятся в основную консоль Xcode, что довольно удобно. - person Alper; 19.06.2018

Принятый ответ правильный, но если вы делаете это на Xamarin iOS, вам нужно будет использовать;

Environment.SetEnvironmentVariable("CFNETWORK_DIAGNOSTICS", "3", EnvironmentVariableTarget.Process);

Кроме того, если вы ищете файл журнала, используйте что-то вроде диспетчера симуляторов, чтобы легче было найти правильное местоположение (https://github.com/tue-savvy/SimulatorManager).

person PaulB    schedule 01.03.2017
comment
PaulB это только для симулятора? - person nr5; 13.09.2017