Как заставить приложение iOS использовать 3G вместо WiFi?
Я хочу использовать протокол обмена сообщениями, который отлично работает через 3G, но не через некоторые корпоративные брандмауэры. Как мое приложение может принудительно использовать сотовую сеть, если оно не может подключиться через WiFi, даже если сеть WiFi доступна?
РЕДАКТИРОВАТЬ: После прочтения реализации класса Reachability я не уверен, действительно ли оба они взаимоисключающие. Вполне возможно, можно обнаружить оба интерфейса через gethostbyname()
что я мог бы попытаться просто посмотреть, что выходит.
3 ответа
Используйте getifaddrs для перечисления сетевых интерфейсов. Найдите ifa_name, которое начинается с "pdp". Это будет сотовый интерфейс (например, pdp_ip0). Проверьте (ifa_flags & IFF_UP), чтобы убедиться, что интерфейс работает, и получите IP-адрес от ifa_addr. Затем используйте bind() для привязки вашего сокета к этому адресу.
Не уверен, как вы активируете сотовый интерфейс, если он еще не подключен. Обычно я просто выполняю http-вызов высокого уровня, чтобы заставить iOS пробудить сеть, но не уверен, при каких условиях услуга сотовой связи становится активной, когда также доступен Wi-Fi. Я подозреваю, что это обычно там, как запасной вариант к Wi-Fi.
Вы можете использовать любую библиотеку сокетов, чтобы заставить использовать сотовую связь. Найдите интерфейс сотовой связи от getifaddrs, передайте интерфейс функции сокета, привязка сокета произойдет с сотовой связью. например, CocoaAsyncSocket
http://iphonedevsdk.com/discussion/comment/120957
Судя по внешнему виду этой темы, это кажется невозможным. Лучше всего попытаться использовать протокол и сказать что-то вроде "пожалуйста, отключитесь от Wi-Fi и повторите попытку", если он не работает.
Эта тема говорит примерно об одном и том же:
как программно запустить 3g соединение на iphone?
Вы можете использовать класс Reachability, который написал Apple, чтобы проверить, подключено ли в данный момент сетевое соединение через 3G или WiFi, и даже проверить, доступен ли конкретный ресурс в сети.