
До выхода моего первого приложения 5 лет. С момента появления смартфонов в том виде, в котором мы их видим сейчас, а точнее с того момента, как я увидел подобные телефоны, мне стало ясно, что вот оно. Все на кончиках наших пальцев. В то время я был студентом второго курса и, естественно, выбрал то, что мне было по карману, а именно SonyEricsson X8 с Android 2.3 на борту. Я почти сразу стал задумываться над написанием приложений для этого телефона. Но то ли время для меня было неподходящее, то ли мотивации не хватало. Дела с приложениями как-то не ладились. Шло время, я успел поменять несколько телефонов, почти закончил университет, успел сменить несколько работодателей. В конечном итоге я устроился разработчиком силовых электрических преобразователей. Инженерная работа захватила меня, я и думать забыл про приложение. Да и времени на них не оставалось.
До выхода моего первого приложения 2 года. Переломный момент наступил вместе с желанием поменять мой старый SonyEricsson на новый телефон. Выбор пал на iPhone. Я снова погрузился в мир приложений и потихоньку стал присматриваться к этому рынку со стороны разработчиков. В это же время начала формироваться идея, которая в конечном итоге выросла в конечный продукт. Идея заключалась в том, чтобы перевести день на язык цифр. Ведь цифры легко анализировать, можно прогнозировать. Современные смартфоны собирают достаточно много статистической информации о нас. Наш пульс, количество шагов, выпитой воды и т.д. Но немодно устройство немоте сказать какое у нас настроение, насколько мы удовлетворены тем или иным событием. И таких критериев копиться у человека достаточно много. Надо всего лишь ежедневно их оценивать и в более длительный период получиться достаточно объективная картина. В общем всегда можно получить актуальную статистическую информацию о своей жизни. Но мы всегда чего-то хотим, а преодолеть обстоятельства не в силах. Так получилось и у меня. Один проект на работе сменял другой. Время шло, а дело с приложением не двигалось с мертвой точки.
До выхода моего первого приложения 1 год. Завершив на работе большой и долгий проект и не получив после него долгожданный отпуск, я понял, что больше так не могу. Надо было что-то менять. Постоянное изменение технических заданий, невозможность вышестоящего начальства договориться между собой и многое, многое другое. Мне нужен был перерыв. По итогом этого перерыва, я понял, что больше туда не вернусь. Благо были накопленные средства и ни каких обязательств. Я с головой погрузился в написание своего первого приложения. Было написано техническое задание, больше похожее на приблизительное описание идеи. Установлены примерные сроки, которые в итоге были просрочены на полгода. А дальше я совершил самую большую ошибку: решил, что все буду делать сам. И внешний вид приложения формировать прямо по ходу разработки. Это были очень отрезвляющие грабли.
Подошли установленные ранее сроки. На руках у меня было, наверно, чудом работающее приложение, которое выглядело так, что на него самому было стыдно смотреть.
До выхода моего первого приложения полгода. Накопив небольшой, но горький опыт, я решил, что надо делать по уму. Сразу я почему-то так решить не мог. Было переписано ТЗ, оно было еще далеко до идеала, но уже было не абстрактным описанием идеи. Вот тут я, основываясь на горьком опыте, принялся искать дизайнера. Разместил объявление на сайте фрилансеров и принялся ждать. Предложения посыпались, пришла пора отбирать людей, среди всех присланных предложений были отсеяны слишком дорогие и те, чьи работы мне не нравились по субъективным причинам. В итоге было выбрано 5 человек, с которыми я лично (по «Скайпу») переговорил, и, опять же по субъективным причинам, выбор пал на девушку по имени Регина. Как выяснилось почти сразу и подтвердилось позже, с выбором я угадал. Она не только нарисовала красивое приложение, но и дала кучу дельных советов уже на этапе тестирования.
Я решил не только изменить внешний вид приложения, но и переписать его структуру. В итоге приложение было написано за 5 месяцев, но для этого понадобилось 5 лет размышлений и одно волевое решение.
Недочеты, откровенные просчеты в организации проекта и интересные ошибки
Это, как мне кажется, самая интересная и полезная часть. Много из того, что я опишу в ней, должно быть понятно и очевидно опытному разработчику, но когда я только начинал, мне не хватило именно этих знаний.
1. Локализация приложения
На WWDC14 Apple представила новый способ локализации приложений. Можно экспортировать весь проект в .xliff файл и переводить его. Это практически стандарт в мире переводчиков. По крайней мере, на презентации сказали именно так. Я обрадовался: хороший, легкий способ, и все в одном месте. В том месте программы, где нужен будет перевод, вместо обычной строки пишется макрос: NSLocalizedString(@“string”, @“comment”).
В начале та строка, что требует перевода, а затем комментарий, в основном, для переводчика. На программу он никак не влияет. Но вот беда, от ошибок никто не застрахован, да и есть места, которые повторяются в программе. В общем, если вы где-то ошиблись, то для исправления придется просмотреть весь проект. Но и это еще не все. Дело в том, что строка для перевода в .xliff файле станет ключом, и если вы ее поменяете в программе, а переводчик не изменит файл перевода, то вы получите две строки с одинаковым переводом и разными ключами. Xcode не найдет перевод и место останется не локализованным.
Решением этой проблемы стало комбинирование старого и нового способа локализации. Все строки, необходимые для перевода, выносятся в файл Localizable.strings в виде ключ-значение. И обращаемся уже к ключу. Теперь мы получаем возможность исправлять исходные тексты, не опасаясь за перевод. А переводчик, опять же, получает знакомый и удобный формат для работы.
2. Странные ошибки
Все описанное в этом разделе произошло исключительно из-за моего незнания.
Все написанное я тестировал на своем iPhone 5. Программа работала прекрасно, я смотрел на нее и не мог нарадоваться. В приложении есть момент, когда пользователь должен оценить свой день, и для этого ему предлагается использовать слайдер, при этом оценивание может происходить по трем разным шкалам: сто- десяти- и трехбалльной системе. Для ста- и десятибалльной системы используются слайдеры, а для трехбалльной смайлики. Все это выводится в таблицу, в которой каждому критерию выделена своя ячейка. Для удобства выбора я написал следующее:
typedef enum: NSInteger{
EDEvaluatePriceHundredPoint,
EDEvaluatePriceTenPoint,
EDEvaluatePriceThreePoint
} EDEvaluatePrice;
Сами значения хранятся в CoreData и представлены в виде NSNumber. При выборе я решил делать следующие сравнения:
if (c.priceCriterion == [NSNumber numberWithInteger:EDEvaluatePriceHundredPoint]) {
}
Мне казалось это логичным, тем более это работало у меня на телефоне. Хотя тут сравниваются два разных объекта.
А вот на iPhone 5S и новее это уже не работало и появлялись пустые ячейки. Решается просто:
if ([c.priceCriterion integerValue] == EDEvaluatePriceHundredPoint) {
}
Как позднее выяснилось дело видимо в разрядности процессора и компиляторе Objective-C (подробнее можно почитать тут).
3. Ошибки верстки
Первая ошибка проявлялась только на iPhone 6 Plus и заключалась она в сломанной верстке приложения. К тому же не на всех его экранах, а только на избранных. Проблема оказалась в представленных в xcode 6 constraint to margin. Причем по умолчанию эта функция включена. Опять же не могу сказать, почему именно такое происходило, мне кажется, что проблема в использовании Containers. Но ведь этот же механизм использован Apple, например, в TabBarController. Да и проблема, опять же, проявлялась не всегда. Решением оказалось отказаться от constraint to margin
Вторая ошибка вообще странная и появлялась только в iOS 7. Дело в том, что при запуске приложения на iPad ровно треть экрана просто обрезалась и становилась серой. Ошибка проявлялась на Regular Size и только на iOS 7. Дело оказалось настолько серьезным и не поддающимся исправлению, что пришлось отказаться от поддержки iOS 7. По сути это и оказалось решением этой проблемы.
Несмотря на все непонятности, трудности и странное поведение системы и инструментов разработке, приложение не только увидело свет, но и даже получило обновление. Загрузить его можно по ссылке ниже.



Pingback: Rency — простой конвертер валют (промокоды внутри) | Cocoa Developers Club()