#iphone #app-store #nsurlconnection #reachability
#iPhone #app-store #nsurlconnection #доступность
Вопрос:
Редактировать 23.5.11
Теперь я задаюсь вопросом, не переборщил ли я с разработкой этого. Когда я использую онлайн-соединение, я обрабатываю его должным образом — либо:
-
в фоновом режиме с отображением индикатора прогресса или активности, и если это не удается, я показываю подходящее сообщение или
-
Я вызываю другое приложение, либо Safari, либо Maps, которое затем выполнит собственную проверку и завершится сбоем, если соединение отсутствует. Это оставляет пользователя в том другом приложении, в котором произошел сбой, что, тем не менее, не идеально.
Итак, если я сделаю то, что предлагаю ниже, и стандартная доступность вернется недоступной, и мне тогда придется выполнить NSURLConnection на случай, если радиостанции перешли в спящий режим, тогда я не уверен, что это лучше, чем просто пытаться получить онлайн-ресурс в первую очередь.
Если кто-нибудь может помочь — я был бы очень благодарен. Я почти готов к отправке, просто нужно все сделать правильно.
Я использую образец доступности Apple, чтобы в целом добиться хорошего эффекта, за исключением случаев, когда мобильное или сотовое соединение переходит в спящий режим, а затем возвращается, или Wi-Fi отключается, и тогда полагаются на сотовое соединение.
Нормально, когда мобильное (сотовое) соединение не меняется. Это соответствует комментариям, которые я прочитал, о том, что когда сотовое радио выключается, вам приходится снова включать его вручную. Однако я не вижу, как это сделать.
Нужно ли мне настраивать NSURLConnection? Несколько примеров кода было бы здорово. Когда я получаю уведомление о том, что соединение отсутствует, могу ли я отправить NSURLConnection и сообщить пользователю повторить попытку через мгновение, а затем, если я получу обратный вызов с сообщением об успешном завершении, переопределить параметр off из Reachability?
Кроме того, нужно ли мне делать это всякий раз, когда кажется, что соединения нет, на всякий случай — это кажется расточительным расходованием ресурсов, когда вполне может быть и не так. e.g.an iPod Touch недоступен по Wi-Fi.
Я также рассмотрел альтернативу DDG, но, похоже, у нее будет та же проблема.
Любые полезные предложения будут горячо приветствоваться.
Спасибо,
Крис.
Ответ №1:
Вы не можете и не должны использовать пример кода доступности Apple (или флаги SCNetworkReachabilityFlags), чтобы определить, доступен или будет доступен сетевой ресурс. Они предоставляют вам полезные инструменты для предоставления пользователю обратной связи о причинах сбоя соединения и для определения, следует ли и когда повторить попытку подключения. Однако, если вы хотите получить доступ к сетевому ресурсу, вы должны просто попросить об этом.
Не отправляйте своим пользователям предупреждения «нет сетевого подключения» на основе флагов доступности. Выполните свой сетевой запрос, и если он завершится неудачей, проверьте флаги доступности и собственную историю запросов, чтобы узнать, следует ли сообщать пользователю о сбое запроса или повторить попытку молча. Вы не должны хотеть или нуждаться в рассылке спама пользователю при каждом сбое сети. В случае сбоя запроса рассмотрите возможность повторной попытки, если хост кажется доступным, и сообщите пользователю о сбое только после пары попыток или когда флаги доступности указывают на то, что вы действительно потеряли сетевое соединение, а не просто произошел сбой одного запроса.
Что касается повторной активации радиостанций устройства, вам нужно сбалансировать ваше желание попытаться получить доступ к сетевым ресурсам с возможностью отключения питания сетевых интерфейсов устройства для экономии энергии. Я не знаю, что пытается сделать ваше приложение, но я бы рекомендовал отключить питание устройства, а затем попытаться подключиться в ответ на запрос пользователя приложению о получении новых данных. Я не вижу случая, когда вы хотели бы повторно активировать радио только для того, чтобы дать пользователю подсказку о том, что какой-то сетевой ресурс может быть доступен, а может и нет в данный момент.
Смотрите https://devforums.apple.com/message/409618
Единственный способ узнать, доступен ли хост, — это попытаться подключиться к нему. Если это соединение не удается установить, вы можете использовать доступность для предоставления обратной связи пользователю и для управления механизмом повторных попыток, но использовать доступность для предварительной установки соединения — не очень хорошая идея.
Ключевая проблема здесь в том, что доступность использует локальную информацию для определения своих результатов. Это ничего не говорит о состоянии Интернета в целом. Возможно, исходный сервер не работает или любое количество ссылок между вами и исходным сервером не работает, и reachability с радостью сообщит, что он доступен. В этот момент вы попытаетесь подключиться, и соединение завершится ошибкой. Итак, вам все равно придется обрабатывать ошибку, что означает, что вы можете также не выполнять предполетную проверку и позволить вашей стандартной обработке ошибок охватить и этот случай.
Также взгляните на этот вопрос, касающийся проверки наличия ресурса перед его загрузкой с помощью внешнего приложения: https://devforums.apple.com/message/411329
Выполнение запроса HEAD для ресурса должно дать вам разумное представление о том, сможет ли внешнее приложение загрузить его, не требуя от вас загрузки значительного объема данных (хотя задержка по-прежнему будет вызывать беспокойство).
Комментарии:
1. Вау, Джона — хороший, ясный и подробный ответ. Вы где-нибудь преподаете?
2. Однако вы можете использовать код доступности, чтобы получать уведомления при изменении «статуса доступности».
3. Спасибо @Jonah — это отличный, окончательный ответ. Я думаю, что ваша ясность поможет многим людям, о чем свидетельствуют голоса, которые мы получили еще до того, как вы ответили. Сейчас я собираюсь значительно упростить свой процесс. Еще раз спасибо.
4. @Alexsander — да, вы можете, но я не уверен, насколько надежна эта информация.
5. @Alexsander, @Chris: Флаги доступности дают вам представление об устройстве, доступных сетях. Это отличный способ определить, что что-то изменилось в сетевых подключениях устройства, чтобы вы могли «Кажется, у меня все еще есть подключение к WWAN, я должен попытаться снова связаться с этим хостом» или «Кажется, я потерял все подключения, мне не стоит пытаться повторить попытку прямо сейчас». Однако этого недостаточно, чтобы позволить вам делать заявления типа «вы сможете загрузить новые данные сейчас». Единственный способ узнать, доступен ли хост, — это попытаться связаться с ним.