Ответ 1
Вы не можете и не должны использовать образец примера Apple Reachabilty (или SCNetworkReachabilityFlags), чтобы определить, доступен или доступен сетевой ресурс. Они дают полезные инструменты для предоставления пользователям отзывов о том, почему соединение не удалось, и для определения того, когда и когда нужно повторить соединение. Однако, если вы хотите получить доступ к сетевому ресурсу, вы должны просто попросить его.
Не сообщайте своим пользователям предупреждения о "отсутствии сетевого подключения" на основе флагов достижимости. Выполните сетевой запрос, и если он не сработает, проверьте флаги достижимости и собственную историю запросов, чтобы узнать, не сообщите ли вы пользователю, что запрос не выполнен или не повторите попытку. Вы не должны или не должны спамить пользователя при каждом сбое сети. Если запрос не выполняется, попробуйте повторить попытку, если хост кажется доступным и сообщает только о неудаче пользователя после нескольких попыток или когда флаги достижимости предполагают, что вы действительно потеряли сетевое соединение, а не просто отказались от одного запроса.
Что касается реактивации радиоустройств устройства, вам необходимо сбалансировать ваше желание попытаться извлечь сетевые ресурсы, позволяя устройству отключать сетевые интерфейсы для экономии энергии. Я не знаю, что пытается сделать ваше приложение, но я бы рекомендовал отключить устройство, а затем попытаться подключиться в ответ на запрос пользователя на получение новых данных. Я не вижу случая, когда вы захотите повторно активировать радио, чтобы дать пользователю подсказку о том, что какой-то сетевой ресурс может или не может быть в настоящий момент доступен.
См. https://devforums.apple.com/message/409618
Единственный способ узнать, доступен ли хост, - это попытаться подключиться к нему. Если это соединение терпит неудачу, вы можете использовать доступность, чтобы обеспечить обратную связь с пользователем, а также управлять вашим механизмом повтора, но использование достижимости для предполетного соединения не является хорошей идеей.
Ключевой вопрос здесь заключается в том, что для достижения своих результатов доступность использует локальную информацию. Это ничего не говорит о состоянии более широкого Интернета. Исходный сервер может быть недоступен, или любое количество ссылок между вами и исходным сервером может быть недоступным, а доступность с радостью скажет, что он доступен. В этот момент вы попытаетесь подключиться, и соединение не удастся. Таким образом, вам все равно придется обрабатывать эту ошибку, а это значит, что вы также не можете выполнить предполетную проверку, и пусть ваша стандартная обработка ошибок также охватывает этот случай.
Также рассмотрите этот вопрос относительно проверки ресурса перед его загрузкой с помощью внешнего приложения: https://devforums.apple.com/message/411329
Выполнение запроса HEAD для ресурса должно дать вам разумную идею, если внешнее приложение сможет загрузить его, не требуя загрузки значительного количества данных (латентность все равно будет проблемой).