Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 120, ДЕКАБРЬ 2008 г.

Поднимаем бабло с iPhone: ведение в коммерческий кодинг с помощью официального SDK

Олег Придюк




Правильный читатель еще в августе впечатлился статьей в ][ и сегодня уже вовсю толкает свои программы в Apple Store. Нет? Впечатлился, но не настолько? Или впечатлился, но не толкаешь? Ах да, мы же про официальный SDK почти ничего не рассказали. Простите, исправляемся!

Почему никто не сомневается в том факте, что писать «официальные» программы под айфон означает «получать бабло»? Ознакомимся с примером. Жил да был на свете перец с именем Стив Деметр (никогда, кстати, не замечал, что прогеры с именем «Стив» становятся суперуспешными?). Жил он себе, кодил понемногу, ну и накодил в результате очередной клон на тему тетриса, оценил его в скромные $5 и отправил в AppStore. Сидит он, стало быть, у разобранного системника, чай пьет, а ему тем временем приходит чек на $250 000 – мол, получите: вашу программу за два месяца скачала туева хуча людей, вот ваше бабло.

Мило? Вот именно! А как тебе нравятся заголовки в американских таблоидах (Wired, к примеру) –вроде «Кризис? Только не для iPhone-программеров!». И там, за океаном, и тут, ближе к Москве и Киеву, айфон-девелоперы в почете. Всем охота создать крутую программу и получить с нее огромное бабло. Ну что, теперь впечатлился? То-то же! Давай быстренько разнесем по полочкам все основные понятия и примемся за кодинг.

Основные понятия

Для тех, кто далек от истерии вокруг iPhone и не страдает фанатизмом по отношению к яблочной продукции, напомним, что сначала iPhone по фичам не дотягивал даже до статуса нормального телефона. После старта продаж летом 2007 года он представлял собой недоделанный телефон-плеер с качественным браузером, продавался только в США и только с привязкой к оператору. Со временем умные люди отучили его жаловаться оператору на чужую SIM-карту, научились писать и устанавливать программы и вообще, настраивать телефон под свои нужды.

Мучиться пришлось до мая 2008 года, пока сама Apple не предоставила собственный вариант SDK. Это было хорошо, да не очень. Фирменный набор для разработчика оказался жутко ограничен по фичам, кодерам запрещали делать все, что не документировано в официальных бумажках, создавать многопоточные приложения и даже реализовывать нормальный мультитаскинг. Самое важное яблококомпания оставила строго себе и даже запретила продвинутым проггерам выпускать толковые книжки про официальный SDK (круто, да?) Правда, в октябре передумала и пропустила на рынок первую книгу, о которой читай ниже. А еще она просматривает весь софт, который пишется с Apple SDK. То есть, допустим, ты сидел-писал, что-то прикольное вышло, отправляешь в AppStore, а тебе приходит оттуда ответ в духе: «поменьше читай журналы вроде ][, за такие проги вообще сажать за решетку пора, не пропустим». И ты начинаешь дорабатывать напильником свое творение, чтобы его приняли. Неприятно, но никто не обещал легкой жизни.

Создавай что-то простое, чтобы американцам захотелось отдать за твой кусок софта свой кровный бакс или даже парочку. В основном, в магазине прог для ифона все и стоит по $2-5, софтинки покруче - $10, а что-то совсем стоящее – уже по $30-50. На наш взгляд, $5 – предел для средней программки. Больше редко кто платит. Хотя нашлись индивиды (сложно их иначе назвать), которые догадались купить программу за один миллион долларов США. Программа почти ничего не делает, но называется «я богат». Ну, статусная вещь, вроде как. Правда, дальше не так весело. Дело в том, что фирменная студия разработки (Xcode) и сам iPhone SDK работают только на Mac’е. Если у тебя под столом имеется лишь коробка с логотипом Win, то придется ставить Хакинтош - адаптированную для PC версию Mac OS, или мучаться с VMWare. Оба этих варианта не гарантируют успеха.

Ах да, если у тебя нет Apple iPhone или iPod Touch, то придется одалживать его у соседа каждый раз, когда решишь выпустить новый билд своей программы. Фишка в том, что эмулятор не гарантирует работоспособность программы на реальном девайсе и даже не показывает ее реальную скорость работы – вычислительные способности твоего компа явно помощнее iPhone будут.

Иначе говоря, по-хорошему надо тестить под iPhone, iPhone 3G и iPod touch, но если подходить к делу с умом, и все обращения к железу аккуратно упаковывать с эксэпшнами, то можно обойтись и одним устройством. Дело в том, что в новом ифоне появился GPS, в старом его не было. В иподе старом нет ни сотовой связи, ни динамика, ни камеры, и если твоя великолепная программка обратится к несуществующей аппаратуре, у гаджета Apple случится паника. В лучшем случае подвиснет только твоя программа, в худшем – зависнет весь девайс. Даже на требование ребута он реагировать не станет, придется ресет делать. За такую шалость обиженный юзер около твоей программы нарисует гневный каммент с вытянутым средним пальцем и объяснит прохожим, что программу покупать не стоит.

В Сети бродят слухи, что для получения дозволения кодить под iPhone всем надо заплатить мзду в размере $99. Это не совсем так, кодить можно бесплатно, но вот за доступ к Apple Store придется забашлять. Ничего не поделаешь.

Итак, ты понял, что неофициальный SDK не позволит тебе получать за свои проги какие-то деньги и вообще размещать их в официальном магазине программ. На самом деле, так называемый iPhone toolchain - это просто туча нагенереных хедеров и руками прикрученный ARM-компилятор, а официальный SDK – это полноценный инструментарий, хоть и с ограниченным функционалом. Тулчейн не ограничивает тебя в твоих действиях, правда, не для всех действий он предлагает инструменты. Короче говоря, нет в жизни счастья, есть компромиссы. Так что, сделаем три глубоких вдоха-выдоха и приступим к осмотру Apple iPhone SDK.

Откуда берутся SDK и мануалы

Все доки, мануалы, Xcode и сам SDK качаются с developer.apple.com/iphone. Там выложена и пара видеоматериалов, где понятным английским рассказано, чем, где и куда надо кликать. Если по инглишу в школе было два балла, то просто посмотри двигающиеся картинки - они на самом деле помогают. Кроме того, на сайте есть примеры кода, на которых можно увидеть, что собой представляет язык Objective-C. Комментарии в коде достаточно слабые, они созданы не для того, чтобы помочь новичку, а чтобы человек просто мог понять, про что этот код. Значит, придется повозиться.

Что же касается мануалов и гайдов, то кроме россыпи специализированных форумов и чатов, тебе поможет фирменная яблочная документация с того же developer.apple.com/iphone. Она чем-то напоминает MSDN от Microsoft. Если этого покажется мало, глянь на бестселлер от Стивена Кочана – «Programming in Objective-C 2.0». Про интерфейс Cocoa лучшей считается книга Аарон Хиллегэз с названием «Cocoa Programming for Mac OS X».

По поводу специализированных книг по разработке именно для iPhone, можно глянуть на «The iPhone Developer's Cookbook: Building Applications with the iPhone SDK» от Эрики Сэдун, но она подойдет только достаточно опытным кодерам. Новички запутаются в слабо прокаменченых примерах, кусках кода и не разберутся в поучениях автора. Кстати, популярная «iPhone Open Application Development: Write Native Objective-C Applications for the iPhone» от Джонатана Здзярского рассказывает только про тулчейн, с официальным SDK она особо не поможет, поэтому не ошибись случайно. Из всей этой книги разве что пара моментов про Objective-C будет полезна.
В общем, когда разберешься в организации классов, ключевых словах и структуре программы, идея программы для iPhone перестанет казаться идиотской, а Xcode прекратит бесить. Apple позаботилась об огромном количестве функциональных библиотек и удобных обертках над функциями ядра. В самом начале этого тебе точно хватит. Когда потребуется нечто эдакое, на помощь придет любимый C++, который умеет обращаться напрямую к функциям ядра. Правда, связывать код на Objective-C и на C++ не так просто, придется немного поизвращаться.

Плюсы и минусы

Экран айфона – его главное преимущество и главный же недостаток. Преимущества – пользователю, недостатки – как водится, нам. Круто и интересно в визуальном редакторе создавать многооконный интерфейс, красивые переходы, кнопочки и прочее счастье. Но когда счастья становится слишком много, визуальный редактор форм начинает бесить своей услужливостью и автоматизацией, во множестве элементов начинаешь путаться, – да и вся эта анимация и настройки переходов тоже добавляют работы.

Кроме экрана, хлопот может доставить только очень капризный GPS и необходимость крайне аккуратного обращения к частным аппаратным возможностям. Дабы программа корректно работала на всех версиях iPod и iPhone, надо, чтобы она была в курсе, что можно трогать, а что нет. Это все придется прописать. А еще в мобильной Mac OS нет сборщика мусора, – следи за памятью сам, удаляй объекты, ищи лики, думай, где твоя прилага нагадила. Не кривись, в Symbian все еще сложнее и глупее реализовано.

Покодим!

Настало время реализации практической части. Итак, открываем Xcode, создаем проект, основанный на флип-окне. Где ресурсы, где код, а где хедеры – разобрался? Молодец! Конечно же, главный файл проекта имеет расширение .xcodeproj, файлы с кодом – расширение .m, заголовки с расширением .h ты точно узнал, а .xib – что-то вроде скомпиленого класса, в нем могут быть строки, формы да и сам код класса. Часть кода ты делаешь ручками, а часть – автоматом через Interface Builder. Так вот, автоматическая часть сюда и упаковывается.

Как добавлять картинку и перетянуть ее на форму – тебя учить не нужно. Редактируется все интуитивным мышиным кликом. Что ж, компилируем.

Для запуска приложения выбираем целевое устройство и рабочую версию SDK. Создавать приложения лучше для iPhone 2.0, так как в 2.1 есть некоторые фишки, лишенные обратной совместимости с 2.0, отягощенным более старыми версиями прошивки.

Полюбовался, работает? Теперь можно покопаться в коде. У любой программы точка входа находится в файле main.m (функция main). В ней выделяется память для объектов с дефолтным деструктором (надо же их за тобой как-то убирать) и создается шаблон приложения высшего уровня вместе с ключевыми объектами (функция UIApplicationMain). Приложения для iPhone однопоточные, поэтому выход из этой функции означает завершение программы:

int main(int argc, char *argv[])
{
NSAutoreleasePool * pool =
[[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain
(argc, argv, nil, nil);
[pool release];
return retVal;
}

Далее разберем такое понятие, как Application Delegate. Это нечто вроде базового класса для твоей программы (в примерах он уже создан). Интерфейс главного делегата описан в HelloWorldAppDelegate.h, а тело - положено в HelloWorldAppDelegate.m.

Такого понятия, как вызов метода другого класса в Objective-C нет, все делается через делегаты и сообщения. То есть, ты посылаешь объекту сообщение, и если целевой класс его сумеет обработать – считай, что своего ты добился. К примеру, Application Delegate связан с UIApplication, именно он создает окно, интерфейс пользователя, отвечает за прерывания, сообщения акселерометра и прочее.

(void)applicationDidFinishLaunching:(UIApplication *)
application {
// создаем контроллер видов
MyViewController *aViewController =
[[MyViewController alloc] initWithNibName:@
"HelloWorld" bundle:[NSBundle mainBundle]];
self.myViewController = aViewController;
// Квадратные скобки – это и есть отправление сообщения
// В данном случае объекту aViewController
// отправляется сообщение release
[aViewController release];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
// Каждый вид контроллера является подвидом окна
UIView *controllersView = [myViewController view];
[window addSubview:controllersView];
[window makeKeyAndVisible]; }

MyViewController.m – файл с кодом, собственно, контроллера нашего главного элемента формы. В нем содержится функционал этого приложения. Файл подробно прокомментирован и выложен на нашем DVD, поэтому не забудь глянуть.

Мы добавили новый контрол для переворота экрана, а исходники для него и смежных классов сгенерились автоматически. Главный вид – FlipsideView, сюда вложены RootViewController (он управляет переворотами окошек, анимацией) и два вида – обратный, FlipsideView, и прямой - MainView. RootViewController определяет, какой из видов надо отобразить. Именно ему отправляются сообщения о смене вида.

В результате, мы получили (и разобрались в устройстве) пример крайне простой, но работающей программки всего лишь с помощью нескольких щелчков мышью в среде разработки. На врезке ты можешь увидеть интервью с настоящим гуру айфон-кодинга, а мне же позволь откланяться. Будем надеяться, мы продолжим знакомство с гламурным кодингом под яблочный телефон в следующих номерах ][акера. Не стесняйся, пиши свои просьбы и отзывы – от твоих писем зависят те темы, которые мы будем раскрывать в следующих статьях.

Владимир Кузнецов, ведущий iPhone developer компании CactusSoft

Чтобы тебе было легче представить свое вероятное будущее, мы расспросили ведущего iPhone developer’а компании CactusSoft про особенности и трудности программирования для девайса Apple. Владимир Кузнецов, в миру более известный как Real (с некоторых пор – iReal), около пяти лет зарабатывал на бутерброд с икрой скилами С++ и C# (из них 3 года – С++ на уровне девелопера), а недавно решил все бросить и повернулся в сторону йаМобилки, очаровал менеджера и с ходу попал на должность лидирующего разработчика. Он уже успел пообщаться с реальными заказчиками, провести пару собеседований при приеме на работу, поучаствовать в крупных проектах для iPhone. В общем, камрад правильный, дурного не посоветует.

Рил, расскажи, в каких проектах ты участвовал, что писал сам?

Начал с простого приложения для работы с микроблоггингом. Дальше началось интересное – программа для управления термостатом. У заказчика в США есть такая штука, которая управляет множеством систем контроля температуры. В ней есть свой http-сервер. Моя программа к нему присоединяется и управляет всей этой махиной, снимает текущие данные, позволяет настраивать новые. Сейчас они захотели более навороченную версию, но это уже не мой проект. Я в данный момент занимаюсь разработкой игрового движка. В целях переносимости кода на другие платформы в качестве основного языка был выбран C++. В местах, более привязанных к конкретной платформе, для iPhone-версии будет использован Objective-C. Кроме этого, есть еще несколько параллельных небольших проектов под iPhone.

Внушительно. Ладно, верим, ты достаточно крут. А до этого ты не возился с Маками и прочей продукцией Apple, верно?

Да, с Маками особо проиграться не довелось, зато сейчас мне директор подарил iPod touch и MacBook. Для работы, конечно же, хотя я и забираю обе игрушки с собой домой.

Как ты с ходу перешел на новый язык, с чего начинал?

Начинал с освоения 147 старниц мануала Objective-C 2.0 Programming Language, далее просмотрел 212 страниц iPhone OS Programming Guide. Всего-то :). В принципе, для работы этого уже достаточно, остальное будет изучаться в процессе практики. А для начала вообще хватит просто ознакомиться с примерами, посмотреть видеоуроки на сайте Apple и – можно начинать. Я имею в виду не зеленых кодеров, а ребят с мозгом.

Ну да, наши читатели именно такие. Что вообще нужно знать, какая минимальная база знаний должна быть, чтобы заняться кодингом для гаджета Apple?

Objective-C - это расширение C++ в сторону объектно-ориентированного подхода. При программировании под iPhone довольно часто встречаешься с паттернами (делегаты, MVC, синглетон). Соответственно, нужны познания в C++, хорошее понимание принципов ООП, надо быть хотя бы знакомым с паттернами. Ну а в идеале - иметь опыт программирования для компьютеров Apple; язык, фактически, тот же, только некоторые классы отличаются.

Опыт какого языка тебе пригодился? На что похожи яблочные Си?

На C, C++, C#. На что же еще им быть похожими? В большей степени понадобился опыт C++, он фактически является прототипом Objective-C. Более того, возможно комбинирование кода C++ и Objective-C в рамках одного проекта и даже класса.

Легко ли было переходить на ифоновские Си?

Поначалу трудно, ибо слишком много нового: другая операционная система, другая раскладка клавиатуры, другие горячие клавиши, другой синтаксис, много новых ключевых слов, терминология, которая противоположно пересекается с C# (например, то, что в C# называется интерфейсом, в Objective-C зовется протоколом, интерфейс же там применяется несколько в другом роде). Другая и логика внутренней архитектуры приложений (например, все классы обмениваются информацией через посылку сообщений). Но при наличии желания и усилий к этому всему быстро привыкаешь.

Что нравится в языке, в особенностях программинга для ифона?

Нравится новый опыт. Люблю копаться в чем-то новом. Язык новый нравится, Objective-C «заставляет» мыслить более объектно. Простые iPhone-приложения на пару экранов делаются довольно просто, да еще и обладают всеми графическими красивостями, свойственными телефону Apple. Красиво и удобно. Наверное, только общаясь с творениями Apple, понимаешь, насколько непродуман интерфейс у Microsoft и начинаешь сам создавать более грамотные интерфейсы, стараться улучшать юзабилити своих программ.

Ты пробовал неофициальный СДК? Где программить удобнее, в официальном или в неофициальном?

Неофициальный SDK – хлам, с помощью которого кое-как можно работать. C их помощью нельзя писать полноценные легальные приложения под iPhone. Самому, к счастью, с этим столкнуться не пришлось. Я работаю с Apple iPhone SDK.

CD

На компакт-диске лежат полные исходные коды, файл проекта и скриншоты. Для их компиляции тебе понадобится SDK и студия разработки Xcode.

WWW

Документы, мануалы, примеры и прочее можно найти на сайте Apple – developer.apple.com/iphone.

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001