Первый опыт разработки iOS-приложения и размышления о маркетинге и рекламе

… в общем создал я игру. А дело было так.

Несколько месяцев назад подошёл мой начальник и обрадовал, что с сегодняшнего дня, в дополнение к своим основным обязанностям, я должен буду делать iOS-приложения (не сильно сложные, но по работе необходимые), что Mac mini мне купили и что я самый опытный из всех по части продукции Apple (это правда, т.к. ваш скромный слуга уже четвёртый год ходит с 1-м iPad). Ну ладно.

Через две-три недели, когда был получен небольшой опыт в работе с Mac OS X, XCode и Objective-C, я понял, что было бы здорово создать своё приложение с нуля и познать процесс разработки от идеи до выкладывания в AppStore. Так я и сделал, принеся в жертву лень и свободное время по вечерам.

В качестве среды разработки (а дома у меня компьютера с MacOS X нет) была выбрана виртуальная машина VMWare с MacOS X Mountain Lion от ребят из iAtkos (на моём ноутбуке с Intel Core i7 машина работала весьма достойно). В качестве идеи была выбрана игра, которую я всё собирался сделать, да никак не доходили руки: простой плиточный пазл. Я рассудил, что для неопытного разработчика (это про меня) создать игровую механику будет не сложно (так и оказалось). Чтобы игра была уникальной, было решено использовать картинки, что рисует мой папа (да, он художник) в свободное от работы время для развлечения. А чтоб было совсем хорошо, было решено для некоторых пазлов показывать видео того, как они рисовались (такие ролики на YouTube многим нравятся и я не исключение).

Каркас игры был сделан быстро и началось создание дизайна, что далось, если честно, с трудом. За основу был взят мой старый набросок:

image

Магией Photoshop этот рисунок был превращён в такое:

image

Это не шедевр, но, как мне показалось, и не совсем кошмар, так что на этом варианте и остановились.

Когда игра была готова на 70%, то она была показана коллегам по работе, от которых были получены очень хорошие советы по графической части («ужасная иконка», «цвета надписей сменить» и т.д.). Кроме того, советовали быстрее выкладывать в AppStore, когда всё исправлю. Но я стал упрямиться, т.к. хотел приделать помощницу, которая бы при запуске программы рассказывала о том, что нужно знать пользователю. Так что релиз был отложен.

Музыка и звуки — очень важная часть программы-игры, поэтому решено было не скупиться и потратить денег. В итоге на сайте www.pond5.com было куплено медиафайлов на 2115 руб. Да, дороговато, поэтому музыку, которая сопровождает видео, было решено взять у хороших ребят из Destiny Records и OnAirStudio, про которых я случайно узнал от русского летсплейщика Артура (BlackSilverUFA), за что ему отдельная благодарность. Эти команды создают хорошую качественную музыку и позволяют использовать в своих проектах, при условии, что ты скажешь про них где-нибудь: внутри программы или в описании к YouTube-видео. Я поблагодарил их в разделе About.

В процессе работы над музыкой было решено купить для разнообразия лицензию разработчика Apple и проверить, как игра работает на физическом устройстве (мы к тому времени с коллегами купили iPhone 4 на четверых). Как выяснилось, плохо. Дело в том, что для сохранений я использую базу данных SQLite (с которой работаю, кстати, через https://github.com/ccgus/fmdb, что сильно упростило процесс разработки) и на физическом устройстве в эту базу ничего не писалось, хотя на эмуляторе всё было здорово. Помог сайт stackoverflow.com, на котом я узнал, что базу нужно копировать в директорию, доступную для записи. В итоге, в ViewDidLoad был добавлен код:

   NSArray *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
   NSString *cacheDir = [cachePath objectAtIndex:0];
   gameSavesDB = [cacheDir stringByAppendingPathComponent:@"gameSaves.db"];
   NSFileManager *fileManager = [NSFileManager defaultManager];
   if (![fileManager fileExistsAtPath:gameSavesDB]){
      NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"gameSaves.db"];
      NSError *error;
      [fileManager copyItemAtPath:databasePathFromApp toPath:gameSavesDB error:&error];
      if (error != nil){
         NSLog(@"[Database: Error]%@", error);
      }
   }

Больше в программе проблем не было и на физическом устройстве всё работало на удивление хорошо.

