Как выбрать конкретный сетевой интерфейс для соединений NSURLSession?

Я не говорю о достижимости.

Я говорю о том, как создать сетевое соединение с устройства iOS через сотовый интерфейс.

Почему? Потому что у меня есть условия, когда устройство подключается к точке доступа Wi-Fi, поэтому оно выбирает Wi-Fi ... но эта точка доступа не подключена к Интернету и никуда не денется. У меня есть данные, которые я должен приложить все усилия, чтобы доставить, и в некоторых случаях они теряются в шлюзе Wi-Fi в чистилище. В обоих случаях использования Reachability и использования MPTCP Apple уже отдала приоритет WiFi в стеке.

Я знаю, что NSURLSessionConfiguration может установить allowsCellularAccess на разрешить сотовый доступ - я хочу потребовать сотовую связь для маршрутизации.

Даже на уровне CFNetwork я смотрю kCFStreamPropertyConnectionIsCellular на статус, kCFStreamPropertyNoCellular для отключения сотовой связи.

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

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

Кто-нибудь успешно создал сетевое соединение через сотовую связь, несмотря на присутствие Wi-Fi?

Есть ли здесь какая-то конфигурация Multipath TCP?


person Thompsonian    schedule 23.01.2017    source источник


Ответы (2)


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

Вы наблюдаете известную проблему с iOS и отключенными сетями. iOS 9 и более поздние версии работают лучше, но даже тогда они могут быть очень проблематичными; устройства иногда отказываются разговаривать с сетью Wi-Fi, а иногда отказываются разговаривать с сотовой сетью. В частности, если какой-либо из сигналов слабый, кажется, что он совершенно не работает. Буквально сегодня утром мне пришлось заставить свой iPhone (iOS 10) подключиться к отключенной сети Wi-Fi, переведя его в режим полета и включив только Wi-Fi.

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

В противном случае, при условии, что вам не нужно поддерживать веб-браузеры в iOS 3 и более ранних версиях, вы можете попробовать полностью удалить DHCP-сервер в этой сети Wi-Fi и просто полагаться на обнаружение службы DNS с IP-адресами с нулевой конфигурацией. Таким образом, устройство не увидит маршрутизатор и не будет пытаться отправлять данные через этот интерфейс, за исключением этих локальных IP-адресов.

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

person dgatwood    schedule 23.01.2017
comment
Хорошая информация - несмотря на плохие новости. В моем конкретном случае сигнал WiFi сильный и требуется для объявления SSID. Существуют также условия, которые требуют блокировки исходящей стороны точки доступа, создавая этот вакуум полосы пропускания - когда эти условия удаляются, точка доступа снова открывается для доступа в Интернет. Я слышал, что «WiFi Assist» помогает в этом. Возможно, измененная конфигурация NSURLSessionConfiguration для снижения пороговых значений тайм-аута может привести к более быстрому переключению на сотовую «помощь». - person Thompsonian; 23.01.2017

В iOS 12 и новее вы можете использовать Network Framework. Образец кода находится здесь.

person EricS    schedule 19.11.2018