Я знаю, что этот вопрос окажется обманом для многих других, однако я не чувствую, что простой случай хорошо объяснен здесь. Исходя из Android и BlackBerry, отправка запросов HTTPUrlConnection
мгновенно завершается сбоем, если нет доступного соединения. Это кажется совершенно вменяемым поведением, и я был удивлен, обнаружив, что NSURLConnection
в iOS не эмулируется.
Я понимаю, что Apple (и другие, кто ее расширил) предоставляют Reachability
класс для определения состояния сети. Я был счастлив сначала увидеть это и полностью ожидал увидеть что-то подобное bool isNetworkAvailable()
, но вместо этого к своему удивлению я обнаружил сложную систему, требующую регистрации уведомлений и обратных вызовов, и кучу, казалось бы, ненужных деталей. Должен быть лучший способ.
Мое приложение уже корректно обрабатывает сбои подключения, включая отсутствие подключения. Пользователь уведомляется о сбое, и приложение продолжает работу.
Таким образом, мои требования просты: одна синхронная функция, которую я могу вызвать перед всеми HTTP-запросами, чтобы определить, стоит ли мне беспокоиться об отправке запроса или нет. В идеале он не требует настройки и просто возвращает логическое значение.
Это действительно невозможно на iOS?
источник
Ответы:
Я провел немного больше исследований и обновляю свой ответ более актуальным решением. Я не уверен, что вы уже посмотрели его, но есть хороший пример кода, предоставленный Apple.
Загрузите образец кода здесь
Включите файлы Reachability.h и Reachability.m в свой проект. Взгляните на ReachabilityAppDelegate.m, чтобы увидеть пример того, как определить достижимость хоста, доступность по WiFi, по WWAN и т. Д. Для очень простой проверки доступности сети вы можете сделать что-то вроде этого
@ BenjaminPiette's: не забудьте добавить SystemConfiguration.framework в ваш проект.
источник
Видя, что эта тема является лучшим результатом Google для такого типа вопросов, я решил, что предоставлю решение, которое сработало для меня. Я уже использовал AFNetworking , но поиск не показал, как выполнить эту задачу с AFNetworking, до середины моего проекта.
То, что вы хотите, это AFNetworkingReachabilityManager .
Вы также можете использовать следующее для синхронного тестирования достижимости (после начала мониторинга):
источник
AFNetworkReachabilityManager
освещение!AFNetworkReachabilityManager.reachable
НЕ выполняет никакой синхронной проверки. Возвращает логическое или изreachableViaWWAN
иreachableViaWifi
.Извините за ответ слишком поздно, но я надеюсь, что этот ответ может помочь кому-то в будущем.
Ниже приведен небольшой фрагмент кода C, который может проверить подключение к Интернету без каких-либо дополнительных занятий.
Добавьте следующие заголовки:
Код:
Swift 3
источник
В настоящее время я использую этот простой синхронный метод, который не требует дополнительных файлов в ваших проектах или делегатах.
Импортировать:
Создайте этот метод:
Затем, если вы положили это в
MyNetworkClass
:Если вы тестируете в симуляторе, включите и выключите Wi-Fi на вашем Mac, так как кажется, что симулятор проигнорирует настройки телефона.
Обновить:
В конце я использовал поток / асинхронный обратный вызов, чтобы избежать блокировки основного потока; и регулярно повторять тестирование, чтобы я мог использовать кэшированный результат - хотя вы должны избегать ненужного открытия соединений с данными.
Как описал @thunk, есть лучшие URL-адреса для использования, которые используют сами Apple. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network
источник
www.apple.com
большой сайт ... лучший вариант будетwww.google.com
www.appleiphonecell.com
предположительно, доступен исключительно для этой цели и явно не заблокирован в Китае.Это возможно, и это действительно просто, если вы посмотрите на это после завершения реализации, что опять-таки очень просто, поскольку вам нужны только две логические переменные: достижимость интернета и доступность хоста (вам часто требуется более одной из этих ). После того, как вы соберете свой вспомогательный класс, который может определять состояние соединений, вам больше не нужно заботиться о реализации, необходимой для знания этих процедур.
Пример:
И файл .m:
источник
Кто - то уже решил эту проблему в простой, многоразовые образом раньше.
DDGReachability
,РЕДАКТИРОВАТЬ: или
tonymillion/Reachability
.источник
Я извлек код и поместил в один метод, надеюсь, он поможет другим.
...
источник
Я пишу быструю версию принятого ответа здесь , если кто-то найдет его полезным, код написан быстро 2,
Вы можете скачать необходимые файлы из SampleCode
Добавить
Reachability.h
иReachability.m
подать в ваш проект,Теперь нужно создать
Bridging-Header.h
файл, если его нет для вашего проекта,Внутри вашего
Bridging-Header.h
файла добавьте эту строку:Теперь для того, чтобы проверить подключение к Интернету
источник
Я думаю, что это может помочь ..
источник
Вы также можете попробовать это, если вы уже настроили AFNetworking в своем проекте.
источник
Вот хорошее решение для проверки подключения с использованием Swift, без использования Reachability. Я нашел это в этом блоге .
Создайте новый файл Swift в вашем проекте с именем
Network.swift
(например). Вставьте этот код в этот файл:Затем вы можете проверить подключение в любом месте вашего проекта, используя:
источник
РЕДАКТИРОВАТЬ: Это не будет работать для сетевых URL-адресов (см. Комментарии)
Начиная с iOS 5, существует новый метод экземпляра NSURL:
Направьте его на интересующий вас сайт или укажите на apple.com; Я думаю, что это новый однострочный звонок, чтобы увидеть, работает ли интернет на вашем устройстве.
источник
Я также не был доволен доступными опциями проверки интернета (почему это не нативный API?!?!)
Моя собственная проблема была со 100% потерей пакетов - когда устройство подключено к маршрутизатору, но маршрутизатор не подключен к Интернету. Достижимость и другие будут зависать целую вечность. Я создал вспомогательный одноэлементный класс, чтобы справиться с этим, добавив время ожидания асинхронности. Это прекрасно работает в моем приложении. Надеюсь, поможет. Вот ссылка на github:
https://github.com/fareast555/TFInternetChecker
источник
Проверка доступности интернет-соединения в (iOS) Xcode 8.2, Swift 3.0
источник
Замена Reachability от Apple переписана в Swift с замыканиями , вдохновленными tonymillion: https://github.com/ashleymills/Reachability.swift
Перетащите файл
Reachability.swift
в ваш проект. В качестве альтернативы используйте CocoaPods или Carthage - см. Раздел « Установка » README проекта.Получать уведомления о подключении к сети:
и для остановки уведомлений
источник
Alamofire
Если вы уже используете Alamofire для всех RESTful Api, вот что вы можете извлечь из этого.
Вы можете добавить следующий класс в свое приложение и вызвать,
MNNetworkUtils.main.isConnected()
чтобы получить логическое значение, независимо от того, подключено оно или нет.Это синглтон-класс. Каждый раз, когда пользователь подключается или отключается от сети, он
self.reachable
корректно переопределяет значение true / false, потому что мы начинаем прослушиватьNetworkReachabilityManager
инициализацию on singleton.Также для мониторинга достижимости вам нужно предоставить хост, в настоящее время я использую, не
google.com
стесняйтесь, переходить на любые другие хосты или один из ваших, если это необходимо.источник