В качестве монетизации был выбран вариант с In App Purchase, т.к. реклама в мобильных приложениях мне не очень нравится. От том, как работать с In App, очень хорошо написал epazzz в статье «iPhone разработка: Интегрируем In-App Purchases». Но код и дополнительные сведения я всё же взял здесь (см. ответ пользователя Jojodmo): stackoverflow.com/questions/19556336/how-do-you-add-an-in-app-purchase-to-an-ios-application. Это сильно упростило и ускорило разработку. В итоге получилась такая логика: в игре доступно 15 бесплатных пазлов. Потом появляется окно с очень грустным котиком, который предлагает разблокировать всю игру. После этого деньги предполагается не просить никогда.
image

Теперь игра была полностью готова и наступила пора выкладывания в AppStore. Проверка длилась 10 дней. Видимо, потому, что review проходила как сама игра, так и In App Purchase. Один раз вернули со статусом Metadata Rejected и цензор написал, что он не понял, как у меня в программе In App найти. Видимо, в полях, помеченных как Notes, надо было не смайлики оставлять, а писать чёткую инструкцию человеку. Бывает. После того, как шаги были предоставлены, игра быстро появилась в магазине. И наступила последняя фаза…

Продвижение. Если честно, эта фаза длится до сих пор. Игра доступна уж полтора месяца, так что по поводу маркетинга был прочитан ряд статей, знания из которых пытаются применяться. Пока что получается не очень, нарабатывается опыт. Итак, что было сделано:
1. Были отправлены запросы на БЕСПЛАТНЫЙ обзор на сайты: appsafari.com, tuaw.com, appstoreapps.com, 148apps.com, mobilestartupz.com, iPhones.ru, appadvice.com, iPhones.ru, techmafia.net.
Итог: откликнулись только люди с techmafia.net (надо теперь для них статью на английском писать). От остальных пока ответа нет, но на большинстве англоязычных сайтов есть очень удобная форма для отправки запросов на обзор, так что, может, кому-нибудь пригодится.
2. Была сделана на 300 рублей реклама на Facebook. Это принесло стабильные 3 скачивания в день. С социальными сетями вообще в плане рекламы мобильного приложения эффективно работать не получилось. Но, наверное, дело во мне, т.к. я ими не пользуюсь и слабо представляю, как всё это работает.
3. Говорят, что можно сделать пост на pikabu и 9gag и это увеличит количество скачиваний. И есть даже положительный опыт. Но этими сайтами я не пользуюсь, на pikabu меня за дело обругали, так что я решил идею оставить на потом.
4. Что увеличило количество скачиваний вдвое, так это пятое обновление, которое принесло оптимизацию игры под экран iPad (раньше была лишь iPhone-версия).
5. С помощью сайтов sensortower.com, searchman.com и www.mobiledevhq.com была проведена работа над ключевыми словами. Также в iTunesConnect в поле Name помимо названия приложения были тоже вставлены ключевые слова (т.е. вместо, например, «От Севильи до Гренады» стало «От Севильи до Гренады – отличная головоломка для девушек» (эти названия не настоящие, а просто пример)).
6. Кроме того, по последним слухам, сильно влияет на скачиваемость приложения то, что страница в AppStore переведена на разные языки. Для меня это русский, английский и французский. Ничего про эффект сказать не могу, т.к. последний язык был добавлен совсем недавно и пока во Франции пользователей нет.
7. И конечно стандартное: наличие сайта со ссылкой на программу и промо-видео на YouTube. Сайт мы сделали вдвоём с коллегой по работе (у меня на работе очень много хороших людей), а видео было записано с помощью встроенных средств Mac OS X Yosemite, обработано на iPad в iMovie, а затем отправлено в Photoshop для накладывания фона. В итоге, получилось так:



И последнее на сегодняшний день, что было сделано — добавлена аналитика. Это было очень легко сделать с помощью сайта Parse.com. Легко, так как там очень продуманный интерфейс и пошаговая инструкция с указаниями, что конкретно надо делать. Так что аналитика добавилась за несколько минут и теперь я буду хотя бы знать, сколько пользователей дошли до диалога In App, а сколько не смогли решить даже первой головоломки.

В качестве завершения: стоимость разработки. Как видите, удалось уложиться в небольшую сумму:
— 2 000 рублей на iPhone 4;
— 100$ (по старому курсу) на лицензию разработчика;
— почти 2 115 рублей на звуки и музыку;
— 300 рублей на рекламу на Facebook;
— 340 рублей на тортик для коллег.

