ТЕКСТ: Дмитрий Шмидт Иногда я недостаточно благодарен с людьми, которые в свое время оказали мне добрую услугу и наоборот, забываю о каких-то неприятных случаях. В нужный момент можно попросту забыть о предыстории отношений. Важные детали вспоминаются уже после. Хочется помнить многое, что связано с человеком — его интересы, взгляды, что он предпочитает есть и т.д.
Приложение должно помочь найти ответы на вопросы: Что можно подарить другу на день рождения? В какое место лучше всего сводить девушку, чтобы ей безумно понравилось? Любит она котиков или собачек?
Как было сделано приложение
Программировал сам на языке Objective C в Xcode.
База данных — фреймворк Core Data без сторонних фреймворков, пришлось довольно тяжело. Код, отвечающий за Core Data, очень “раздут” и из-за этого сложнее ориентироваться.
Документации Apple мне не хватило, как и примеров с github и учебников по iOS. В учебниках все выглядело очень просто — добавляем модель, копируем код, чуточку исправляем и вуаля — наше приложение готово и даже делать практически ничего не пришлось.
В реальности же дело по-другому. Нужно знать, как правильно делать связи в более сложной модели. Есть и подводные камни — код верен, а приложение вылетает. Здесь здорово помог StackOverflow, но все равно пришлось попотеть.
Была куплена книга по Core Data, которая прояснила многие моменты.
После обратил внимание на фреймворк MagicalRecord, который здорово минимизирует объем кода.
Разница между чистым Core Data и MagicalRecord примерно такая:
Вы заходите в магазин велосипедов, и в первом случае, чтобы купить велосипед, нужно назвать число колес, спиц в каждом колесе, размер шин, указать сколько передач, наличие фонарика и катафотов и т.д. Во втором случае, вы говорите продавцу, что вам нужен синий спортивный велик за 10000р., и вам приносят именно то, что вы хотели.
Однако MagicalRecord не волшебная пилюля, проблемы есть и с ним.
Когда я уже закончил приложение, и счастливо потирал руки (оставалось залить скриншоты в iTunes Connect), решил на всякий случай, протестировать приложение на девайсе еще раз.
Результат — стабильный вылет в месте, которое я до этого успешно протестировал. Были и другие вылеты.
К сожалению, хорошего туториала по MagicalRecord нет, поэтому пришлось искать ответы авторов фреймворка и экспериментировать самому. На устранение багов пришлось потратить еще три дня.
В-целом, на приложение было затрачено около 4х месяцев, причем работал я гораздо больше 8 часов в день и без выходных.
Аналитика
Для отслеживания посещений и экранов используется Google Analytics. Кроме него, я также тестировал Flurry и Localytics, но мне они понравились гораздо меньше. К тому же, он полностью бесплатен.
Советы начинающему разработчику
Прочесть книги: Rework от компании 37signals, “Programming iOS 6” Matt Neuburg, Карл Сьюэлл “Клиенты на всю жизнь”.
Совет: если перевести несколько туториалов с английского на русский на сайте raywenderlich.com, вы подарят несколько неплохих книг с примерами приложений.
Не рекомендую книгу E.Sadun “The iOS6 Developer’s Coоkbook”. Это сборник рецептов кода, к тому же оформленный не слишком удачно — видны привычки из опыта программирования на языке C. Все это можно найти и на Stackoverflow. К тому же, некоторые вещи лучше и проще делать при помощи open source проектов.
Берегите глаза
За два с половиной года, которые я потратил на разработку приложений, я сильно посадил зрение — работаю я много, с утра до вечера, иногда без выходных.
Так делать не нужно. Хорошие мысли в уставшую голову не придут, приложение без ошибок лучше, чем с ошибками, но чуть раньше.
Поставьте бесплатный Time Out Free на мак, чтобы делать перерывы.
Дизайн
Чтобы понять как делать красиво, не стоит читать серию Лебедева — она для дизайнеров. Лучшая книга это “Робин Вильямс – Дизайн для НЕдизайнеров”. Но из серии Лебедева стоит прочесть книги про проектирование взаимодействия — “Психбольница в руках пациентов”, Алан Купер и “Интерфейс. Новые направления в проектировании” Раскин Дж.
Руководствуйтесь принципами дизайнера Дитера Рамса, не старайтесь нашпиговать приложение фичами и дизайнерскими закидонами — все хорошо в меру.
Для приложения, я купил красивую готовую тему за $80 и немного переделал ее.
Иконку рисовал сам.
Перед началом разработки, сделал прототип в приложении AppCooker. Две недели тестировал и изменял его, чтобы сделать удобным и легким в использовании.
Копии кода
Используйте систему контроля версий — я выбрал Mercurial, он проще, чем Git.
Я использую аккаунт на bitbucket.org в качестве удаленного хранилища(неограниченное количество репозиториев и бесплатно команде до 5ти человек) и приложение SourceTree (бесплатно в MacAppStore).
Пресс-релиз
Написание пресс-релиза я заказал фрилансерше из Греции. Что удивило — писатели пресс-релизов даже не устанавливают себе приложение. Однако, у девушки было достаточно ясное понимание о работе приложения по скриншотам. Стоило $25. После проверил текст и нашел несколько мелких ошибок, а так же она дописала несколько вещей, которых в приложении нет и не будет, несмотря на то, что в интервью я четко указал эти пункты.
Вывод: если нет хорошего знакомого журналиста, лучше пишите пресс-релиз сами. Возьмите уже готовые пресс-релизы на prmac.com или prweb.com и сделайте из них свой.
Пресс-релиз я отправил на сервис-рассылки prmac.com, поскольку читал о нем на хабре и сайте компании elegion.ru.
Я заказал самый крутой пакет “Extended Distribution with Video” с корректировкой пресс-релиза за $101.
Минусы:
- Видео было сделано хорошо, но выложено только на их сайте, на youtube видео не выкладывают;
- Корректировка пресс-релиза стоит $10 и при покупке было указано, что результат будет получен в течение 24х часов. Через две недели после отправки пресс-релиза, когда она уже даром не нужна, ее прислал владелец сайта, оправдывая задержку тем, что он восстанавливался после больницы. На запрос о том, что $10 нужно бы вернуть, он ответил отказом, мотивируя это тем, что он потратил на нее много сил, и у него была важная причина для задержки. Дальнейшая переписка оставила крайне неблагоприятное впечатление о его профессионализме.
- Некоторые символы в тексте были заменены на символ квадрата, т.е. какие-то проблемы с кодировкой.
Результат рассылки — ко мне обратились 3 владельца сайтов с предложением платных обзоров.
Статистика рассылки из отчета prmac:
Dossiers 1.0 [445 clicks]
Purchase and Download [322 clicks]
Screenshot 1 [232 clicks]
Screenshot 2 [225 clicks]
App Icon [144 clicks].
То есть, какой-то минимальный толк есть, но из-за минусов, описанных выше, этим сервисом пользоваться больше не буду.
По предыдущему опыту, наиболее эффективны обзоры на сайтах. Однако, цены на платные обзоры слишком высоки — от $200 и выше. Цена зависит от посещаемости сайта.
Скачивания
Несмотря на разосланный пресс-релиз, скачиваний приложения практически нет. Ни в каких рубриках его тоже не было, увы. Что странно — ключевые слова вроде бы были выбраны правильно.
Возможно, нужно было сделать русское имя. Однако, в голову не пришло ничего путного, кроме “Досье”, которое уже занято.
Тем не менее, я настроен оптимистично, поскольку уверен в том, что приложение сделано качественно, и причина низких продаж в том, что о нем никто не знает.
iPhone: Free [Скачать]
28 комментариев
Форум →Небольшая поправка: приложение стоит $2, бесплатно только на этих выходных.
@shmidt,
1 При выборе фотографии кнопка “Cancel” не переведена.
2 Существенная задержка при возврате на экран контакта по кнопке “назад”
3 При отображении контакта на карте слишком большой дефолтный зум
4 При выборе даты рождения предустановленного контакта пикер не крутился, нажал на 15, приложение вылетело. При следующем запуске Юлии там уже нет, база чистая.
5 Блокирование приложение паролем тоже не переведено.
6 Пункт Национальность, а на самом деле список стран, все-таки это разные вещи.
7 Когда переходим в группы контакта неплохо было бы отметить галочкой к какой группе контакт уже принадлежит, иначе непонятно.
8 При вводе заметки, при выборе цветного шарика никакой реакции. При написании заметки место для записи не уменьшается и клавиатура закрывает пол-экрана не реагируя на тап и на кнопку return, не понятно как сохранить запись(она оказывается сама сохраняется). Так как цветной шарик расположен в заголовке секции то при скролле таблицы на него наезжает текст. Звездочки наезжают, а текст при появлении кнопки “Удалить” при скролле по ячейки.
9 Звездочки можно выбирать туда сюда в любой области экрана, начав делать это в зоне звездочек.
Надеюсь поможет,
@Drag, Да, большое спасибо за детали, очень по делу.
Будет исправлено в следующих обновлениях.
Пункт 8 исправлен в следующем обновлении, которое ждет рассмотрения и на днях появиться в аппсторе.
Также, в этом обновлении добавлена возможность сохранения резервных копий базы данных в дропбокс.
Большое спасибо.
Скачал, попользуюсь позже оставлю отзыв. aNote я думаю лучшие заметки и дизайн там на 5, и функционал на 5, но и стоит конечно в 2 раза больше).
@Алексей, aNote это приложение для создания заметок, а Dossiers это список контактов с заметками. Совершенно разный функционал.
К тому же, текущая версия Dossiers это не финал, там есть что улучшить. Некоторые пользователи прислали свои достаточно ценные предложения, которые внесены в todo лист.
Спасибо за проявленный интерес.
Я до сих пор считаю стандартные Контакты далекими от идеала, но простите – я не увидел ничего, что не мог бы добавить в стандартную карточку контакта.
Единственное функциональное отличие, которое увидел – рейтинги. Но мне и в голову не приходило никогда проставлять уровень интеллекта и доброты ))))
Желаю автору перечь зрение на подобных проектах, а вот то, что почитали Круга – это только на пользу :)
Успехов!
@Aibolit, а связи, заметки, разделение заметок по категориям и датам, распознавание текста, поиск по заметкам?
Очень жаль, что вам не понравилось, но если вы считаете, что что-то можно улучшить/исправить, пишите.
@shmidt, Связи, заметки и поиск в т.ч. и по заметкам в стандартных контактах есть.
Вы только поймите меня правильно – Вы старались и я ни в коем случае ни хотел бы обидеть своей оценкой. Наоборот – я желаю, чтобы все получилось!
Просто имея некоторое отношение к разработке, одними из наиболее часто повторяющихся ошибок я вижу то, что разработка начинается до того, как стало понятно, что это вообще будет востребовано и второе – перегруз функционалом. Почему-то многие разработчики считают, что чем больше -тем лучше. Это не всегда верно.
Я бы порекомендовал обратить внимание на несколько моментов:
– четко определить кто ваша аудитория и как она будет использовать это приложение. Это типовой шаг разработки, отсюда следуют юзкейсы и как следствие набор необходимого функционала, логика работы и UI. В идеале нужно основываться не на своих догадках, а на реальных потребностях.
– поправить дизайн – он сейчас очень разношерстный. Попробуйте собрать вариант на основе достных UI- наборов. Это будет проще и быстрее всего.
– возможно стоит еще раз вернуться к названию. Оно должно быть или запоминающимся, или говорящим. Последнее напрямую связано с результатом первого пункта.
Сорри, что длинно, возможно что-то пригодится :) Удачи!
@Aibolit, мне понравилось.
@Aibolit, Большое спасибо, обязательно учту. Очень полезное замечание.
Это не по-русски – “недостаточно благодарен с людьми”! Такие перлы может выдать только компьютерный перевод…
@WaltMonti, :) Когда большую часть общаещься с Xcode на Objective C, обычная речь начинает страдать))
Спасибо, стащил, респект от полиции.. Будем тестировать..
Съедобно
Настоящий Dev Story, спасибо за статью :)
Насчет Magical Record я бы не согласился. На мой взгляд, даже сами названия методов очень доступно объясняют, что можно делать, а чего нельзя. Версия 1.8.3, на которой приходится писать, если поддерживаете 4.3+, довольно проблематичная, а вот последние версии 2.1 заметно облегчают работу.
Книга “Rework” понравилась именно призывом избавиться от предрассудков в бизнесе в целом. А вот для разработчиков очень интересной книгой будет “Lean Startup”, где описываются истории из разработки IMVU.
@ALoginov, в MagicalRecord мне не очень нравится, что MR_defaultContext это основной контекст, а под дефолтный больше подпадает MR_contextForCurrentThread…
Также, иногда MR_saveInCurrentContextThread вылетает, а иногда нет.
Я пользуюсь 2.1.
Спасибо, обязательно прочту Lean Startup.
@shmidt, С потоками не экспериментируете? MR очень обижается, когда ему указывают, в каком потоке работать :)
Разработчики рекомендуют использовать “MR_contextForCurrentThread”, вызывая из главного потока.
С вылетами сталкивался, но, в основном, из-за функции saveInBackgroundWithBlock.
@ALoginov, да я так и делаю. Просто на мой взгляд, это не очевидно)
По моему опыту, вылетов не бывает если не использовать сохранение в блоке MagicalRecord, а сохранять [NSMangedObjectContext MR_save…].
Респект за использование Core Data) Безумно его люблю, но именно в чистом виде. Сам создаёшь стеки:, направляешь в нужные тебе потоки, чувсвуешь весь этот data flow — по-моему, это шикарно)
@twitter.com/pestrov, Попробуйте MagicalRecord все-таки) код становится намного более читаемым. А уж NSFetchedResultsController создавать одно удовольствие)
Не в обиду: причина в крайней специфичности. Популярно все простое.
@altaveron, Спасибо. Будем улучшать.
Приложение понравилось! Но есть несколько замечаний и пожеланий к исправлению! В разделе связи контакта, было бы хорошо добавить характер связи, ну например “одноклассник”, “друг”, “Бой френд” ну и т.п; при импорте контактов при поиске конкретного контакта совершенно не очевидно что после выбора фильтр сохраняется, т.к. для возврата к общему списку контактов надо нажать отмену.. хорошо бы исправить; Если заполнять поля ФИО полностью, то в списке контактов потом отображается не коректно, например Если Сидоров Петр Иванович, то в Списке отображается Сидоров Петр С.,,,
@plazmatex, Я внес ваши замечания в мой уже достаточно длинный список исправлений) Да, есть над чем поработать.
@plazmatex, а насчет ФИО — приложение использует порядок сортировки вашей адресной книги, отчество добавлено в виде инициала, чтобы легче было отличить людей с одинаковыми именами и фамилиями. Это редко, но бывает.
Спасибо.
@shmidt, Согласен, но ваше приложение добавляет не первую букву отчества, а первую букву фамилии, вот и получается что Сидоров Петр Иванович, выглядит как Сидоров Петр С., а не Сидоров Петр И. Надеюсь на исправления!
@plazmatex, Понял в чем косяк. Если сортировка адресной книги установлена не по умолчанию, т.е. сначала по имени, а потом по фамилии, то как раз и проявляется этот баг.
Спасибо, уже исправляю.
P.S. Кстати, в настройках приложения есть кнопка “отправить отчет об ошибке”, так что можно отправлять отчеты прямо с устройства.
@plazmatex, Исправление этой ошибки выйдет через апдейт.
Нашли орфографическую ошибку в новости?
Выделите ее мышью и нажмите Ctrl+Enter.Почему iPhone не может выйти в интернет по Wi-Fi
Как выводить изображение с iPhone на телевизор
Почему не срабатывает переключение языка клавиатуры в macOS
Почему iPhone тормозит во время записи экрана
Как выводить звук с телевизора или Apple TV на колонку HomePod
Как «сбросить» iPhone без обновления iOS?
Куда пропал раздел с обновлением приложений в iOS 13
Ошибка при создании резервной копии iPhone, как исправить?