Специфичные для платформы сетевые технологии
Сети в iOS и OS X очень подобны, и большинство сетевых приложений требует минимального специфичного для платформы кода. Однако необходимо знать о нескольких небольших различиях.
На iOS можно использовать специфичный для платформы сетевой APIs, чтобы обработать аутентификацию для присоединенных сетей и определять потоки сети Voice over Internet Protocol (VoIP). Кроме того, сетевые приложения iOS, намного более вероятно, будут работать на многосетевых устройствах (обычно с сотовой связью и соединениями Wi-Fi), и должны должным образом очистить сетевые соединения, когда приложения будут помещены в фон.
Сетевая среда на OS X высоконастраиваема и расширяема. Платформа Конфигурации системы обеспечивает APIs для определения и установки текущей конфигурации сети. Кроме того, сетевые расширения ядра позволяют Вам расширить базовую сетевую инфраструктуру OS X путем добавления опций, таких как брандмауэр или VPN.
В этой главе описываются эти специфичные для платформы различия.
iOS Требует, чтобы Вы Обработали Фоновую обработку и Указали Сотовые Политики Использования
В этом разделе описываются сетевые технологии и методы, которые являются определенными для iOS, включая информацию о присоединенной сетевой поддержке, фоновой обработке и создании единственных Wi-Fi соединений.
Ограничьте сотовую связь, объединяющуюся в сеть правильно
Существует два способа препятствовать тому, чтобы соединения были отправлены по сотовой сети. Какой метод, который Вы используете, зависит от требований и целей Вашего приложения.
kSCNetworkReachabilityFlagsIsWWAN
флаг в SCNetworkReachability
API говорит Вам, какой интерфейс будет, вероятно, использоваться, если Ваше приложение соединится с указанным узлом. Однако этот флаг может вводить в заблуждение потому что:
Сигнал Wi-Fi мог исчезнуть после того, как Ваше приложение проверяет достижимость, но прежде чем это соединится.
Различные узлы могут быть достижимыми по различным интерфейсам. Вы не можете доверять проверке достижимости на один узел, чтобы быть допустимыми для различного узла (и Вы не можете доверять проверке достижимости на поддельный IP-адрес, такой как
0.0.0.0
).Различные IP-адреса для того же узла могут быть достижимыми по различным интерфейсам. Если удаленный узел имеет и IPv4 и адреса IPv6, iOS обычно пытается соединиться и с адресами одновременно, то использование, какой бы ни соединение было установлено сначала и отменяет другую попытку подключения. Если сотовая сеть пользователя обеспечивает IPv6, и сеть Wi-Fi пользователя не делает, соединение могло бы быть сделано или использованием сотовой связи или Wi-Fi, завися полностью, на котором сеть соединяется более быстро.
Если Ваше приложение должно строго избежать отправлять данные по сотовому соединению, Ваше приложение должно объявить что ограничение политики явно при создании соединения. При использовании достижимости консультативным способом (например, для предупреждения пользователя прежде, чем загрузить большой фильм по сотовой сети), необходимо также считать создание соединения с сотовой связью отключенным. Затем если связь прерывается, попросите у пользователя разрешения отправить данные по сотовой сети и попробовать еще раз без тех флагов.
На уровне Foundation можно использовать setAllowsCellularAccess:
метод на NSMutableURLRequest
указать, может ли запрос быть отправлен по сотовому соединению. Можно также использовать allowsCellularAccess
проверять текущую стоимость.
На уровне Core Foundation можно достигнуть той же вещи путем установки kCFStreamPropertyNoCellular
свойство прежде, чем открыть поток, полученный из CFSocketStream или APIs CFHTTPStream.
В более старых версиях iOS можно продолжать использовать kSCNetworkReachabilityFlagsIsWWAN
как максимальные усилия способ определить, будет ли трафик отправлен по сотовому соединению, но необходимо знать о его ограничениях.
Фоновая обработка дескриптора правильно
Ваше приложение может быть приостановлено, когда оно входит в фон, что означает, что оно больше не может обрабатывать сетевой трафик. В некоторых случаях, в то время как Ваше приложение приостановлено, существующие соединения могут даже закрыться. Для изучения методов для разрешения с фоновой обработкой считайте Сети и Многозадачность.
Зарегистрируйте сокеты VoIP правильно
NSInputStream
, NSOutputStream
, CFStream
, и NSURLConnection
APIs имеет встроенную поддержку коммуникации Передачи речи по протоколу IP (VoIP). Эта поддержка позволяет Вам регистрировать соединение TCP, как являющееся в целях VoIP так, чтобы, если Ваше приложение приостановлено, данные, поступающие в этот сокет, заставили Ваше приложение быть возобновленным.
Для получения дополнительной информации читайте Реализацию Приложения VoIP в Руководстве по программированию приложения для iOS.
Регистр для присоединенной сетевой поддержки
Присоединенная сеть является сетью Wi-Fi, не обеспечивающей доступ в Интернет, пока пользователь не выполняет некоторое действие, такое как вход в систему, указание платежа или согласие на условия. Присоединенные сети распространены в общественных местах, таковы как аэропорты и отели.
Когда пользователь присоединяется к присоединенной сети, Присоединенная Сетевая поддержка обычно обеспечивает веб-лист, позволяющий пользователю аутентифицировать с сетью. Если Ваше приложение регистрирует SSID присоединенной сети, однако, веб-лист подавлен, и пользователь может завершить аутентификацию в Вашем приложении.
Для получения дополнительной информации читайте Ссылку CaptiveNetwork.
OS X позволяет Вам внести изменения в масштабе всей системы
Следующие разделы объясняют, где узнать о работе с сетевыми интерфейсами в OS X и разработке сетевых расширений ядра, расширяющих сетевой стек.
Разработайте приложения настройки сети
Если Вы хотите изменить текущую конфигурацию сети в своем приложении пользовательского уровня, используйте платформу Конфигурации системы.
Для приобретения знаний об архитектуре Конфигурации системы считайте Инструкции по Программированию Конфигурации системы. Тогда считайте Ссылку Платформы Конфигурации системы для приобретения знаний о доступном APIs.
Если Ваше приложение в частности имеет дело с соединением с беспроводными сетями с Wi-Fi, можно использовать Базовую платформу WLAN. Для получения дополнительной информации читайте Ссылку Платформы CoreWLAN.
Разработайте сетевые расширения ядра
Если Вы хотите изменить или расширить сетевую инфраструктуру OS X — в целях, таких как реализация пользовательского брандмауэра, пользовательского VPN или системы управления пропускной способностью — Вы, возможно, должны записать расширение ядра (kext), который включает к сетевой подсистеме ядра. Эти расширения вызывают сетевыми расширениями ядра или NKEs.
Для изучения основных принципов записи kext считайте Темы Программирования Расширения ядра. Тогда считайте Сетевое Руководство по программированию Расширений ядра, чтобы изучить, как реализовать сеть kext.