В Сети прочитал, что минимальная стоимость разработки iOS-приложения составляет 5000$. Видимо, когда высчитывалась эта сумма, учитывались какие-то ещё параметры, т.к. в моём случае явно вышло меньше. С другой стороны, у меня были очень хорошие условия разработки: по времени ограничения не было, недостатка в тестовых устройствах также не было, т.к. на работе есть весь ассортимент устр… В общем, не было проблем с устройствами. Тестирование проводилось сообща, вместе с коллегами, а перевод на английский, французский и немецкий делали две коллеги-переводчицы, за что им от меня огромная благодарность. А на украинский язык я перевёл сам (хотя пока в игре есть лишь русский и английский; остальные языки приделаю позже). Дизайн же создавался мною в Photoshop. Когда возникала необходимость в новых картинках (кнопки, котики, девушка-помощница), я объяснял всё моему художнику и он рисовал всё, что нужно. Потом, после бурного всплеска эмоций, картинки корректировались, дорисовывались и отдавались мне. И всё, естественно, бесплатно.

Заработка пока нет. Думаю, может, всё-таки дать людям выбор: либо купить In App, либо включить показ рекламы (несмотря на то, что в начале статьи я казал, что против неё). Буду рад доброму совету.

На этом прощаюсь. Кто прочитал – молодец, а кто устал – искренне прошу прощения. Пока-пока-пока.
Поделиться публикацией

