Сетевое программирование для iPhone
Аннотация
Обзорная статья о сетевом программировании под iPhone OS
Введение
iPhone OS включает в себя мощный набор сетевых фреймворков и библиотек, которые достались ей по наследству от Mac OS X, что позволяет разработчикам делать полноценные сетевые приложения. Несмотря на то, что iPhone OS многое объединяет с Mac OS X, iPhone OS была разработана, чтобы удовлетворять требованиям мобильного окружения, поэтому пользовательские потребности (и средства их реализации) слегка отличаются.
В данной статье будут рассмотрены самые начальные сведения о сетевых API, более подробно каждый из пунктов будет описан в следующих статьях серии.
Для начала взглянем на диаграмму сетевых возможностей iPhone OS.
Несложно видеть, что есть четыре подсистемы iPhone OS. Каждая вышестоящая основывается на тех, что «под ней», более простая, но, вместе с тем, и менее настраиваемая. Быстро глянем, что содержит каждая из них:
- Cocoa Touch. Состоит из UIKit и Foundation. Внутри Foundation находятся объектные обертки для строк, коллекций и общих классов. UIKit, в свою очередь, содержит инфраструктуру приложения, компоненты, занимается обработкой событий, самой высокоуровневой работой с сетью, отображением HTML и так далее.
- Media. Тут сидит некоторое количество библиотек для работы со звуком и видело: Quartz, Core Animation, OpenGL ES, Core Audio, OpenAL, Media Player. О них в отдельных статьях, сетевых возможностей там практически нет.
- Core Frameworks. Core Foundation (Коллекции, работа со строками). Core Location, CFNetwork, адресная книга, подсистема безопасности, SQLite, работа с XML.
- Core OS. UNIX, Standard I/O, POSIX threads, BSD sockets, сервисы Bonjour и DNS, управление электропитанием, Keychain API.
Получается, что работа с сетью возможна на трех уровнях. Но по-разному. Как именно?
- Foundation (уровень Cocoa Touch) — это библиотека, использующая Objective-C, которая предоставляет объектно-ориентрованные абстракции для различных API более низкого уровня.
- CFNetwork, в отличие от предыдущего уровня, использует С и позволяет приложению выполнять большое количество сетевых задач, таких как работа с BSD сокетами, работа с HTTP и FTP серверами, управление Bonjour сервисами.
- Core Foundation — это C-based фреймворк, который предоставляет (помимо других вещей) удобный методы создания, чтения, обновления или удаления URL ресурса.
- Наконец, BSD networking API предоставляет низкоуровневый доступ к сокетам на языке C, с которыми вы могли встречаться на других платформах.
Использование этих библиотек и фреймворков предоставляет вам прозрачный доступ к аппаратному обеспечению платформы. Вам не нужно выбирать что использовать, Wi-Fi или сотовую сеть, наиболее подходящий метод связи выбирается автоматически. Фреймворки и библиотеки стараются выбрать наилучший вариант передачи и переключаются между ними самостоятельно.
Доступные сетевые интерфейсы, через которые можно осуществлять сетевые взаимодействия:
- WiFi 802.11b/g
- Сотовая сеть (кроме iPod touch) — GPRS/EDGE/3G
- Bluetooth PAN — Personal Area Network. Используется в Game Kit API.
- VPN (VPN on demand)
Что касается доступных протоколов, то тут вариант только один, IPv4. IPv6 слишком ресурсоёмок и его реализация слишком тяжеловесная для текущего аппаратного обеспечения iPhone.
Сетевой стек в iPhone OS ориентирован на:
- Мобильность. iPhone гораздо более мобилен, чем самый мобильный Макинтош, поэтому уверенная работа в независимости от того, как переключается iPhone между Wi-Fi сетями или сотовой сетью является обязательным качеством сетевого стека в iPhone OS.
- Производительность. Чем быстрее и эффективнее мы примем или отправим данные в или из сети, тем меньше мы израсходуем батарею, которая очень ценна для такого мобильного устройства, как iPhone. Ещё одним немаловажным фактором в оптимизации производительности сетевых взаимодействий является то, что самый ресурсоёмкий процесс в мобильных устройствах Apple — это взаимодействие с сетью.
- Небольшое потребление энергии. Следствие предыдущего пункта. Высокоуровневые библиотеки и фреймворки написаны так, чтобы максимально использовать возможности TCP стека.
На чем писать? C или Objective-C?
Перед тем, как вы начёте писать свой сетевой код, вам нужно будет определиться со следующими вещами.
Выберите язык, на котором вы будете писать сетевой код. iPhone OS поддерживает сетевой код, написанный как на C, так и на Objective-C. Выбор зависит от того, где вы чувствуете себя наиболее комфортно или есть ли у вас существующий код из другой платформы
Хотите ли вы работать с сокетами напрямую или вы хотите взаимодействовать с ними через абстракции. iPhone OS предоставляет абстракции для получения отдельных файлов из URL, взаимодействия с HTTP или FTP севером. Для остального сетевого взаимодействия iPhone OS предоставляет поддержку сокетов.
Хотите ли вы использовать Bonjour для работы с сетевыми сервисами? Bonjour — это технология (и одноимённый программный модуль) Apple и представляющая собою протокол автоматического обнаружения сервисов (служб) без вовлечения пользователя в процесс настройки. Сервис может предоставлять программа запущенная на настольном компьютере или на другом iPhone, а ваше клиентское приложение может обнаруживать его и взаимодействовать с ним. Удобно использовать Bonjour для обмена файлами между iPhone приложением и настольным компьютером, удалённой печати с iPhone на принтер, который поддерживает Bonjour.
Выбираем подходящие технологии
Итак, мы определились с языком программирования, теперь давайте поймём какие фреймворки нам использовать в зависимости от целей.
Скачивание файлов с удалённых веб или файловых сервисов.
Core Foundation URL Access Utilities и NSURL Loading System, построенная на их основе предоставляют простую возможность получения файлов, находящихся на удалённом сервере.
- Core Foundation URL Access Utilities — API на С и часть CFNetwork. Подробная документация может быть найдена в Core Foundation URL Access Utilities Reference.
- NSURL Loading System — API на Objective-C и часть фреймворка Foundation. Базируется на Core Foundation URL Access Utilities и предоставляет собой его Objective-C реализацию. Подробная документация находится в NSURL Loading System Programming Guide.
Взаимодействие с веб и файловыми серверами при помощи HTTP и FTP потоков
Если вашему сетевому приложению необходимо взаимодействовать с веб или фтп севером и CFURL или NSURL вам не подходят, то вам необходимо воспользоваться возможностями CFHTTPStream и CFFTPStream API. Они предоставляют возможность гибкой работы с HTTP/FTP запросами, управление cookies и HTTP заголовками, чтением содержимого FTP папок и загрузка файлов по FTP. Чтобы познакомится с этим API поближе почитайте следующие документы:
Взаимодействие при помощи сокетов
Если вашему приложению необходим прямой доступ к сетевым сокетам, то iPhone OS предоставляет API в Core Foundation и BSD networking API. Использовать сетевые взаимодействия на уровне сокетов стоит только в том случае, если существующие высокоуровневые фреймворки по каким-то причинам вас не устраивают (вы хотите контролировать размер сетевого буфера, например).
Если у вас уже есть опыт программирования сетевых приложений в Mac OS X и вы хотели бы написать сетевое приложение для iPhone OS, вы можете использовать те же самые API с единственным отличием: CFNetwork — это отдельный фреймворк iPhone OS, а не часть Core Services. Это может внести изменения в систему сборки. Если вы решите использовать CFNetwork API для доступа к сокетам, то почитайте эти документы:
Если у вас есть сетевой код для другой платформы и вы хотели бы портировать его на iPhone OS или вы уже используете POSIX треды, то вы можете продолжать их использовать в iPhone OS. За подробностями можно обратиться к iPhone OS Manual Pages
Если вы пишете сетевое приложение с нуля и хотите получить доступ к сокетам напрямую, то лучше всего использовать фреймворк CFNetwork для упрощения программирования сетевой части приложения. Однако, если вы чувствуете себя комфортно с BSD сокетами, то эти API также доступны.
Регистрирование и обнаружение сетевых сервисов
Сетевые сервисы Bonjour, как упоминалось выше, удобны для взаимодействия двух iPhone, находящихся в пределах одной локальной сети, или же для взаимодействия вашей программы для iPhone с серверной частью на настольном компьютере пользователя (синхронизация или файловый обмен, например). В случае взаимодействия двух iPhone в пределах одной локальной сети вам необходимо на одном аппарате создать сетевой сервис (он будет сервером), а на другом попытаться обнаружить зарегистрированный сервис. Если же ваша программа под iPhone взаимодействует с настольным компьютером пользователя, то ей, скорее всего, просто нужно будет искать Bonjour-сервис, который зарегистрировала серверная часть на десктопе.
Чтобы использовать начать работу с сервисами Bonjour попробуйте CFNetServices (С) из фреймворка CFNetwork или NSNetServices (Objective-C) из фреймворка Foundation. Документация:
- NSNetServices and CFNetServices Programming Guide
- CFNetServices Reference
- NSNetService Class Reference