<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Программирование для мобильных устройств &#187; iPhone</title>
	<atom:link href="http://mobile-developer.ru/category/iphone/feed/" rel="self" type="application/rss+xml" />
	<link>http://mobile-developer.ru</link>
	<description>Программирование для мобильных устройств. Разработка для Windows Mobile, Windows CE, Embedded Linux, Google Android, iPhone, Palm webOS и др. Все о программировании для мобильных телефонов, смартфонов, КПК и других мобильных устройств. Статьи, новости, руководства, видео уроки.</description>
	<lastBuildDate>Sun, 05 Sep 2010 20:40:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Все элементы iPhone 4 GUI в PSD</title>
		<link>http://mobile-developer.ru/iphone/vse-elementy-iphone-4-gui-v-psd/</link>
		<comments>http://mobile-developer.ru/iphone/vse-elementy-iphone-4-gui-v-psd/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 22:00:09 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1377</guid>
		<description><![CDATA[Доступен PSD файл, содержащий все элементы пользовательского интерфейса для iPhone OS 4. Незаменимая вещь для прототипирования пользовательских интерфейсов iPhone-приложений. Скачать iPhone 4 GUI PSD. Post from: Mobile-Developer.ruВсе элементы iPhone 4 GUI в PSD<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vse-elementy-iphone-4-gui-v-psd/">Все элементы iPhone 4 GUI в PSD</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/vse-elementy-iphone-4-gui-v-psd/&title=Все+элементы+iPhone+4+GUI+в+PSD&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Доступен PSD файл, содержащий все элементы пользовательского интерфейса для iPhone OS 4. Незаменимая вещь для прототипирования пользовательских интерфейсов iPhone-приложений.</p>
<p><img class="alignnone size-full wp-image-1378" title="iPhone 4 GUI PSD" src="http://mobile-developer.ru/wp-content/uploads/2010/08/iPhone-4-GUI-PSD.png" alt="" width="579" height="346" /></p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://depositfiles.com/files/46lm5l27t"  target="_blank">Скачать iPhone 4 GUI PSD</a></noindex>.</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vse-elementy-iphone-4-gui-v-psd/" >Все элементы iPhone 4 GUI в PSD</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/vse-elementy-iphone-4-gui-v-psd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Кому в App Store жить хорошо. Магазинчик программ «У Стиви» глазами разработчика</title>
		<link>http://mobile-developer.ru/iphone/komu-v-app-store-zhit-xorosho-magazinchik-programm-u-stivi-glazami-razrabotchika/</link>
		<comments>http://mobile-developer.ru/iphone/komu-v-app-store-zhit-xorosho-magazinchik-programm-u-stivi-glazami-razrabotchika/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 12:14:29 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[Market]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1372</guid>
		<description><![CDATA[Сегодня у нас статья хабрапользователя xzDeveloper об App Store. В этой статье постараюсь кратко рассказать про свой полуторалетний опыт разработки под iPhone. И о том, кому же полезен App Store. Часть 1. Действующие лица Независимый разработчик Моя позиция такова, и, надеюсь, многие согласятся, что успешный человек — это тот, кто занимается любимым делом, которое приносит [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/komu-v-app-store-zhit-xorosho-magazinchik-programm-u-stivi-glazami-razrabotchika/">Кому в App Store жить хорошо. Магазинчик программ «У Стиви» глазами разработчика</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/komu-v-app-store-zhit-xorosho-magazinchik-programm-u-stivi-glazami-razrabotchika/&title=Кому+в+App+Store+жить+хорошо.+Магазинчик+программ+«У+Стиви»+глазами+разработчика&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Сегодня у нас статья хабрапользователя <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://xzdeveloper.habrahabr.ru/"  target="_blank">xzDeveloper </a></noindex>об App Store.</p>
<p>В этой статье постараюсь кратко рассказать про свой полуторалетний опыт разработки под iPhone. И о том, кому же полезен App Store.</p>
<h1>Часть 1. Действующие лица</h1>
<h3>Независимый разработчик</h3>
<p>Моя позиция такова, и, надеюсь, многие согласятся, что успешный человек — это тот, кто занимается любимым делом, которое приносит доход, на который можно не только жить, но и отдыхать от работы. То есть, его трудовой вклад должен окупаться настолько, чтобы он полностью себя обеспечивал. Кроме дохода еще требуется саморазвитие, чтобы не отставать от темпов роста отрасли, быть всегда во всеоружии, насколько это возможно, чтобы не растерять главное: опыт, навыки, знания.</p>
<p>Много ли таких среди инди-разработчиков? Мне кажется, что нет. Напротив, даже очень и очень мало. Особенно в нашей стране. Попробуем разобраться, почему.<span id="more-1372"></span></p>
<p>Многие слышали success story о том, как молодой человек загорается желанием и за неделю «в гараже» выдает на-гора супер-проект, о котором пишут новостные ленты, пестрит твиттер, который попадает в топы категорий, подкатегорий.</p>
<p>Обычно, за очень редким исключением, кроме минуты/дня/недели славы из этого ничего не получается. Что на первых порах молодой команде даже вредно.<br />
О реальных цифрах знают далеко не все. Потому что далеко не все были в этом самом «топе». Иногда это даже проблема, этот «топ».<br />
<a name="habracut"></a><br />
Если продукт попал в какой-либо топ, то пользователи будут считать, что разработчик «гребет бабло», и будут требовать соответствующей поддержки и отношения. Это может быть требование немедленно изменить функционал, как они желают, изменить дизайн, выпустить срочно обновление. По опыту скажу, что под «срочно» ими обычно подразумевается 2-3 дня, и если требование не будет выполнено, неминуемо последует «наказание» в виде негативного отзыва (зачастую очень агрессивного), плохой оценки, гневного письма. Про отзывы, рейтинги и пользователей подробнее расскажу ниже.</p>
<p>С другой стороны, положение в рейтинговой таблице влияет на продажи: приложения первой сотни покупают чаще. Просто потому что они на виду. Однако, точно оценить коэффициент, который привносится в продажи с помощью топа, сложно.</p>
<p>Итак, в глазах пользователей разработчик — миллионер. А на самом деле…</p>
<h5>«Скока денег?»</h5>
<p>Расскажу про русский топ на примере одного нашего приложения, т.к. «плавали, знаем». От штатовского наш топ отстает всего на порядок, как я полагаю, так что с большой натяжкой можно сказать, что сравнимо. А если учесть, что у тамошних разработчиков и потребности выше на порядок, то мы с ними в одной шкуре. Если я прав, выходит, что: «разработчик — он и в Африке разработчик».<br />
Итак, каков объем нашего, русского отдела магазинчика? Максимум, что мы видели — это 750 закачек в сутки однодолларового приложения на первом месте. При этом в Top Grossing до первого места мы не добрались. Выходит, что потолок первого места русского топа скорее всего не ограничен одной тысячей закачек. НО это не каждый день.</p>
<p>Среднее количество закачек на первом месте — от 150 до 300. Конечно, зависит от приложения, от «соседей», сезона и т.п. Наблюдения велись в течение месяца (столько времени наше приложение продержалось в первой десятке, половину этого времени на первом месте).</p>
<p>Итого у нас вышло: потрачено на разработку 500 часов нетто (без перекуров и отвлечений), доход за 4 месяца продаж, за вычетом сбора Apple составил примерно 5 тысяч долларов. На рекламу не потрачено ни копейки, поддержка пользователей около 100 часов. Выходит, доходность меньше 10 долларов в час при условии постоянного нахождения в топе. Это приложение просто оказалось нужным и востребованным, его не понадобилось пиарить. А если добавить сюда расходы на рекламу, оплату электричества, трафика, хостинга, профит получится еще меньше.</p>
<p>В отличие от <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://habrahabr.ru/blogs/macosxdev/100893/" >коллег, которые недавно рассказывали о своем опыте как о неудачном</a></noindex>, мы считаем, что это пусть маленький, но успех.</p>
<p>Про «гаражные стартапы» все знают или слышали. Но где эти стартапы через год-два, если не находят инвестора? Так и здесь, в разработке под iPhone: часто это молодые люди еще без соответствующего образования, опыта (как программистского, так и организационного). Запала хватает обычно на одно-два приложения. Пусть очень хороших и востребованных публикой. А что дальше? Хорошо, если отобьются вложенные средства… А дальше глухой стеной встает предел компетентности/армия/апатия/необходимость или желание зарабатывать реальные деньги и спать ночью.</p>
<h3>Фанаты</h3>
<p>Есть люди, достаток которых позволяет им заниматься любой деятельностью без оглядки на бизнес-составляющую. Обычно они тратят в 10 раз больше на разработку, чем потом удается выручить. Редко, когда хобби приносит деньги. Это уже работа, если так.</p>
<p>Билет на WWDC-2010 можно было купить за 1600$ в течение всего лишь 8 дней. Разобрали, как пирожки. Сколько было инди-разработчиков там? Немного. А российских разработчиков? Единицы. А кто же все те люди? Это были журналисты, люди из первого абзаца, а также те, кто смог убедить руководство своей компании оплатить такую командировку (+ билеты + недельное проживание).</p>
<p>Это я к тому, что есть целый пласт людей, которые занимаются разработкой (иногда даже это у них получается), просто потому что им хочется это делать, потому что они фанаты Apple или хотят доказать всем, что «они смогут». И они не расстраиваются из-за неудач (потому что на счетах есть на что жить и без игры в разработку).</p>
<h3>Ребята из рекламных роликов Apple</h3>
<p>Некоторые разработчики получают поддержку Apple напрямую. Есть несколько специально созданных Apple рекламных роликов, где разработчики-одиночки(!) аж светятся и рассказывают, как просто было им начать путь и как быстро он их привел к успеху. Ради интереса, может, кто-то знает судьбу тех самых ребят?</p>
<p>Apple заинтересованы в магазине приложений не как в средстве своего дополнительного дохода, а как в механизме привлечения покупателей для своих устройств. Поэтому им выгодно, чтобы было много разных приложений, чтобы сказать, что у них уже 250 тысяч программ в магазине и столько-то миллиардов закачек.</p>
<p>Может, все и задумывалось для людей: много хороших, нужных, качественных программ… А получилось, как всегда: отдел маркетинга требует большие цифры, горе-разработчики ноют, что цензоры не пропускают их мусор, шумят в блогах. Где уж тут качество будет. В итоге все стали заложниками ситуации, когда всем одновременно мил не будешь.</p>
<p>Такова мощь и бесполезность сегодняшнего App Store: разработчики не могут заявить о себе, утопая в тысячах поделок и клонов, пользователи дальше 100 первых приложений не видят ничего, да если и захотеть, то найти что-либо подходящее и стоящее не всегда под силу.</p>
<h3>Издатели (publishers)</h3>
<p>Эти товарищи зарабатывают на процентах с продаж чужих приложений. Это почти все известные бренды App Store. Они отбирают самое лучшее, что есть. Иногда сами делают заказы. Не скупятся на промокампании. В итоге разработчик, обратившийся к паблишеру получает ту же зарплату, что и в офисе. Сама компания-издатель обычно не маленькая, и огромные доходы расходятся на зарплаты и рекламу.</p>
<h3>Вывод</h3>
<p>По нашим наблюдениям и рассуждениям выходит, что нет счастливчиков, которые особо не напрягаются и прилично зарабатывают в App Store.</p>
<p>Хуже всех ситуация у независимых разработчиков (небольших команд и стартапов), т.к. на одном-двух приложениях далеко не уедешь, спрос падает, рынок быстро насыщается, спасение лишь в постоянных заказах, а держать постоянных клиентов начинающей команде очень сложно. Еще сложнее одиночкам (надеюсь, не надо объяснять почему).</p>
<p>Не хочу отговаривать никого от желания заработать в App Store, просто не думайте, что это так просто. Легких денег не бывает, каждый грош зарабатывается потом и кровью.</p>
<h5>Что делать независимым разработчикам?</h5>
<p>Учиться, учиться и учиться.<br />
Не расстраиваться из-за неудач.<br />
Помнить, что всех денег не заработать, поэтому уделять внимание здоровью и время отдыху.<br />
Не играть в большую компанию, когда вас еще очень мало.<br />
Собрав приличное портфолио, начинать искать заказчиков.</p>
<p>Далее о том, что ждет тех, кто решился примерить на себя роль Apple Developer.</p>
<h1>Часть2. Путь Разработчика</h1>
<p>Что такое разработка для App Store? Есть несколько несложных «квестов», выполнения которых (как на каждом углу написано) вроде бы достаточно для того, «чтобы зашибать неплохие деньги»:</p>
<ul>
<li>Наличие программно-технических средств. Нужен Mac, iPhone SDK, устройство для тестирования.</li>
<li>Регистрация участника Apple Developer Program. 99$ в год.</li>
<li>Идея программы. Обычно проблем ни у кого не возникает. Все гении.</li>
<li>Реализация. Требуется умение программировать, понимать технические тексты на английском.</li>
<li>Публикация. Угодить цензорам, знать в общих чертах, о чем сказано в <em>iPhone Developer Program License Agreement</em></li>
<li>Реклама</li>
<li>Поддержка пользователей</li>
<li>Получение прибыли. Да, заработанные кровные еще надо получить.</li>
</ul>
<p>Подробнее на некоторых пунктах остановлюсь ниже.</p>
<h3>Разработка</h3>
<p>Вроде бы об этом очень много уже информации есть. И для инженера при его желании, даже если он не умеет программировать (хотя, вроде сейчас всех инженеров учат этому), этот вопрос не играет большой роли.</p>
<p>Скажу лишь, что какова бы ни была дружественна к пользователю среда разработки, сколько бы библиотек с готовыми алгоритмами и функциями ни было уже написано, без базовых знаний по предмету лучше не пытаться «городить огород». По tutorial&#8217;ам конкретную нужную программу не написать. По документации к SDK не понять, что деление на 0 не очень хорошо.</p>
<p>Самое сложное, на мой взгляд, в разработке под iPhone — это управление памятью (retain, release). Надо следить за всей выделенной динамической памятью. Ну нет там «сборщика мусора»!</p>
<h5>Веселая карусель прошивок</h5>
<p>Все разработчики «любят» Apple за их любовь к деньгам пользователей: выход новых прошивок побуждает людей покупать новые устройства, т.к. на старых моделях новая прошивка уже не поддерживается. В чем же проблема у разработчика?</p>
<p>В прошлом году с выходом iPhone OS 3.0 особых проблем не было: старая прошивка (2.x) поддерживалась SDK. С выходом прошивки 4.0 и соответствующего SDK случилось страшное: для поддержки работы своего приложения на всех поддерживаемых устройствах разработчику для тестирования необходимо иметь 2(!) iPhone: один с прошивкой 3.1 и один с прошивкой 4.х Потому что ни один SDK не предусматривает полноценную поддержку обеих этих прошивок одновременно: нельзя выставить, например, Base SDK 3.1 и ниже в новом Xcode. Убрав поддержку iPhone OS 2.x явно, ребята из Купертино не явно очень сильно надавили на разработчиков и на пользователей по поводу iPhone OS 3.1.</p>
<p>Не вдаваясь в детали: поддерживать в программе полноценную работу сразу двух прошивок очень сложно.</p>
<p>С выходом iPad и iPhone 4 теперь, если есть желание делать универсальное приложение, придется позаботиться обо всех возможных расширениях экранов и куче наборов иконок для рабочего стола.</p>
<h5>Работа приложений на устройствах. Jailbreak</h5>
<p>Еще один «подарок» от Apple для разработчиков. Иногда операционная система iPhone не справляется со своими задачами. В результате, если в этот момент была запущена программа и она «упала», в глазах пользователя виноват будет создатель программы, не Apple, не Foxconn.</p>
<p>Если пользователь сделал <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://ru.wikipedia.org/wiki/Jailbreak" >Jailbreak</a></noindex>, потому что «так делают все хакеры/друзья сказали», а не потому, что это ему действительно нужно, и накидает в аппарат кучу софта, описаний которого даже не читал, потому что «халява» и одна из этих программ «упала» во время использования, виноват кто? Конечно, не Jailbreak или дефицит системной памяти в алюминиевом iPhone. Ну, вы поняли.</p>
<h3>Публикация</h3>
<p>Цензоры. Те времена, когда давали абсурдные отказы в публикации, вроде бы прошли. На все про все <em>обычно</em>* уходит неделя.</p>
<p>Хотя, был один случай месяца три назад. Захотели мы реализовать функцию, для работы которой требовалось использование некоторых незапрещенных функций ядра. Повесили кнопку, на которой написали название функции. Ответ цензора: «Такой функционал в SDK не предусмотрен», хотя очень похожая программа от другого разработчика продавалась как ни в чем не бывало. Показывать пальцем не стали, пришлось убрать кнопку (функцию-то мы оставили, сделав автоматической). И как же обидно стало, когда по прошествии двух месяцев программ с такой функцией, описанием и даже названием стало прибывать!</p>
<p>* Сроки рассмотрения всегда плавающие. Даже нечего сказать пользователям, которые спрашивают о дате выхода обновления. От недели до месяца. От сложности приложения не зависит. Обновление это или новое приложение — роли не играет.</p>
<p>Радует только, что интерфейс iTunes Connect (веб-портал, при помощи которого разработчики отправляют приложения на публикацию) сделали более дружелюбным и выпустили достаточно удобное приложение под iPhone для слежения за количеством продаж.</p>
<h3>Реклама</h3>
<p>Без рекламы никуда. Редко-редко ваше супер-пупер-замечательное приложение заметят просто так.</p>
<p>Есть множество способов раскрутки, один из них — это публикация обзора программы в профильных СМИ.<br />
Как вы думаете, каким образом в популярных новостных лентах и порталах оказываются обзоры программ из App Store? Причин не так уж и много, вот те, что я пронаблюдал:</p>
<ul>
<li>Разработчик заплатил за обзор денег (не знаю сколько, за деньги не публиковались).</li>
<li>Портал малопосещаем, ньюсмейкеров не хватает, опыта нет и обзор публикуется по принципу «хоть что-то».</li>
<li>По знакомству.</li>
<li>Приложение находится в штатовском «топе».</li>
</ul>
<p>Еще можно пиариться в форумах и темах на пиратских трекерах. Но, думаю, это крайне неэффективно. Разве что ради обратной связи.</p>
<h3>Поддержка пользователей. Отзывы и оценки</h3>
<p>Если приложение имеет больше одной кнопки и вы не гуру юзабилити — придется заниматься поддержкой. Для игр, может, и не так актуально. Про работу службы поддержки будет отдельная статья.</p>
<h5>Обратная связь</h5>
<p>Самая веселая часть. Когда грустно, можно читать отзывы в App Store, и на душе станет теплее. Там и страсть фанатов (даже у приложений есть фанаты), и злость обманутых пользователей, и радость обретших, и грусть потерявших (например, некоторые приложения цензоры удаляют уже после того, как опубликовали), а также глупость недалеких пользователей.</p>
<p>Есть такой класс приложений — розыгрыши. Одно из таких — «Поиск местонахождения сотового телефона по номеру». Суть в том, что «ведущий» запускает приложение, просит жертву розыгрыша сказать свой номер телефона, вводит в программу — и iPhone определяет место по GPS. Т.к. жертва розыгрыша находится там же, где и ведущий, программа определяет всего лишь свое собственное местоположение. Честное описание в этих приложениях всегда присутствует. Вот типичный отзыв для таких приложений: «РАЗВОД! НЕ ПОКУПАЙТЕ! Какие дебилы вывели в топ это дерьмо?» Оценки все единицы. Приложение обычно несколько дней в топе. Разработчик заработал свои «грязные» деньги. А пользователи раскрывают свою суть. Кто вывел в топ? Да тот человек и ему подобные и вывели.</p>
<p>Что удручает — так это мат и оскорбления в отзывах в адрес как разработчика, так и других товарищей, оставивших отзыв и позволивших себе не согласиться с предыдущим. Таковы вы, пользователи продукции Apple? Культурные и грамотные? Матерятся иногда даже с ошибками.</p>
<p>Что интересно, <strong>отзывы люди не читают, описание — тоже</strong>. Смотрят только на иконку и название. Отзывы — это как будто такое место с режимом write-only.</p>
<h5>Оценки</h5>
<p>Если приложение простенькое, делает тихо свою работу, то ни отзывов, ни оценок у него не будет. Это также может означать, что оно вовсе не продается.</p>
<p>Если приложение достаточно сложное, но дешевое — ждите кучи единиц: чтобы им пользоваться, зачастую нужно прочитать хотя бы аннотацию. Поставить единицу, не разобравшись, проще, чем что-либо читать. У таких приложений обычно поровну положительных и отрицательных оценок.</p>
<p>Исключительно отличные оценки есть только у простых красивых несложных игрушек.</p>
<p>Может, выводы, которые можно из этого сделать о публике, и грустные, но такова реальность. Если кого-то успокоит, то в Штатах с этим намного хуже. Хотя это выборка только по магазинчику.</p>
<h3>Гонорар. «Сундук Кащея»</h3>
<p>Говорим про Россию. Деньги от Apple приходят не сразу, а только после их отчетного периода, обычно не раньше, чем через 45 дней, и если набралось не меньше пары сотен долларов. Не во всех российских банках эти деньги без проблем зачислят на счет физического лица. Особенно, если денег много (наверное, должно быть столько, чтобы финмониторинг включился).<br />
Т.к. сообщений о таких случаях не поступало, это значит, что либо у кого-то такое случилось и он об этом никому не рассказал, либо такого не случалось, либо счет у человека не в России.</p>
<p>Издержки работы юр. лица (особенно когда разработчику еще нет 18-ти) должны быть всем понятны. Возможно ли вообще честно получить хорошие деньги из-за границы? Что косвенно подтверждает мое предположение о том, что нет успешных независимых разработчиков (по крайней мере в России).</p>
<h3>Заключение</h3>
<p><strong>Разработчикам</strong>: не стесняйтесь обмениваться опытом. Есть несколько русскоязычных сайтов по iPhone-тематике для разработчиков. В мечтах, конечно, русский stackoverflow.com. Если кто знает что-то подобное для русскоговорящих, советуйте всем своим знакомым разработчикам.</p>
<p><strong>Начинающим разработчикам и тем, кто спамит в App Store</strong>: не плюйте в колодец…</p>
<p><strong>Пользователям</strong>: читайте хотя бы аннотацию к приложению перед покупкой. И не думайте, что мы на вас наживаемся. Бывает мы ночами не спим, отвечая на ваши письма за куда меньшие деньги, чем можно заработать в уютном офисе.</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://habrahabr.ru/blogs/macosxdev/101805/"  target="_blank">Источник</a></noindex>.</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/komu-v-app-store-zhit-xorosho-magazinchik-programm-u-stivi-glazami-razrabotchika/" >Кому в App Store жить хорошо. Магазинчик программ «У Стиви» глазами разработчика</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/komu-v-app-store-zhit-xorosho-magazinchik-programm-u-stivi-glazami-razrabotchika/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone разработка: Интегрируем In-App Purchases</title>
		<link>http://mobile-developer.ru/iphone/iphone-razrabotka-integriruem-in-app-purchases/</link>
		<comments>http://mobile-developer.ru/iphone/iphone-razrabotka-integriruem-in-app-purchases/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 21:18:06 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1264</guid>
		<description><![CDATA[Сегодня у нас статья Якова Ильина об In-App Purchases для iPhone-приложений. Введение In-App Purchases — это простой и удобный механизм для организации продаж своих приложений или дополнительных фич непосредственно из своего приложения. In-App Purchases легко встраивается и открывает для Вас новый канал продаж. Взаимодействие с App Store осуществляется с помощью StoreKit.framework, который поставляется вместе с [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/iphone-razrabotka-integriruem-in-app-purchases/">iPhone разработка: Интегрируем In-App Purchases</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/iphone-razrabotka-integriruem-in-app-purchases/&title=iPhone+разработка:+Интегрируем+In-App+Purchases&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Сегодня у нас статья <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://epazzz.habrahabr.ru/"  target="_blank">Якова Ильина</a></noindex> об In-App Purchases для iPhone-приложений.</p>
<h4>Введение</h4>
<p><strong>In-App Purchases </strong>— это простой и удобный механизм для организации продаж своих приложений или дополнительных фич непосредственно из своего приложения. In-App Purchases легко встраивается и открывает для Вас новый канал продаж. Взаимодействие с App Store осуществляется с помощью StoreKit.framework, который поставляется вместе с SDK, начиная с версии 3.0.<span id="more-1264"></span></p>
<h4>Общая информация</h4>
<p>In-App Purchases бывает трех типов:</p>
<ul>
<li>Consumables</li>
<li>Non-Consumables</li>
<li>Subscriptions</li>
</ul>
<p><strong>Consumable</strong> &#8211; потребляемый тип. Purchase такого типа может покупаться несколько раз. Например, в игре <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://itunes.apple.com/us/app/eliminate-pro/id318760264?mt=8" >Eliminate</a></noindex> игрок покупает себе энергию, которая со временем растрачивается и приходится покупать ее заново, либо ждать три часа, пока энергия востановится.</p>
<p><strong>Non-Consumable</strong>— непотребляемый тип. Purchase покупается только один раз. Его обычно используют для разблокировки новых тем, дополнительных уровней и т.п.</p>
<p><strong>Subscription</strong>— подписка на что-либо. Например, Вы можете написать iPhone-приложение для Web-сервиса, в котором есть Premium аккаунт, открывающий дополнительные возможности. С помощью Subscription Вы сможете аккаунт активировать, скажем, на месяц или на год.</p>
<p>Реализовать In-App Purchases можно с помощью двух моделей:</p>
<ul>
<li>Встроенная модель</li>
<li>Серверная модель</li>
</ul>
<p><strong>Встроенная модель</strong> позволяет разблокировать фичи. Как правило, использование данной модели побуждает разработчиков встраивать их в приложение зарание. При такой реализации, StoreKit отвечает только за оплату фичи. В общем случае, с помощью StoreKit мы можем узнать прошла ли покупка или не прошла.</p>
<p><strong>Серверная модель</strong> является более гибкой. В модели принимают участие три сущности: iPhone-приложение, сервер Apple и наш сервер. Все новые фичи хранятся на нашем сервере, поэтому нет необходимости обновлять приложение при добавлении новых фич или продуктов. Работает модель следующим образом:</p>
<ol>
<li>iPhone-приложение запрашивает список продуктов у своего сервера,</li>
<li>iPhone-приложение отображает новые продукты пользователю,</li>
<li>Пользователь покупает (или не покупает <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</li>
<li>iPhone-приложение запрашивает покупку у сервера Apple через StoreKit,</li>
<li>StoreKit возвращает ответ,</li>
<li>iPhone-приложение отсылает ответ на свой сервер</li>
<li>Еще раз проверяется ответ (обязательно проверяется, что ответ пришел от Apple),</li>
<li>После этого iPhone-приложение скачивает со своего сервера новый продукт.</li>
</ol>
<p>В данном посте рассматривается встроенная модель.</p>
<h4>Реализация</h4>
<p>Работу встроенной модели In-App Purchases я продемонстрирую на тестовом примере AppPurchasesExample. Это небольшое iPhone-приложение с 3 окнами. Первое (оно же главное) окно будет доступно пользователю по-умолчанию. Это окно будет содержать информацию о двух других окнах, разблокировать которые можно только за деньги.</p>
<h5>Шаг 1. Создание App ID</h5>
<p>Заходим на <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://developer.apple.com/iphone/" title="iPhone Developer Program Portal" >iPhone Developer Program Portal</a></noindex> и открываем вкладку App IDs:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-1.png" ><img class="alignnone size-full wp-image-1265" title="iPhone In-App Purchases - App IDs" src="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-1.png" alt="" width="417" height="306" /></a></p>
<p>В правом верхнем углу экрана нажимаем New App ID. Затем вводим информацию о приложении. Для своего примера я заполнил форму так:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-2.png" ><img class="alignnone size-full wp-image-1266" title="iPhone In-App Purchases - Create App ID" src="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-2.png" alt="" width="448" height="532" /></a></p>
<p>Для создания Bundle Identifier Apple рекомендует использовать нотацию <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://en.wikipedia.org/wiki/Reverse-DNS" title="Reverse DNS" >Reverse DNS</a></noindex>, что гарантирует уникальность Вашего Identifier и избавит Вас от дальнейших проблем при публикации приложения.<strong>Очень Важно </strong>не использовать символ &#8216;*&#8217; в Bundle Identifier. Если ввести &#8216;com.wordpress.indiedevelop.*&#8217;, то In-App Purchases работать не будет.</p>
<p>Далее необходимо включить In App Purchases для App ID. В списке App IDs, напротив нужного Bundle Identifier в графе Action следует нажать Configure. Появится форма Configure App ID, на которой необходимо включить checkBox &#8216;Enable In App Purchase&#8217;.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-3.png" ><img class="alignnone size-full wp-image-1267" title="iPhone In-App Purchases - Enable In-App Purchase" src="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-3.png" alt="" width="394" height="355" /></a></p>
<h5>Шаг 2. Создание Development профиля</h5>
<ol>
<li>В левом столбце нужно нажать на &#8216;Provisioning&#8217; и перейти на вкладку &#8216;Development&#8217;.</li>
<li>Нажать &#8216;New Profile&#8217; и заполнить всю необходимую информацию. Поле Profile Name может быть любое (я записал &#8216;InAppPurchasesExample Dev&#8217;).</li>
<li>В появившемся списке созданный профиль имеет статус pending. Нужно обновить страницу, либо перейти на другую вкладку и обратно, тогда профиль станет доступен для скачивания.</li>
<li>Профиль можно скачивать и устанавливать в xCode. Для установки достаточно просто нажать на профиль двойным кликом, либо перетащить профайл на иконку xCode.</li>
</ol>
<p>Если профиль установился правильно, тогда в xCode откроется Organizer и вы увидите примерно следующее:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-4.png" ><img class="alignnone size-full wp-image-1268" title="iPhone In-App Purchases - xCode Organizer" src="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-4.png" alt="" width="592" height="160" /></a></p>
<h5>Шаг 3. Создание приложения в iTunes Connect</h5>
<p>Для того, чтобы протестировать наше In-App Purchase приложение, его нужно обязательно создать в iTunes Connect. Чтобы это сделать:</p>
<ol>
<li>Необходимо перейти в <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/https://itunesconnect.apple.com/" title="iTunes Connect" >iTunes Connect</a></noindex> и нажать &#8216;Manage Your Applications-&gt;Add New Application&#8217;.</li>
<li>На вопрос &#8216;Does your product contain encryption?&#8217; ответить отрицательно.</li>
<li>Заполнить форму, где нужно указать имя приложения, описание, номер версии, категорию и т.д. Все достаточно тривиально. Затруднения может вызвать разве что поле &#8216;SKU Number&#8217;. Это поле должно быть уникальным, я ввел в нем &#8216;IAPEX&#8217; (сокращение от In-App Purchases Example).</li>
<li>На форме &#8216;Upload&#8217; необходимо выставить флаг &#8216;Upload application binary later&#8217;. Все остальные параметры и формы для тестого примера никакого значения не имеют.</li>
</ol>
<h5>Шаг 4. Создание In-App Purchases в iTunes Connect</h5>
<ol>
<li>В iTunes Connect необходимо нажать &#8216;Manage Your In App Purchases-&gt;Create New&#8217; и выбрать необходимое приложение.</li>
<li>Выбрать Bundle ID и заполнить инфрормацию о Purchase (тип, название, цену и т.д.) Также нужно ввести &#8216;Product ID&#8217;, который может быть произвольным, но я советую использовать Reverse DNS. Лучше всего Product ID формировать из Bundle ID вашего приложения и имени фичи. Для моего примера это выглядит так:</li>
</ol>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-5.png" ><img class="alignnone size-full wp-image-1269" title="iPhone In-App Purchases - Manage Product ID in iTunes Connect" src="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-5.png" alt="" width="300" height="108" /></a></p>
<p>Для тестового приложения я создал два In-App продукта с Product Id &#8216;com.wordpress.indiedevelop.InAppPurchasesExample.f1&#8242; и &#8216;com.wordpress.indiedevelop.InAppPurchasesExample.f2&#8242;. Обе фичи с типом Non-Consumables.</p>
<h5>Шаг 5. Создание тестового пользователя</h5>
<p>Для тестирования In-App Purchases необходимо создать хотя бы одного тестового пользователя. Делается это просто:</p>
<ol>
<li>В iTunes Connect необходимо перейти на &#8216;Manage Users-&gt;In App Purchase Test User&#8217;</li>
<li>Нажать &#8216;Add New User&#8217;</li>
<li>Ввести информацию о пользователе</li>
</ol>
<p>E-mail пользователя не обязательно должен быть реальным. Для своего примера я создал одного тестового пользователя:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-6.png" ><img class="alignnone size-full wp-image-1270" title="iPhone In-App Purchases - Create Test User" src="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-6.png" alt="" width="521" height="487" /></a></p>
<p><strong>Важный момент. </strong>Если у Вас не закончен контракт с Apple, тогда In-App Purchase работать у Вас не будет. Для того, чтобы закончить контракт, необходимо указать Contact Info, Bank Info и Tax Info.</p>
<h5>Шаг 6. Программирование</h5>
<p>Для своего тестового примера я создал каркас проекта и User Interface:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-7.png" ><img class="alignnone size-full wp-image-1271" title="iPhone In-App Purchases - Sample Project" src="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-7.png" alt="" width="538" height="747" /></a></p>
<p>Для работы с App Store я рекомендую использовать <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://blog.mugunthkumar.com/coding/iphone-tutorial-–-in-app-purchases/" >MKStoreKit</a></noindex>, разработанный в 2009 году разработчиком Кумаром (Mugunth Kumar). Данный набор классов значительно облегчит работу со StoreKit. Кроме MKStoreKit, в проект необходимо добавить StoreKit.framework.</p>
<p>В своем примере я использую слегка модернизированную первую весрию MKStoreKit. Для удобства я добавил к классу MKStoreManager делегат следующего вида:</p>
<pre class="brush: cpp;">
@protocol MKStoreKitDelegate @optional
- (void)productAPurchased;
- (void)productBPurchased;
- (void)failed;
@end
</pre>
<p>Делегату посылается сообщение productAPurchased когда куплена фича 1, productBPurchased — когда куплена фича 2 и failed — когда пользователь либо отменил покупку, либо покупка не прошла.</p>
<p>Класс-<noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://en.wikipedia.org/wiki/Singleton_pattern" >Singleton</a></noindex> <code>MKStoreManager</code> является основным в MKStoreKit. Так выглядит его объявление:</p>
<pre class="brush: cpp;">
@interface MKStoreManager : NSObject&lt;SKProductsRequestDelegate&gt; {
    ...
}

// делегат
@property (nonatomic, retain) id&lt;MKStoreKitDelegate&gt; delegate;
// продукты, доступные для покупки
@property (nonatomic, retain) NSMutableArray *purchasableObjects;

// фабричный метод для Singleton
+ (MKStoreManager*)sharedManager;

// методы для покупки фич
- (void) buyFeatureA;
- (void) buyFeatureB;

// методы позволяют узнать куплена ли фича
+ (BOOL) featureAPurchased;
+ (BOOL) featureBPurchased;
...
@end
</pre>
<p>Рассмотрим использование класса на моем тестовом примере.</p>
<p>Сначала в файле MKStoreManager.m я прописал Product ID своих фич:</p>
<pre class="brush: cpp;">
static NSString *featureAId = @&quot;com.wordpress.indiedevelop.InAppPurchasesExample.f1&quot;;
static NSString *featureBId = @&quot;com.wordpress.indiedevelop.InAppPurchasesExample.f2&quot;;
</pre>
<p>Также нужно проверить были ли куплены фичи программы. Основной класс примера унаследован от <code>UIViewController</code>, поэтому код проверки целесообразно встроить в метод viewDidLoad:</p>
<pre class="brush: cpp;">
- (void)viewDidLoad {
  [super viewDidLoad];

  [MKStoreManager sharedManager].delegate = self; // назначаем делагата для объекта MKStoreManager

  if ([MKStoreManager featureAPurchased]) // если куплена фича 1
  {
    feature1Button.hidden = YES; // скрываем кнопку 'Купить фичу 1'
    seeFeature1Button.hidden = NO; // показываем кнопку 'Перейти на фичу 1'
  }

  if ([MKStoreManager featureBPurchased]) // если куплена фича 2
  {
    feature2Button.hidden = YES; // скрываем кнопку 'Купить фичу 2'
    seeFeature2Button.hidden = NO; // показываем кнопку 'Перейти на фичу 2'
  }
}
</pre>
<p>Внутри MKStoreKit информация о том, куплен ли продукт сохраняется через <code>NSUserDefaults</code>, поэтому при удалении приложения информация сбрасывается. Однако, пользователь не будет покупать фичи два раза, поскольку StoreKit откроет доступ к фиче бесплатно.</p>
<p>Дальше нужно реализовать методы &#8216;Купить&#8217;. Они привязаны к событию <code>TouchUpInside</code> соотвествующих кнопок:</p>
<pre class="brush: cpp;">
-(IBAction)feature1ButtonPressed
{
  [self showLockView]; // показываем пользователю, что происходит загрузка
  [[MKStoreManager sharedManager] buyFeatureA]; // посылаем сообщение магазину 'Купить фичу 1'
}

-(IBAction)feature2ButtonPressed
{
  [self showLockView]; // показываем пользователю, что происходит загрузка
  [[MKStoreManager sharedManager] buyFeatureB]; // посылаем сообщение магазину 'Купить фичу 2'
}
</pre>
<p>Далее я реализовал методы делегата <code>MKStoreKitDelegate</code>:</p>
<pre class="brush: cpp;">
// фича 1 куплена
- (void)productAPurchased
{
  [self hideLockView]; // скрываем отображение загрузки
  feature1Button.hidden = YES; // скрываем кнопку 'Купить'
  seeFeature1Button.hidden = NO; // показываем кнопку 'Перейти'
}

// фича 2 куплена
- (void)productBPurchased
{
  [self hideLockView]; // скрываем отображение загрузки
  feature2Button.hidden = YES; // скрываем кнопку 'Купить'
  seeFeature2Button.hidden = NO; // показываем кнопку 'Перейти'
}

// покупка не прошла, либо была отменена
- (void)failed
{
  [self hideLockView]; // скрываем отображение загрузки
}
</pre>
<p>Новые фичи реализованы в виде отдельных <code>UIView</code> под управлением <code>UIViewController</code>. Переход на новые фичи я реализовал с помощь <code>UINavigationController</code>:</p>
<pre class="brush: cpp;">
// перейти на фичу 1
-(IBAction)seeFeature1
{
  [self.navigationController pushViewController:feature1ViewController animated:YES];
}

// перейти на фичу 2
-(IBAction)seeFeature2
{
  [self.navigationController pushViewController:feature2ViewController animated:YES];
}
</pre>
<p>Также при манипуляции с магазином можно добавить проверку на его доступность. Это делается так:</p>
<pre class="brush: cpp;">
if ([SKPaymentQueue canMakePayments])
{
... // Отобразить магазин пользователю
}
else
{
... // Уведомить пользователя, что Purchases недоступны
}
</pre>
<p>Как видите все достаточно просто. Остается скопилировать и тестировать <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h5>Шаг 7. Тестирование</h5>
<p>Чтобы протестировать In-App Purchases нужно скомпилировать, установить и запустить приложение. При тестировании следует помнить следующее:</p>
<ol>
<li>Тестировать Purchases можно только на устройстве.</li>
<li>Перед тестированием необходимо выйти из iTunes на своем iPhone. Это делается через &#8216;Settings-&gt;Store-&gt;Sign Out&#8217;.</li>
<li>При тестировании, в сообщениях с предложением купить фичу, будет появляться [Environment: sandbox] — это признак тестового режима.</li>
<li>Тестировать можно только тест-аккаунтами (см. Шаг 5)</li>
</ol>
<h5>Тестовый пример InAppPurchasesExample</h5>
<p>В результате у меня получилось приложение, которое может разблокировать два дополнительных окна. Это приложение можно использовать в качестве примера для создания своих In-App Purchase проектов.</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://ifolder.ru/16408660" title="Скачать исходник. In-App Purchases для iPhone-приложений"  target="_blank">Исходный код</a></noindex></p>
<p><a href="http://indiedevelop.wordpress.com/2010/02/16/inapppurchasetutorial/"  target="_blank">Оригинал статьи в блоге автора</a>.</p>
<p>Скриншоты:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-8.png" ><img class="alignnone size-full wp-image-1272" title="iPhone In-App Purchases - Screenshots" src="http://mobile-developer.ru/wp-content/uploads/2010/02/iphone-in-app-purchases-8.png" alt="" width="512" height="768" /></a></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/iphone-razrabotka-integriruem-in-app-purchases/" >iPhone разработка: Интегрируем In-App Purchases</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/iphone-razrabotka-integriruem-in-app-purchases/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web разработка под iPhone</title>
		<link>http://mobile-developer.ru/tools/web-razrabotka-pod-iphone/</link>
		<comments>http://mobile-developer.ru/tools/web-razrabotka-pod-iphone/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 14:06:33 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[SDK]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mobile Web]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1252</guid>
		<description><![CDATA[Сегодня у нас статья Андрея Реброва о различных инструментариях Web-разработки для мобильных устройств вцелом и iPhone в частности. Введение Пока все Интернет сообщество со всех сторон продолжает обсуждать, как же можно приспособить iPad для работы, я бы хотел все же вернуться к iPhone. По профессии я программист и люблю новые технологии. И очень мне уж [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/tools/web-razrabotka-pod-iphone/">Web разработка под iPhone</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/tools/web-razrabotka-pod-iphone/&title=Web+разработка+под+iPhone&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Сегодня у нас статья <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://mythmaker.habrahabr.ru/"  target="_blank">Андрея Реброва</a></noindex> о различных инструментариях Web-разработки для мобильных устройств вцелом и iPhone в частности.</p>
<h4>Введение</h4>
<p>Пока все Интернет сообщество со всех сторон продолжает обсуждать, как же можно приспособить iPad для работы, я бы хотел все же вернуться к iPhone. По профессии я программист и люблю новые технологии. И очень мне уж хотелось сделать приложение для своего телефона, но вот как-то душа к Objective C не лежит пока что, да и макбука с лицензией разработчика тоже пока нет. И мне стало интересно, могу ли используя знания html и js написать что-нибудь. Оказалось что да, и способов очень даже много. О них – под катом.<br />
<span id="more-1252"></span></p>
<h4>Способ первый – просто и со вкусом</h4>
<p>Само собой, можно просто написать веб сайт и его адаптировать. Об этом на Хабре <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.ridev.ru/g4" >уже писали</a></noindex>. К написанному в той статье мне бы хотелось добавить две вещи.</p>
<p>Во-первых, с появлением html 5 появилась возможность работы с локальными базами данных. И все браузере на движке WebKit (само собой последние апдейты) уже <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.ridev.ru/ga" >поддерживают</a></noindex> эту возможность. Работать с ней более чем просто.</p>
<pre class="brush: jscript;">
db = openDatabase(&quot;TestDB&quot;, &quot;1.0&quot;, &quot;HTML5 Database&quot;, 200000);
</pre>
<p>В функцию создания базы данных передаются следующие параметры:</p>
<ul>
<li>Название базы данных</li>
<li>Ее версия</li>
<li>Отображаемое имя</li>
<li>Размер в байтах</li>
</ul>
<p>Далее открываем транзакцию и выполняем нужные нам действия</p>
<pre class="brush: jscript;">
db.transaction(function(tx)
    {
      tx.executeSql(&quot;DELETE FROM tbl_test WHERE id = ?&quot;, [item.id]);
    });
</pre>
<p>Во-вторых, стоит сказать об оффлайновом режиме работы с помощью создания manifest-файла. Подробно об этом можно прочитать на сайте <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.ridev.ru/gu" >Apple</a></noindex>.<br />
Вкратце что это такое. Манифест это обыкновенный файл, такой же, как например, css или js, содержащий в себе информацию о кэше приложения. Когда вы первый раз заходите на страницу, ресурсы, указанные в этом файле кэшируются.</p>
<p>Теперь как все выглядит на деле:</p>
<ol>
<li>Указываем ссылку на файл на нужной нам странице
<pre class="brush: xml;">
&lt;html manifest=&quot;demo.manifest&quot;&gt;
</pre>
</li>
<li>Создаем сам файл.
<pre class="brush: jscript;">
CACHE MANIFEST

demoimages/clownfish.jpg
demoimages/clownfishsmall.jpg
demoimages/flowingrock.jpg
demoimages/flowingrocksmall.jpg
demoimages/stones.jpg
demoimages/stonessmall.jpg
</pre>
<p>И после этого все работает. С кэшем можно работать — апдейтить его, обрабатывать события и так далее. Все это мне очень понравилось, но мне стало интересно, а есть ли какие-то специальные фреймворки. Оказалось есть.</li>
</ol>
<h4>Способ второй — jQTouch</h4>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/jqtouch.png" ><img class="alignnone size-full wp-image-1254" title="jQTouch" src="http://mobile-developer.ru/wp-content/uploads/2010/02/jqtouch.png" alt="" width="500" height="297" /></a></p>
<p>О <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.jqtouch.com/" >jQTouch</a></noindex> уже немного <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.ridev.ru/gl" >писали</a></noindex>. Хочу рассказать немного подробнее о том, что он умеет.</p>
<blockquote><p>jQTouch — Это такой плагин к известному Javascript-фреймворку jQuery, позволяющий очень просто создавать веб-приложения для тачфонов — телефонов с сенсорным экраном, причём с пальцеориентированным интерфейсом. Каким и является iPhone. А так же HTC Hero, Dream, Magic — на Android — и куча разных WM-коммуникаторов с оболочками. © (<noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.ridev.ru/gW" >оригинал</a></noindex>)</p></blockquote>
<p>Перечислю основные фишки:</p>
<ul>
<li>Очень легко управлять поведением компонент</li>
<li>Есть возможность создавать темы</li>
<li>Есть небольшое взаимодействие с телефоном — например можно узнать его ориентацию</li>
<li>Поддерживается анимация и различные фишки интерфейса айфона</li>
<li>Это jQuery и этим все сказано</li>
</ul>
<p>Плагин очень приятный, но все таки на выходе мы имеем не полноценное приложение. Почему? У нас нет доступа к таким вещам как акселерометр, вибрация, звук и так далее. После этого я снова полез в гугл и нашел такую отличную вещь как <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://phonegap.com/" >PhoneGap</a></noindex>.</p>
<h4>Способ третий — PhoneGap</h4>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/phonegap.png" ><img class="alignnone size-full wp-image-1255" title="PhoneGap" src="http://mobile-developer.ru/wp-content/uploads/2010/02/phonegap.png" alt="" width="200" height="200" /></a></p>
<p>Суть данного фреймворка состоит в том, что написав один раз приложение с помощью html и js, мы сможем транслировать его в приложение под нужную платформу. А платформы он поддерживает вот такие: iPhone, Android, Blackberry (OS 4.5), Symbian, Windows Mobile, Palm, Maemo. В случае айфона мы опять возвращаемся к тому, с чего начали — нужен макбук, лицензия и все дела. Но фреймворк все равно отличный.</p>
<p>Ниже представлен roadmap данного проекта.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/phonegap-roadmap.png" ><img class="alignnone size-full wp-image-1256" title="PhoneGap Roadmap" src="http://mobile-developer.ru/wp-content/uploads/2010/02/phonegap-roadmap.png" alt="" width="569" height="432" /></a></p>
<p>Приятный бонусом данного продукта является наличие <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://phonegap.com/download" >симулятора</a></noindex>, на котором можно оттестировать написанное приложение. Рекомендую поставить и поиграться.</p>
<p>Необходимость трансляции немного напрягала и дальнейшие поиски вывели меня на конкурента PhoneGap — <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.motherapp.com/" >MotherApp</a></noindex></p>
<h4>Способ четвертый — MotherApp</h4>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/motherapp.gif" ><img class="alignnone size-full wp-image-1257" title="MotherApp" src="http://mobile-developer.ru/wp-content/uploads/2010/02/motherapp.gif" alt="" width="192" height="42" /></a></p>
<p>Суть этого проекта такова:</p>
<ul>
<li>Пишем приложение с использованием предложенной js-библиотеки</li>
<li>Устанавливаем все что нужно на сервер</li>
<li><strong>И самое главное</strong> — отдаем ссылку на свое приложение парням из MotherApp, которые все за нас транслируют</li>
</ul>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/motherapp-scheme.gif" ><img class="alignnone size-full wp-image-1258" title="MotherApp Схема" src="http://mobile-developer.ru/wp-content/uploads/2010/02/motherapp-scheme.gif" alt="" width="331" height="345" /></a></p>
<p>Как видите, сервис хорошо монетизирован =)<br />
А если серьезно вполне серьезная и мощная по своим возможностям вещь. По <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.ridev.ru/gz" >ссылке</a></noindex> список возможностей с картинками.</p>
<p>Как говорил один персонаж, становится все любопыственнее и любопытсвеннее. Уже из спортивного интереса, я нашел почти то что искал:</p>
<ul>
<li>Возможность написания на html и js</li>
<li>Полное отсутствие трансляции</li>
<li>Возможность использовать функции телефона</li>
</ul>
<p>И как всегда было одно но. Сначала необходимо поставить отдельное приложение на айфон, чтобы запустить свое. И я говорю о <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.big5apps.com/" >Big5</a></noindex>.</p>
<h4>Способ пятый — Big5</h4>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/big5.png" ><img class="alignnone size-full wp-image-1259" title="big5" src="http://mobile-developer.ru/wp-content/uploads/2010/02/big5.png" alt="" width="57" height="57" /></a></p>
<p>Здесь все еще проще.<br />
Пишем свое приложение с использованием js-библиотеки, скачиваем приложение из аппсторе и вводим адрес своего сайта.<br />
В своей сути, big5 — это альтернативный бразуер, но с доступом к нативным функциям телефона. Большой вопрос, как к этом отнесется Apple и не повторится ли здесь судьба <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.ridev.ru/gt" >PhoneGap</a></noindex>. Но факт остается фактом, написав веб приложение, мы в итоге получаем полноценное приложение под айфон. Насколько полноценное зависит от пользователя, так как в аппстор есть две версии приложения big5: бесплатная lite и платная за 10$.<br />
На сайте big5 заявлено, что разработка под их приложение, это просто веб разработка, так что все что было описано в первом пункте так же справедливо и тут.</p>
<p>Ну и в завершении, хочется представить еще одного кандидата. Но он, пожалуй, больше придется по душе тем, кто выбрал Ruby on rails. Итак, встречайте — <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://rhomobile.com/products/rhodes/" >Rhodes</a></noindex>.</p>
<h4>Способ отдельный — Rhodes</h4>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/rhomobile-logo.png" ><img class="alignnone size-full wp-image-1260" title="rhomobile" src="http://mobile-developer.ru/wp-content/uploads/2010/02/rhomobile-logo.png" alt="" width="147" height="98" /></a></p>
<p>Этот продукт отчасти напоминает процессом своей разработки, который представлен ниже, MotherApp.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2010/02/RhodesArchitecture.jpg" ><img class="alignnone size-full wp-image-1261" title="Rhodes Architecture" src="http://mobile-developer.ru/wp-content/uploads/2010/02/RhodesArchitecture.jpg" alt="" width="579" height="299" /></a></p>
<p>Rhodes опять же работает со всеми нативными вещами, вплоть до файловой системы. Поддерживает он следующие платформы: iPhone, Windows Mobile, BlackBerry, Symbian и Android. Язык у данного фреймворка очень похож на ruby, так что рубисты дерзайте. Пока что сложно найти какие либо отзывы.</p>
<p>И в завершении, тем, кого данная тема увлечет, хочу порекомендовать книгу от O`Reilly — <a href="http://building-iphone-apps.labs.oreilly.com/">Building iPhone Apps with HTML, CSS, and Javascript<br />
Making App Store Apps Without Objective-C or Cocoa</a>. По ссылке ее официальный электронный вариант.</p>
<p>Спасибо за внимание!</p>
<p><a href="http://andrebrov.blogspot.com/2010/02/web-iphone.html"  target="_blank">Статья &#8220;Разработка под Mac OS X и iPhone&#8221; в блоге автора</a>.</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/tools/web-razrabotka-pod-iphone/" >Web разработка под iPhone</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/tools/web-razrabotka-pod-iphone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Route Me — альтернатива встроенному Google Maps контролу из iPhone SDK 3.0+</title>
		<link>http://mobile-developer.ru/iphone/route-me-alternativa-vstroennomu-google-maps-kontrolu-iz-iphone-sdk-3-0/</link>
		<comments>http://mobile-developer.ru/iphone/route-me-alternativa-vstroennomu-google-maps-kontrolu-iz-iphone-sdk-3-0/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 12:54:41 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1188</guid>
		<description><![CDATA[Сегодня у нас статья хабрапользователя slatvick о разработке iPhone-приложений, отображающих карты. Введение Я уже устал от ограниченности встроенного контрола карт, даже скорее от прикручивания кастылей. Постой пример: Google Maps app маршрут показывать умеет, a контрол не умеет. Приходится рисовать своими силами поверх карты. Сейчас передо мной стоит конкретная задача: надо добавить отображение пройденного маршрута и [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/route-me-alternativa-vstroennomu-google-maps-kontrolu-iz-iphone-sdk-3-0/">Route Me — альтернатива встроенному Google Maps контролу из iPhone SDK 3.0+</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/route-me-alternativa-vstroennomu-google-maps-kontrolu-iz-iphone-sdk-3-0/&title=Route+Me+—+альтернатива+встроенному+Google+Maps+контролу+из+iPhone+SDK+3.0+&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Сегодня у нас статья хабрапользователя <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://http://slatvick.habrahabr.ru/"  target="_blank">slatvick</a></noindex> о разработке iPhone-приложений, отображающих карты.</p>
<h4>Введение</h4>
<p>Я уже устал от ограниченности встроенного контрола карт, даже скорее от  прикручивания кастылей. Постой пример: Google Maps app маршрут  показывать умеет, a контрол не умеет. Приходится рисовать своими силами  поверх карты.</p>
<p>Сейчас передо мной стоит конкретная задача: надо добавить отображение  пройденного маршрута и его экспорт (share) в мое скромное приложение <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://itunes.apple.com/us/app/gps-speed/id344223674?mt=8" >GPS  Speed</a></noindex>, которое, кстати, уже который день висит в Топ 30 <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=6010&amp;id=25220&amp;popId=27" >американского  App Store в разделе Navigation</a></noindex>. Причина для меня остается загадкой,  потому как приложение среднее и уникальностью не блещет.</p>
<p>Возвращаюсь к проблеме. Нужный функционал уже реализованПочти  рабочие кастыли для Google Maps уже сделаны, но это хороший шанс пролить  свет на альтернативы Google Maps для iPhone SDK.<br />
<span id="more-1188"></span></p>
<h4>Мат часть</h4>
<p>Еще когда не было официального контрола карт, я работал с такими  «заменителями»:</p>
<h5><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://code.google.com/p/route-me/" >Route Me:</a></noindex></h5>
<ol>
<li>BSD лицензия (решать вам хорошо это или плохо)</li>
<li>поддержка многих источников карт: OpenStreetMap, Microsoft Virtual  Earth, Cloud Made, Yahoo Maps и другие менеее популярные</li>
<li>сформированное активное сообщество разработчиков — <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://groups.google.com/group/route-me-map" >Google Group</a></noindex></li>
</ol>
<h5><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://developers.cloudmade.com/projects/show/iphone-api" >Cloud  Made:</a></noindex></h5>
<ol>
<li>часть большого проекта и имеет официальную команду разработки  (воспользуюсь случаем и передам привет Диме <img src='http://mobile-developer.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , потому потенциально  имеет большую интеграцию с <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://maps.cloudmade.com/" >картами  Cloud Made</a></noindex></li>
<li>имеет много тем (цветовые наборы) для карт</li>
<li>использовал весной, было еще сырое</li>
</ol>
<p>Хочу начать цикл статей с чего то простого, например, встроить карты в  приложение и дать пользователю возможность выбирать источник карт. Я  предпочитаю Route Me, потому как, кроме всего остального, он может  показыват и Cloud Made.</p>
<h4>Подготовка</h4>
<ol>
<li>Откройте xCode и создайте новый проект. Я выбрал View-Based  Application и назвал его RouteMeSourceSelection</li>
<li>Загрузите последнюю <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://code.google.com/p/route-me/downloads/list" >версию Route Me</a></noindex></li>
<li>Установите контрол шаг за шагом <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://code.google.com/p/route-me/wiki/EmbeddingGuide" >по этому  гайду</a></noindex></li>
</ol>
<p>После этого у вас должен быть компилируемый проект. Есле возникли какие  то проблемы, то можете <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://github.com/slatvick/Alterplay-iPhone-dev-tips/tree/gh-pages/RouteMeSourceSelection/" >скачать  исходники этого примера</a></noindex> и сравнить.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-shot.png" ><img class="alignnone size-full wp-image-1189" title="routeme-shot" src="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-shot.png" alt="routeme-shot" /></a></p>
<h4>Добавляем контрол (код)</h4>
<p>Открываем хедер UIViewController (мой называется  «RouteMeSourceSelectionViewController.h») и:</p>
<ol>
<li>#import «RMMapView.h»</li>
<li>добавляем протокол «RMMapViewDelegate»</li>
<li>создаем IBOutlet RMMapView *mapView;</li>
</ol>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-shot-2.png" ><img class="alignnone size-full wp-image-1190" title="routeme-shot-2" src="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-shot-2.png" alt="routeme-shot-2" /></a></p>
<p>Переопределяем метод &#8220;- (void)viewDidLoad&#8221;:</p>
<pre class="brush: cpp;">
- (void)viewDidLoad {
[super viewDidLoad];

[RMMapView class]; // важно! без этого карта не покажется.  стеснительная.
[mapView setDelegate:self];
}
</pre>
<h4>Добавляем контрол (дизайн)</h4>
<ol>
<li>Открываем .xib file в Interface Builder (IB)</li>
<li>Добавляем UIView (subview) в уже существующий и определяем его, как  RMMapView</li>
<li>Соединяем IBOutlet из нашего UIViewController с только что созданным  RMMapView</li>
</ol>
<p>Понимаю, что трудно воспринимать такой текст. Короче, должно выглядеть  вот так:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-shot-3.png" ><img class="alignnone size-full wp-image-1191" title="routeme-shot-3" src="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-shot-3.png" alt="routeme-shot-3" /></a></p>
<p>Теперь, запустив приложение, вы должны увидеть карту с источником по  умолчанию — Open Street Maps. Я вижу такое, надеюсь вы тоже:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-shot-5.png" ><img class="alignnone size-full wp-image-1192" title="routeme-shot-5" src="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-shot-5.png" alt="routeme-shot-5" width="172" height="320" /></a></p>
<p>Все это было очень легко. Давайте дадим пользователю возможность  выбирать источник карты. Для этого разместим контрол UIPickerView и  свяжим его с нашим UIViewController.</p>
<h4>UIPickerView для выбора источника карты (код)</h4>
<p>Октрываем хедер контролера и добавляем два протокола  UIPickerViewDelegate и UIPickerViewDataSource, и несколько IBOutlet:</p>
<pre class="brush: cpp;">
@interface RouteMeSourceSelectionViewController : UIViewController
&lt;RMMapViewDelegate, UIPickerViewDelegate, UIPickerViewDataSource&gt;
{
    IBOutlet RMMapView *mapView;
    IBOutlet UIPickerView *mapSourcePicker;
    IBOutlet UIBarButtonItem *mapSettingsBarButton;
}
- (IBAction) showMapsSettings;
@end
</pre>
<p>Теперь реализуем несколько обязательных методов для UIPickerView. Это  просто, но будет полезным для тех, кто этого еще не делал:</p>
<pre class="brush: cpp;">
static NSArray *titles = nil;

- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row
forComponent:(NSInteger)component
{
    return [titles objectAtIndex:row];
}

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
    if (!titles)
    {
        titles = [[NSArray alloc] initWithObjects:
            @&quot;Open Street Maps&quot;,
            @&quot;Yahoo Map&quot;,
            @&quot;Virtual Earth Aerial&quot;,
            @&quot;Virtual Earth Hybrid&quot;,
            @&quot;Virtual Earth Road&quot;,
            @&quot;Cloud Made Map&quot;,
            nil];
    }
    return [titles count];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}
</pre>
<p>Создадим метод showMapsSettings для того, что бы показывать и прятать  UIPickerView, и еще для парочки UI трюков:</p>
<pre class="brush: cpp;">
- (IBAction) showMapsSettings
{
    BOOL toShow = [mapSourcePicker isHidden];
    if (toShow)
    {
        [mapSettingsBarButton setStyle:UIBarButtonItemStyleDone];
    }
    else // hidding
    {
        [mapSettingsBarButton setStyle:UIBarButtonItemStyleBordered];
        [self setMapSourceWithNumber:[mapSourcePicker  selectedRowInComponent:0]];
    }
    [mapSourcePicker setHidden:![mapSourcePicker isHidden]];
    [mapView setUserInteractionEnabled:[mapSourcePicker isHidden]];
}
</pre>
<p>А теперь самое главное — метод для изменения источника карты. Если были  внимательны, то видели, что он вызывается в «showMapsSettings». Тут есть  небольшой трюк: карта не обновляется автоматически при смене источника,  потому приходится сдвигать и возвращать в прежнее положение. Это  незаметно для пользователя. В самом конце сохраняем выбранный номер  источника в общие настройки приложения.</p>
<pre class="brush: cpp;">
#import &quot;RMVirtualEarthSource.h&quot;
#import &quot;RMYahooMapSource.h&quot;
#import &quot;RMCloudMadeMapSource.h&quot;
#import &quot;RMOpenStreetMapsSource.h&quot;

#define CONST_MAP_KEY_bing @&quot;&quot;
#define CONST_MAP_KEY_cloud @&quot;&quot;

- (void) setMapSourceWithNumber:(int)number
{
    if (mapSourceNumber == number)
        return;

    switch (number) {
        case 0:
            mapView.contents.tileSource = [[RMOpenStreetMapsSource alloc] init];
            break;
        case 1:
            mapView.contents.tileSource = [[RMYahooMapSource alloc] init];
            break;
        case 2:
            mapView.contents.tileSource = [[RMVirtualEarthSource alloc] initWithAerialThemeUsingAccessKey:CONST_MAP_KEY_bing];
            break;
        case 3:
            mapView.contents.tileSource = [[RMVirtualEarthSource alloc]  initWithHybridThemeUsingAccessKey:CONST_MAP_KEY_bing];
            break;
        case 4:
            mapView.contents.tileSource = [[RMVirtualEarthSource alloc]  initWithRoadThemeUsingAccessKey:CONST_MAP_KEY_bing];
            break;
        case 5:
            mapView.contents.tileSource = [[RMCloudMadeMapSource alloc]  initWithAccessKey:CONST_MAP_KEY_cloud styleNumber:1];
            break;
        default:
            return;
            break;
    }
    // this trick refreshs maps with new source
    [mapView moveBy:CGSizeMake(640,960)];
    [mapView moveBy:CGSizeMake(-640,-960)];
    mapSourceNumber = number;
    // remember user choice between runnings
    [[NSUserDefaults standardUserDefaults] setInteger:mapSourceNumber  forKey:@&quot;mapSourceNumber&quot;];
}
</pre>
<p>Для того, что бы заработали карты Cloud Made и Virtual Earth (Bing) надо  получить «developer API key»:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://cloudmade.com/user/show" >http://cloudmade.com/user/show</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.bing.com/developers/appids.aspx" >http://www.bing.com/developers/appids.aspx</a></noindex></li>
</ul>
<p>Последнее, что я бы хотел добавить это запоминание выбора пользователя  между запусками нашей программы. Модифицируем метод «viewDidLoad»:</p>
<pre class="brush: cpp;">
- (void)viewDidLoad {
    [super viewDidLoad];
    [RMMapView class];
    [mapView setDelegate:self];

    int number = [[NSUserDefaults standardUserDefaults]  integerForKey:@&quot;mapSourceNumber&quot;];
    [self setMapSourceWithNumber:number];
    [mapSourcePicker selectRow:mapSourceNumber inComponent:0 animated:NO];
}
</pre>
<h4>UIPickerView для выбора источника карты (дизайн)</h4>
<p>Открываем IB и:</p>
<ol>
<li>добавляем UIToolbar с одной кнопкой UIBarButtonItem, соединенной с  ее IBOutlet из контроллера</li>
<li>соединяем событие нажатия на UIBarButtonItem с showMapsSettings  IBAction</li>
<li>добавляем UIPickerView над картой и делаем ее скрытой (hidden)</li>
<li>соединяем UIPickerView с его IBOutlet и устанавливаем его delegate и  dataSource, как «file&#8217;s owner»</li>
</ol>
<p>Опять же картинка заменит тысячу слов:</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-last-design.png" ><img class="alignnone size-full wp-image-1193" title="routeme-last-design" src="http://mobile-developer.ru/wp-content/uploads/2009/12/routeme-last-design.png" alt="routeme-last-design" /></a></p>
<p>Если все сделано верно и ни я, ни вы ни чего не забыли, то вы увидите  рабочее приложение:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/Nj8DIgz4BgM&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/Nj8DIgz4BgM&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Все что было показано используется в реальном приложении — <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://itunes.apple.com/us/app/meeting-point/id315768974?mt=8" >Meeting  Point, оно бесплатное, попробуйте</a></noindex>.</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://github.com/slatvick/Alterplay-iPhone-dev-tips/tree/gh-pages/RouteMeSourceSelection/" >Загрузить  исходики можно тут</a></noindex><br />
<a href="http://iphone-dev-tips.alterplay.com/2009/12/routeme-is-alternative-map-control-to.html" >Английский  вариант статьи из моего тех.блога</a></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/route-me-alternativa-vstroennomu-google-maps-kontrolu-iz-iphone-sdk-3-0/" >Route Me — альтернатива встроенному Google Maps контролу из iPhone SDK 3.0+</a></p>
<p style="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "pub-5188470588945412";
/* 468x60 - mobile-developer.ru */
google_ad_slot = "3657023452";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/route-me-alternativa-vstroennomu-google-maps-kontrolu-iz-iphone-sdk-3-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вышел MonoTouch 1.4</title>
		<link>http://mobile-developer.ru/iphone/vyshel-monotouch-1-4/</link>
		<comments>http://mobile-developer.ru/iphone/vyshel-monotouch-1-4/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 12:11:14 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[Market]]></category>
		<category><![CDATA[SDK]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MonoTouch]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1162</guid>
		<description><![CDATA[Вышла новая версия инструментария разработки .NET-приложений для iPhone &#8211; MonoTouch 1.4. Нововведения вот какие: Значительно увеличена скорость запуска MonoTouch-приложений На треть уменьшен размер результирующих бинарников Много улучшений в отладчике Куча полезных улучшений в коде, связывающем Objective C API с MonoTouch API; AudioToolbox — новый низкоуровневый API для работы с аудио (я так ждал этого!); Другие [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vyshel-monotouch-1-4/">Вышел MonoTouch 1.4</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/vyshel-monotouch-1-4/&title=Вышел+MonoTouch+1.4&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Вышла новая версия инструментария разработки .NET-приложений для iPhone &#8211; <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://monotouch.net/"  target="_blank">MonoTouch 1.4</a></noindex>. <a href="../wp-content/uploads/2009/10/monotouch.jpg"><img title="MonoTouch" src="../wp-content/uploads/2009/10/monotouch.jpg" alt="MonoTouch" width="259" height="55" /></a></p>
<p>Нововведения вот какие:</p>
<ul>
<li>Значительно увеличена скорость запуска MonoTouch-приложений</li>
<li>На треть уменьшен размер результирующих бинарников</li>
<li>Много улучшений в отладчике</li>
<li>Куча полезных улучшений в коде, связывающем Objective C API с MonoTouch API;</li>
<li>AudioToolbox — новый низкоуровневый API для работы с аудио (я так ждал этого!);</li>
<li>Другие мелкие багфиксы.</li>
</ul>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://monotouch.net/Releases/MonoTouch_1.4"  target="_blank">С полным списком нововведений в MonoTouch 1.4 можно ознакомиться здесь.</a></noindex></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vyshel-monotouch-1-4/" >Вышел MonoTouch 1.4</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/vyshel-monotouch-1-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Видео: Создание Flash-приложений для iPhone</title>
		<link>http://mobile-developer.ru/iphone/video-sozdanie-flash-prilozhenij-dlya-iphone/</link>
		<comments>http://mobile-developer.ru/iphone/video-sozdanie-flash-prilozhenij-dlya-iphone/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 15:54:10 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1138</guid>
		<description><![CDATA[На GotoAndLearn.com появился видео-урок, описывающий процесс создания Flash-приложения для iPhone с использованием Flash CS5. Видео также доступно для загрузки и оффлайн-просмотра. В видео показазан процесс создания Flash-приложения с простейшей анимацией, написание обработчиков событий от акселерометра на Action Script, а также описан процесс настройки компиляции приложения в CS5 и загрузка на устройство. Post from: Mobile-Developer.ruВидео: Создание [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/video-sozdanie-flash-prilozhenij-dlya-iphone/">Видео: Создание Flash-приложений для iPhone</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/video-sozdanie-flash-prilozhenij-dlya-iphone/&title=Видео:+Создание+Flash-приложений+для+iPhone&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>На GotoAndLearn.com <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://gotoandlearn.com/play?id=116"  target="_blank">появился видео-урок</a></noindex>, описывающий процесс создания Flash-приложения для iPhone с использованием Flash CS5. Видео также доступно для загрузки и оффлайн-просмотра.</p>
<p>В видео показазан процесс создания Flash-приложения с простейшей анимацией, написание обработчиков событий от акселерометра на Action Script, а также описан процесс настройки компиляции приложения в CS5 и загрузка на устройство.</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/video-sozdanie-flash-prilozhenij-dlya-iphone/" >Видео: Создание Flash-приложений для iPhone</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/video-sozdanie-flash-prilozhenij-dlya-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вышел MonoTouch 1.2 &#8211; .NET для iPhone</title>
		<link>http://mobile-developer.ru/iphone/vyshel-monotouch-1-2-net-dlya-iphone/</link>
		<comments>http://mobile-developer.ru/iphone/vyshel-monotouch-1-2-net-dlya-iphone/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 11:25:16 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[SDK]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MonoTouch]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1112</guid>
		<description><![CDATA[Вышла новая версия средств разработки iPhone приложений на платформе .NET &#8211; MonoTouch 1.2. Наконец-то добавили нормальный отладчик с интеграцией в MonoDevelop и отлаживать теперь можно и в симуляторе и на устройстве. Появился новый Binding API, который позволяет связывать библиотеки на Objective-C с приложением на .NET/MonoTouch. Добавлены пространства имен System.Timers.Timer, System.Threading.Semaphore, System.Threading. Исправлены ошибки, OpenTK обновлен [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vyshel-monotouch-1-2-net-dlya-iphone/">Вышел MonoTouch 1.2 &#8211; .NET для iPhone</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/vyshel-monotouch-1-2-net-dlya-iphone/&title=Вышел+MonoTouch+1.2+&#8211;+.NET+для+iPhone&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Вышла новая версия средств разработки iPhone приложений на платформе .NET &#8211; MonoTouch 1.2. Наконец-то добавили нормальный отладчик с интеграцией в MonoDevelop и отлаживать теперь можно и в симуляторе и на устройстве.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/11/monorouch-1.2-debugger.png" ><img class="alignnone size-full wp-image-1114" title="MonoTouch 1.2 Debugger" src="http://mobile-developer.ru/wp-content/uploads/2009/11/monorouch-1.2-debugger.png" alt="MonoTouch 1.2 Debugger" /></a></p>
<ul>
<li>Появился новый Binding API, который позволяет связывать библиотеки на Objective-C с приложением на .NET/MonoTouch.</li>
<li>Добавлены пространства имен System.Timers.Timer, System.Threading.Semaphore, System.Threading.</li>
<li>Исправлены ошибки, OpenTK обновлен до r2350</li>
<li>Добавлено пространство имен System.Data и теперь можно использовать SQLite в своих приложениях.</li>
</ul>
<p><strong>Ссылки</strong></p>
<ul>
<li><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://monotouch.net/Documentation/Binding_New_Objective-C_Types"  target="_blank">Binding API для MonoTouch</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://monotouch.net/Releases/MonoTouch_1.2"  target="_blank">Release Notes для MonoTouch 1.2</a></noindex></li>
</ul>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://habrahabr.ru/blogs/mono/74318/" >&copy;</a></noindex></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vyshel-monotouch-1-2-net-dlya-iphone/" >Вышел MonoTouch 1.2 &#8211; .NET для iPhone</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/vyshel-monotouch-1-2-net-dlya-iphone/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Вышел MonoTouch 1.1 &#8211; .NET-инструментарий для разработки под iPhone</title>
		<link>http://mobile-developer.ru/iphone/vyshel-monotouch-1-1-net-instrumentarij-dlya-razrabotki-pod-iphone/</link>
		<comments>http://mobile-developer.ru/iphone/vyshel-monotouch-1-1-net-instrumentarij-dlya-razrabotki-pod-iphone/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 16:24:20 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[SDK]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=1031</guid>
		<description><![CDATA[Вышла новая версия MonoTouch, инструментария разработки .NET-приложений для iPhone. Нововведения: Поддержка всех API из iPhone SDK 3.1 Размер сборок уменьшен на 30% Скорость запуска приложений увеличена в 2 раза! Поддержка Web-сервисов и экспериментальная поддержка WCF! В IDE MonoDevelop теперь есть механизм обновления. Куча багфиксов Судя по описанию, прям счастье какое-то, особенно поддержка Web-сервисов радует! Узнать [...]<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vyshel-monotouch-1-1-net-instrumentarij-dlya-razrabotki-pod-iphone/">Вышел MonoTouch 1.1 &#8211; .NET-инструментарий для разработки под iPhone</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/vyshel-monotouch-1-1-net-instrumentarij-dlya-razrabotki-pod-iphone/&title=Вышел+MonoTouch+1.1+&#8211;+.NET-инструментарий+для+разработки+под+iPhone&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Вышла новая версия <strong>MonoTouch</strong>, инструментария разработки .NET-приложений для iPhone.</p>
<p>Нововведения:</p>
<ul>
<li>Поддержка всех API из iPhone SDK 3.1</li>
<li>Размер сборок уменьшен на 30%</li>
<li>Скорость запуска приложений увеличена в 2 раза!</li>
<li>Поддержка Web-сервисов и экспериментальная поддержка WCF!</li>
<li>В IDE MonoDevelop теперь есть механизм обновления.</li>
<li>Куча багфиксов</li>
</ul>
<p>Судя по описанию, прям счастье какое-то, особенно поддержка Web-сервисов радует!</p>
<p><noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://monotouch.net/Releases/MonoTouch_1.1"  target="_blank">Узнать больше о новшествах в версии 1.1</a></noindex></p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vyshel-monotouch-1-1-net-instrumentarij-dlya-razrabotki-pod-iphone/" >Вышел MonoTouch 1.1 &#8211; .NET-инструментарий для разработки под iPhone</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/vyshel-monotouch-1-1-net-instrumentarij-dlya-razrabotki-pod-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Все элементы iPhone 3.0 GUI в PSD</title>
		<link>http://mobile-developer.ru/iphone/vse-elementy-iphone-3-0-gui-v-psd/</link>
		<comments>http://mobile-developer.ru/iphone/vse-elementy-iphone-3-0-gui-v-psd/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 14:00:24 +0000</pubDate>
		<dc:creator>T-Rex</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://mobile-developer.ru/?p=916</guid>
		<description><![CDATA[Доступен PSD файл, содержащий все элементы пользовательского интерфейса для iPhone OS 3.0. Незаменимая вещь для прототипирования пользовательских интерфейсов iPhone-приложений. Скачать можно здесь (или здесь). Post from: Mobile-Developer.ruВсе элементы iPhone 3.0 GUI в PSD<p>Post from: <a href="http://mobile-developer.ru">Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vse-elementy-iphone-3-0-gui-v-psd/">Все элементы iPhone 3.0 GUI в PSD</a></p>
]]></description>
			<content:encoded><![CDATA[<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://mobile-developer.ru/iphone/vse-elementy-iphone-3-0-gui-v-psd/&title=Все+элементы+iPhone+3.0+GUI+в+PSD&srcURL=http://mobile-developer.ru" target="_blank" rel="nofollow"><img
src="http://mobile-developer.ru/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><p>Доступен PSD файл, содержащий все элементы пользовательского интерфейса для iPhone OS 3.0. Незаменимая вещь для прототипирования пользовательских интерфейсов iPhone-приложений.</p>
<p><a href="http://mobile-developer.ru/wp-content/uploads/2009/09/iphonegui_3_0.jpg" ><img class="alignnone size-full wp-image-917" title="iPhone GUI PSD" src="http://mobile-developer.ru/wp-content/uploads/2009/09/iphonegui_3_0.jpg" alt="iPhone GUI PSD" width="573" height="355" /></a></p>
<p>Скачать можно <noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://depositfiles.com/files/jgyl7879i" title="Скачать iPhone GUI PSD"  target="_blank">здесь</a></noindex> (<noindex><a rel="nofollow" href="http://mobile-developer.ru/goto/http://www.teehanlax.com/blog/?p=1628"  target="_blank">или здесь</a></noindex>).</p>
<p>Post from: <a href="http://mobile-developer.ru" >Mobile-Developer.ru</a><br/><br/><a href="http://mobile-developer.ru/iphone/vse-elementy-iphone-3-0-gui-v-psd/" >Все элементы iPhone 3.0 GUI в PSD</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mobile-developer.ru/iphone/vse-elementy-iphone-3-0-gui-v-psd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