Комментарии 44

    +2
    Для аналитики есть более подходящие инструменты, например Flurry и mixpanel.
      0
      Здорово. Благодарю, почитаю про них.
      А, если вкратце, чем они лучше Parse.Com? Или просто предоставляют больше возможностей?
        0
        А чем parse плох? Мне например нравится (хоть и это побочная фишка у него), хочу с фларри переехать на него.
        0
        Интересно было почитать.
        Тоже вникаю по немногу в iOS разработку, для разнообразия, т.к. очень давно занимаюсь вэбом, хочется что-нибудь новенькоее поделать.
          0
          Да, это было интересно. Кроме того, создавалось ощущение, что на ЛЮБОЙ мой вопрос был ответ где-нибудь в Сети, что радовало.
          0
          Удивительно, где нашли девайс за 2 т.р.?
          И дополнительно к нему вопрос: в 4 процессор 32-бит, сейчас не принудительна разработка в том числе и для 64-бит?
            0
            1. 2 тыс. рублей заплатил я сам. Ещё трое коллег скинулись по 2 т.р. Уже восемь тысяч. А за эти деньги можно было найти iPhone 4.
            2. На iPhone 4 было просто дополнительное тестирование. Кроме того, он использовался, когда можно было обойтись без эмулятора. А 64-х битное устройство дополнительно бралось со стороны у хороших людей. Кроме того, судя по письму от Apple, обязательная поддержка 64-х битных процессоров и iOS 8 SDK будет обязательна лишь с 1-го февраля этого года и лишь для НОВЫХ приложений. А с июня она будет обязательна и для обновлений.
              +3
              «еще трое коллег»
              Это прямо суп из топора. Случайно еще пару коллег не скинулось по паре миллионов?
                +2
                Написали бы в самой статье полную стоимость.
                Иначе получается, что «я потратил на разработку 10 рублей, а в сети пишут, что минимум тратится 100 рублей. Кстати, скинулось 10 человек, но я ведь потратил на игру всего 10 рублей, в сети лгут!»
                  0
                  Кстати, различие в цене объясняется контентом.
                  Вы рисовали сами, либо использовали какие-то готовые картинки (авторство не нарушили?), а при расчёте стоимости разработки учитывают стоимость контента. И стоимость может выходить в разы выше самой разработки
                  0
                  Вы бы намекнули начальнику, что для программирования под IOS необходимо устройство для тестирования. При чем за счет фирмы а не коллег.
                    0
                    Начальник у меня самый лучший. И на работе у меня недостатка в оборудовании нет. ^_^
                    Просто игру я делал исключительно дома, после работы по вечерам (возможно, я в статье не очень понятно написал). Поэтому пришлось выкручиваться виртуальной машиной и старым iPhone 4.
                      +1
                      Начальник у меня самый лучший.

                      … и читает Хабр!
                  0
                  Принудительно надо будет добавлять slice для 64-битной архитектуры. Это делается в настройках проекта и касается только старых проектов, в новых всё добавлено по умолчанию.

                  Во время разработки можно тестировать на 64-битном симуляторе, но перед релизом, конечно, лучше проверить на устройстве.
                  +5
                  > учитывались какие-то ещё параметры, т.к. в моём случае явно вышло меньше
                  Вы, наверное, работаете за бесплатно. ;)

                    +1
                    И это, судя по всему, правильный ответ! :) Ну вот, одной тайной в мире стало меньше.
                      +1
                      И папа-художник тоже.
                        0
                        И очень много хороших людей на работе, которые помогали с переводом и тестированием. :)
                        0
                        Вполне нормально работать за идею и за интерес. Я так делаю и получаю от этого огромное удовольствие. А за деньгами я на работу хожу.
                          0
                          Я рад конечно за вас, но причем тут я или мой комментарий? :) В статье был вопрос, а я ответил.
                            0
                            Показалось удивление в том ответе. Похоже, просто показалось.
                        +5
                        У вас база в директории для кеша, операционка может стереть её пока ваше приложение не активно.
                          0
                          Вот как? Пока такого не было. Не активно = свёрнуто? Или закрыто полностью?
                            +2
                            Да, это может произойти, например если на устройстве останется мало места. Конечно, ситуация больше гипотетическая (вряд ли у вас там большая база), но исключать такой вариант нельзя, особенно если программой будет пользоваться много людей.

                            В вашем случае, лучше использовать NSApplicationSupportDirectory вместо NSCachesDirectory. Более подробно можно посмотреть тут:

                            developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW5

                            Не знаю точных условий, когда кеш может быть очищен, к тому же, поведение может меняться в зависимости от версии iOS. Но в одном из документов есть упоминание, что эта директория должна использоваться только для данных, которые можно легко восстановить и нужно быть готовым, что они могут быть стёрты.
                              +2
                              Вот это да… Благодарю за подсказку. Сделаю, как вы сказали, хотя бы ради опыта. А база там и правда смехотворно маленькая :)
                                +2
                                к сожалению размер вашей базы не имеет значения. когда место кончается ios действительно чистит все подряд из nscashesdirectory. был печальный опыт(
                          0
                          Из интереса — а ради чего используете SQLite и FMDB, чем не устроили NSUserDefaults?
                            0
                            Т-а-а-ак… Причины были такие (и не все умные):
                            1. Про словосочетание SQLite я узнал сильно раньше, чем про NSUserDefaults. А stackowerflow рассказал про то, как здорово работать с FMDB. По этой причине, наверное, сохранения хранятся именно в базе SQLite.
                            2. В другой базе я храню заголовки к картинкам, которые показываются пользователю во время игры и заодно заполняют пустое место. Соответственно, если я добавлю новые картинки, то добавляются и новые названия к ним. Во время обновления на устройствах новая база затирает старую и все довольны. Как это по умному сделать с помощью NSUserDefaults не представляю. :)
                              +1
                              Да, FMDB очень упрощает работу с SQLite, тут не поспоришь. До его появления использовал сишные функции, вроде и не очень сложно, но время лишнее тратилось.

                              Насчет детекта обновлений приложения — я в своем проекте использовал что-то подобное:
                              if ([[NSUserDefaults standardUserDefaults] valueForKey:@"appVersion"]==nil)
                              {
                                  [[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:1] forKey:@"appVersion"];
                                  // ...
                                  // устанавливаем остальные параметры
                                  // ...
                                  [[NSUserDefaults standardUserDefaults] synchronize];
                              }
                              else
                              {
                                  int app_version = [[NSUserDefaults standardUserDefaults] valueForKey:@"appVersion"];
                                  // далее можно проверить, отличается ли текущая версия от пользовательской app_version и, например, добавить в настройки новые поля
                              }
                              

                              Во время обновления на устройствах новая база затирает старую и все довольны
                              — я правильно понимаю, что речь идет просто о файле в bundle вашего приложения? Если так, и если он обновляется только при обновлении приложения целиком (версии 1.0 => 1.1, например), то в NSUserDefaults вообще нет нужды. Другой разговор если у вас данные можно обновить через интернет — тогда есть смысл держать актуальную версию, и выбор между NSUserDefaults и SQLite зависит от структуры самих данных.

                              Пример: различные NSArray и NSDictionary отлично пишутся в NSUserDefaults (который для программиста и выглядит как key-value хранилище), ну а SQLite он и есть SQLite — его стезя это SELECT, ORDER BY, WHERE и т.д.

                              Ну и последнее: присмотритесь к JSON, легкочитаемый формат, без проблем сериализуется в Foundation классы.
                                0
                                Поправлю себя, конечно же должно быть так:
                                int app_version = [[[NSUserDefaults standardUserDefaults] valueForKey:@"appVersion"] intValue];
                                
                                  +1
                                  Пример: различные NSArray и NSDictionary отлично пишутся в NSUserDefaults

                                  [зануда mode on]
                                  При условии, что содержащиеся в них объекты поддерживают NSCoding.
                                  [зануда mode off]
                                    0
                                    Век живи — век учись. За три года умудрился ни разу не попробовать сохранить кастомный объект, только десериализованные JSON'ы да свои массивы и словари. Спасибо!
                              +12
                              Игрушка по качеству ниже некоторой минимальной планки. Мега затасканная механика + убогий по стандартам индустрии дизайн. Эксперименты с продвижением не дадут результатов, по которым можно делать выводы. Sorry, за откровенность.
                                +3
                                За правду, вообще-то, награждать надо, так что вы молодец. :)
                                А по поводу игры — как уже говорилось, это была проба пера. Хотелось изведать процесс от начала и до маркетинга. Будут ещё идеи, программы и уйма нового опыта.
                                  0
                                  Люди прекратите делать «пробу пера», да ещё и «раскручивать» и писать статьи о своём «великом» опыте «разработки» под iOS. Хватит уже захламлять АппСтор подобным Г. Что вы хотите сказать этим продуктом пользователям? Я понимаю, если вам интересно изучить новый язык программирования, готовую платформу распространения продуктов, это одно, тогда и распространяйте это среди друзей или просто бесплатно, потому что идея нулевая и ваши затраты минимальны, а ожидания слишком завышены. Получили опыт разработки отлично, надо двигаться дальше, очень много и усердно работать и тогда возможно через год сможете создать что-то разумное в плане реализации. Но главное это всё же это идея, попробуйте создать что-то что действительно будет кому-либо интересно и в первую очередь это должно быть интересно вам лично. Честно ответьте себе, что вам это интересно и вы будете этим пользоваться не раз. Изучите конкурентов, это поможет определиться с уникальностью вашего продукта или функций. Оцените насколько лучше вы сможете реализовать чем конкуренты и сколько им потребуется времени, чтобы скопировать вашу хорошую идею. Подобных вопросов множество и всё это складывается из огромного труда и усилий чтобы сделать действительно интересный проект, затраты на который будут куда больше чем $5000, но не обязательно в денежном эквиваленте.
                                    +2
                                    Абсолютно поддерживаю!
                                0
                                >> В Сети прочитал, что минимальная стоимость разработки iOS-приложения составляет 5000$
                                Вероятно также учитывалась оплата рабочего времени разработчика.
                                  +1
                                  и арт, и геймдизайн, и перевод, и qa…
                                  0
                                  5000$ цена за качественное приложение, а у вас все таки пока приложение до современных стандартов не дотягивает. Так что наверное имеет смысл его доделать и улучшить, прежде чем заниматься продвижением)

                                  Идея то конечно требует значительной доработки.

                                  Можно например сделать не просто картинки, а например что-нибудь более трендовое, например СЕЛФИ :)

                                  Берете несколько селфи друзей из инстаграмма пользователя, загружаете их, программа их режет и затем эти кусочки нужно собирать, результат (или даже видео всего процесса сборки) шарить в соц сети. Возможно получится прикольно + какой никакой вирусный задел есть.

                                  В качестве названия взять «собери селфи», может что и получится

                                  Конечно, есть еще вариант сделать что-нибудь попроще и собирать паззл из звезд и известных людей, политиков и тд, но такие скорее всего есть
                                    –2
                                    Да, конечно. Можно однозначно попробовать доделать и улучшить. Всё, что угодно, но только без слова на букву С. У меня от него мурашки по коже. Может, себяшки? ;)
                                    –3
                                    > 1. Были отправлены запросы на БЕСПЛАТНЫЙ обзор на сайты:

                                    Таких сайтов более 900, чтобы просьба обзора сработала, надо делать массовую рассылку по сотням сайтов. Чтобы не тратить свое время (несколько недель на рассылку), можно обратиться к специальным сервисам, например к ispreadnews, которые и текст письма улучшат, и рассылку сделают подставив имя редактора в тело письма.

                                    А так — имхо надо сделать более примитивным (мультяшным) интерфейс, сейчас он слишком реалистичен, не дает расслабиться и получить удовольствие. Либо сделать с модным ныне flat ui дизайном.
                                      0
                                      По поводу интерфейса: сделал его таким, потому что нравится. Видимо, нравится только лишь мне ^_^ Так что и правда можно сделать более яркий мультипликационный. А модный ныне плоский дизайн мне не очень по душе, если честно. Это касается только мобильных приложений. Хочется, чтобы блокнот, например, выглядел как блокнот. С кожей, бумагой и текстурой. Но это дело вкуса. :)
                                      +1
                                      Я бы посоветовал Realm в качестве базы данных. Эта ORM очень проста для понимания + имеет кучу различных преимуществ перед стандартным CoreData и тем более NSUserDefaults.
                                        0
                                        странно — ни названия игры, ни ссылки на AppStore… может я невнимательно читал?
                                        и еще вопрос — как вы определяете политику ценообразования для встроенных покупок?

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое