Вопрос по nsurlconnection, reachability, ios, objective-c, iphone – Как использовать iOS Reachability

33

Я разрабатываю приложение для iPhone, которое использует сеть. IPhone связывается с моим сервером через HTTP-запрос и должен работать по WiFi и 3G.
Я сейчас пользуюсьNSURLConnection initWithRequest отправлять асинхронные запросы на мой сервер и получать ответы (но я скоро перейду к работе сASIHTTPRequest библиотека)

Я понял, что с такими приложениями (приложениями, требующими подключения к Интернету) я должен (должен?) Использовать Reachability.

После поиска в Интернете и просмотра кода примера Apple Reachability я все еще не понимаю некоторые основные вещи:

What is the main purposes of Reachability?

В примере с яблоком они обнаруживают сетевые проблемы с хостом, Wi-Fi и 3G и предоставляют пользователю соответствующее сообщение.
Является ли это основной целью Reachability, чтобы показать пользователю сообщение? Или мне нужно использовать его для других более практичных сценариев? Например, еслиNSURLConnaction запрос не прошел, нужно ли как-то использовать Reachability для повторной отправки запроса?

What is the proper use of Reachability?

Распространено ли использовать толькоone случай, когда приложение запускается, а затем прослушивает изменения в сети? Или я должен проверять состояние доступности перед каждым сетевым запросом?
Достаточно ли использоватьreachabilityWithHostName или мне тоже нужноreachabilityForLocalWiFi а такжеreachabilityForInternetConnection?

One more thingЯ понял, что Apple может отклонять приложения, которые используют сеть и не используют Reachability.
Что такое & quot;must& Quot; методы, которые я должен реализовать?
Будет ли достаточно просто уведомить пользователя о том, что в данный момент нет интернета?

Ваш Ответ

3   ответа
0

доступен ли Интернет или нет. Он говорит вам, есть ли у вас доступ через WiFi, или у вас есть доступ только через мобильные данные. Нет никаких гарантий, что это правильно. Если он говорит, что у вас есть соединение WiFi, это соединение может быть потеряно через одну секунду. Единственный способ выяснить, будет ли работать доступ к URL-адресу, - это сделать такой доступ и посмотреть, что произойдет. Существуют ситуации, когда доступ будет работать, когда Reachability заявляет, что это не так, и наоборот.

Вот для чего я использую Reachibility: после неудачных загрузок из-за отсутствия подключения к Интернету я начну повторять попытку, когда Reachability обнаружит изменение (на самом деле несколько секунд спустя; доступ по URL часто прекращается сразу после того, как Reachability сообщает, что WiFi возвращается). После неудачной загрузки, когда мобильные данные были запрещены, проверьте, доступны ли мобильные данные, и попросите пользователя разрешить использование мобильных данных.

47

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

What is the main purposes of Reachability?

Reachability is used to query the network status and to register your listeners to get informed when connectivity changes

Is this the main purpose of Reachability, to show the user a message?

Нет, конечно, его основное использование - либо для проверки наличия подключения к Интернету, либо для получения уведомлений об изменении подключения

For example if NSURLConnaction request has failed do I need to use Reachability somehow to resend the request?

Да, вы можете использовать его, например, что я обычно делаю в своем проекте, чтобы сохранить все запросы, которые были сделаны на удаленном сервере, скажем, я хочу загрузить 10 файлов,

Когда какой-либо файл не проходит процесс загрузки из-за отсутствия подключения к Интернету, я сохраняю их в массив неудачных загрузок,

Когда функция доступности сообщает мне, что интернет-соединение восстановлено, я перебираю этот массив и снова запускаю процесс загрузки.

What is the proper use of Reachability?

Это зависит от ваших моделей и потребностей.

Is it common to use only one instance when app launch, and then listen to network changes?

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

Or should I check myself the reachability status before every network request?

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

Is it enough to use reachabilityWithHostName or do I need also reachabilityForLocalWiFi and reachabilityForInternetConnection?

Не уверен насчет этого, но обычно я проверяю подключение всеми средствами, я не делаю различий между 3G и Wi-Fi, однако есть некоторые реализации, которые эта информация (Wi-Fi или 3G) может быть полезна

Спасибо за ваш ответ, пожалуйста, проверьте & quot; еще одну вещь & quot; что я добавил к вопросу Eyal
Вы сказали, что одной из основных целей достижимости является «регистрация ваших слушателей для получения информации об изменениях подключения», но он не дает обратный вызов каждый раз (попробуйте переключить маршрутизаторы и проверить).
Я совершенно не знаю об этом, у меня есть 5+ приложений в магазине приложений, все они используют Reachability, я использовал достижимость, как описано выше в ответе, поэтому я не знаю, что должно быть реализовано, я обычно реализую то, что мне нужно
12

достижимость это пример проекта, который сделал Apple. Люди используют это как API поверх инфраструктуры SystemConfiguration. Как вы уже видели, существуют способы проверки доступности хоста и т. Д.

Я использую проект Reachabilty, когда создал класс с методом класса, который возвращает логическое значение, если хост, с которого я запрашиваю данные, доступен. Если это так, метод возвращаетYES а если нет, то возвращаетсяNO (Очевидно).

Теперь в приложении, где я использую соединения, вам нужно / нужно проверить, возможно ли установить соединение, как указано в документации Apple. У меня простойif и затем показать соответствующее предупреждающее сообщение о том, что запрос не может быть завершен в данный момент.

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

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

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

Не забудьте включитьSystemConfiguration фреймворк.

Да, это одно из возможных решений. Вы зарегистрируете делегата приложения в качестве получателя этих уведомлений и обновите переменную (и) при получении одного из уведомлений. Тогда, по вашему мнению, контроллеры вы можете сделать этоMyAppDelegate* myAppDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate] чтобы получить доступ к вашим переменным.
Спасибо за ваш ответ, при проверке доступности хоста перед каждым сетевым запросом, это добавит накладные расходы к каждому запросу? Eyal
Да, но это должно быть минимальным. Я не заметил каких-либо заметных накладных расходов на это. На вопросы, которые вы добавили, я уже ответил на них, я думаю. Не стесняйтесь спрашивать, если что-то все еще неясно :)
Поэтому скажите мне, если я правильно понимаю, чтобы получить тот же результат, но с уведомлениями, я сохраню некоторое глобальное логическое значение "HostIsAvailable", это логическое значение будет обновляться при получении уведомлений о доступности, а затем перед каждым сетевым запросом я буду проверьте, ДА, если нет, я покажу пользователю сообщение с предупреждением. Eyal

Похожие вопросы