В чем преимущество использования Reachability? - PullRequest
26 голосов
/ 24 августа 2011

В чем преимущество использования Reachability над кодом ниже? Я чувствую, что в Reachability есть огромное количество кода, но если это будет лучше, я бы использовал это вместо этого.

NSString *connectionString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

if ([connectionString length] == 0) {

    //No connection

}

Теперь, если Google когда-нибудь отключится, это не сработает. Но буквально нет никаких шансов на это. Как вы думаете? Спасибо!

Ответы [ 5 ]

45 голосов
/ 24 августа 2011

Это на самом деле довольно хороший вопрос - настолько хороший, что я фактически использую его в интервью для разработчиков iOS, когда моя компания набирает:

Почему пример доступности Apple составляет сотни строк, когда вы можете просто использовать одну строку, чтобы проверить, реагирует ли URL-адрес?

Во-первых, достижимость сети на самом деле очень, очень сложна . Это гораздо больше, чем просто проверка URL. Подумайте о следующих примерах:

  • Пользователь подключен к сети 3G, но израсходовал свои данные, поэтому каждый запрос перенаправляет на сайт перевозчика.

  • Пользователь подключен к публичной сети Wi-Fi, которая требует аутентификация / логин, поэтому запрос перенаправляет на страницу входа в систему

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

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

Но это действительно только верхушка айсберга. Помимо этого, доступность делает намного больше - например, у меня может быть приложение, которое должно загружать много информации, скажем, на 50 МБ. Было бы плохой идеей просто загрузить 50 МБ данных, если пользователь подключен к сети 3G без их согласия - особенно если он в роуминге или на ограниченном тарифном плане. Так что Reachability также сообщит вам , какой тип соединения установлен пользователем: EDGE, 3G, WiFi и т. Д. (* Примечание: см. Примечание ниже, это, вероятно, не лучший совет).

ReadMe.txt внутри Reachability расскажет вам немного больше о том, что код может и не может делать.

К сожалению, в Интернете слишком много людей, которые не осознают, что существует множество повседневных сценариев, в которых initWithContentsOfURL будет возвращать действительный ответ, но у пользователя не будет подключения. [Подобные сообщения в блоге] [1] индексируются в Google, и люди предполагают, что это приемлемая замена: это не так!

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


Редактировать: Обязательно примите к сведению комментарии Стивена ниже. Он поднимает некоторые моменты, которые мой ответ не учел (т. Е. Горячие точки MiFi), и приводит веские доводы в пользу того, что достижимость не обязательно является вершиной кодирования небес, которой она кодируется. Во многих случаях разработчики будут модифицировать Reachability со своими собственными улучшениями и т. П.

29 голосов
/ 24 августа 2011

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

Вот несколько рекомендаций по использованию Reachability:

  • Да, используйте Reachability. Возможно, наиболее очевидный момент: доступность может быть огромным преимуществом, чтобы сделать ваше приложение более естественным.
  • Никогда не используйте Reachability в качестве предварительной проверки. То, что Reachability сообщает о работе сети, не означаетдоступный в настоящее время не означает, что он не станет доступным , если вы попытаетесь использовать его .Тот сетевой запрос, который вы не отправляете, может быть тем самым, что пробуждает сеть iOS.
    • Редактировать: На самом деле, я, вероятно, должен немного смягчить это.Возможно, имеет смысл отложить незапрошенную операцию на короткое время.При прочих равных условиях лучше выполнять всю работу в сети непрерывно, а не включать и выключать оборудование повторно.Будьте бурными, если это возможно!Но вы должны никогда мешать пользователю делать что-либо на основе достижимости.
  • Использовать доступность, чтобы помочь диагностировать причину сбоя. После попыткизаниматься сетью, Reachability скажет вам, что сеть недоступна.Это ценная информация, которую вы можете использовать для создания правильного сообщения об ошибке, и, вероятно, она важнее точного кода ошибки, возвращенного API.
  • Разрешить пользователю повторить попытку вручную. пользователь может знать, что сеть должна работать с этого места.Не полагайтесь на то, что iOS заметит, что сеть теперь доступна, а Reachability информирует вас.Опять же, попытка может быть тем, что делает его доступным.
  • Используйте уведомление Reachability для автоматической повторной попытки. Когда Reachability сообщает, что сеть доступна, это потому, что она была доступна.Он может снова отключиться, прежде чем вы сможете завершить попытку, и это может быть сеть с ограничениями, но сейчас хороший момент, чтобы повторить запрос.

Такое поведение можно увидеть в Mobile Safari.Если страница не загружается, вы можете повторить попытку независимо от того, считает ли iPhone, что у вас есть соединение.Однако, если сеть становится доступной и Mobile Safari замечает, она попытается снова автоматически.Это кажется действительно естественным.

Запомните эти рекомендации:

  1. Мобильные сети не просты.
  2. Единственный верный способ определить, будет ли сетевое соединение Успешно - попробуйте и посмотрите, успешно ли оно 1049 *.
  3. Определение того, действительно ли сетевое соединение установлено, не всегда тривиально.

Есть несколько сессий WWDC 2011 о мобильных сетях, которые стоит посмотреть.(Есть несколько из 2010 года, которые также обращались к этому, и я уверен, что их будет несколько в WWDC 2012. Это не простая проблема, и она не уйдет.)

Также:initWithContentsOfURL синхронно.Не используйте синхронную сеть на iOS.Если это займет неожиданно много времени, ваше приложение будет остановлено сторожевым таймером iOS.

4 голосов
/ 24 августа 2011

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

3 голосов
/ 28 июля 2012

Все хорошие моменты. Я добавлю: рассмотреть возможность использования NSURLConnection. Он имеет протокол делегата, который информирует вас обо всех соответствующих событиях / инцидентах, которые происходят при попытке установить соединение. Это дает вам гораздо больше контроля, чем простой метод initWithCintentsOfURL, и позволяет выполнять асинхронную обработку. Но если вы используете его из многих классов, это может стать громоздким, чтобы реализовать все методы делегата много раз. Я обернул его в пользовательский класс только с двумя методами делегатов: didFail и didFinish , и повторно использовал этот класс во всем моем коде.

2 голосов
/ 24 августа 2011

Еще одна веская причина использовать Reachibility, в дополнение к замечательному ответу @ lxt, заключается в том, что если вы не выполняете должную осмотрительность в своем приложении для учета сценариев подключения, ваше приложение будет отклонено.Apple протестирует ваше приложение с подключением и без него, и в случае сбоя любого из этих сценариев ваше приложение даже не будет просматриваться.

Я полностью согласен с ответом lxt.Он дает вам гораздо больше подробностей о вашем подключении, чем просто «могу ли я подключиться к какому-либо веб-сайту».Отличный вопрос.

...