Обновление доступности iPhone при сетевых изменениях - PullRequest
10 голосов
/ 19 мая 2011

Редактировать 23.5.11

Теперь мне интересно, не закончил ли я эту разработку.Когда я использую онлайн-соединение, я правильно его обрабатываю - либо:

  • в фоновом режиме с индикатором прогресса или активности, а в случае его сбоя я отображаю подходящее сообщение ИЛИ

  • Я вызываю другое приложение, либо Safari, либо Maps, которое затем выполнит свою собственную проверку и завершится ошибкой, если нет соединения.Это оставляет пользователя в другом приложении, которое вышло из строя, но это не идеально.

Так что, если я сделаю то, что предлагаю ниже, и стандартные возвраты Reachability не будут достигнуты, и у меня тогдавыполнить NSURLConnection в случае, если радиостанции перешли в спящий режим, тогда я не уверен, что это лучше, чем просто попытаться получить онлайн-ресурс.

Если кто-то может помочь - ябыл бы очень благодарен.Я почти готов к отправке, просто нужно сделать это правильно.

Я использую образец Apple Reachability для общего хорошего эффекта, за исключением случаев, когда мобильное или сотовое соединение переходит в спящий режим и затем возвращаетсяили Wi-Fi идет, и сотовая связь тогда полагается.

Это хорошо, когда мобильное (сотовое) соединение не изменяется.Это соответствует комментариям, которые я прочитал, что, когда сотовая радиостанция выключается, вы должны снова разбудить ее вручную.Однако я не вижу, как это сделать.

Нужно ли устанавливать NSURLConnection?Некоторый пример кода был бы великолепен.Когда я получу уведомление об отсутствии соединения, я бы отправил NSURLConnection и попросил пользователя повторить попытку через мгновение, а затем, если я получу обратный вызов, чтобы сказать, что он успешен, переопределить настройку отключения из Reachability?

Кроме того, мне нужно было бы делать это всякий раз, когда кажется, что нет никакой связи, просто на случай, если это так - это кажется бесполезным расходом ресурсов, когда это вполне может быть не так.Например, iPod Touch, которого нет в Wi-Fi.

Я также рассмотрел альтернативу DDG , но, похоже, у него будет та же проблема.

Любойполезные предложения будут тепло приветствоваться.

Спасибо,

Крис.

1 Ответ

13 голосов
/ 24 мая 2011

Вы не можете и не должны использовать образец кода Apple Reachabilty (или SCNetworkReachabilityFlags), чтобы определить, доступен ли сетевой ресурс или будет доступен.Они дают вам полезные инструменты для обратной связи с пользователем о том, почему не удалось установить соединение, и для определения, следует ли и когда повторить попытку подключения.Однако, если вы хотите получить доступ к сетевому ресурсу, вам нужно просто попросить его.

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

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

См. https://devforums.apple.com/message/409618

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

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

Также взгляните на этоВопрос о проверке ресурса перед его загрузкой с использованием внешнего приложения: https://devforums.apple.com/message/411329

Выполнение запроса HEAD на ресурс должно дать вам разумное представление о том, сможет ли внешнее приложение загрузить его, не требуя от васзагрузить значительный объем данных (задержка все равно будет проблемой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...