Обновление возможностей iPhone по сетевым изменениям

Изменить 23.5.11

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

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

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

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

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

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

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

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

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

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

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

Спасибо,

Крис.

Ответ 1

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

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

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

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

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

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

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

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