Coin Keeper. iPhone приложение на C#


    Вчера разработанное нами приложение Coin Keeper заняло третье место в топе платных приложений русского AppStore.

    Интересно то, что мы разрабатывали его не на привычном Objective C, а на C#, используя фреймворки Monotouch и Monodroid.

    Внутри я бы хотел рассказать про архитектуру приложения, хитрости и удачные моменты. Кроме того я раздам 5 промокодов, тому кто сможет дать ценные комментарии по проекту.



    Coin Keeper это приложение для учета личных финансов. Главный экран приложения похож на большой держатель монет. Доходы, кошельки и расходы представлены как стопки. Чтобы зафиксировать трату, достаточно перенести монетку из стопки в стопку. Подробнее вы можете узнать на сайте приложения CoinKeeper.me. Пользователям идея очень понравилась:



    Что за зверь Monotouch?

    Мы при разработке проектов отдаем предпочтение фреймворкам MonoTouch и MonoDroid.

    Эти продукты создала и развивает компания Xamarin во главе с Miguel de Icaza, основателем проектов Mono, Gnome, Ximian и Midnight Commander. С их помощью можно разрабатывать мобильные приложения для iPhone и Android на C#, при этом код компилируется в нативный машинный код и используются родные UI библиотеки платформ.

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

    Ну приступим к самому интересному, к грязным техническим подробностям :)

    Общая архитектура



    Общая архитектура приложения выглядит примерно так ↑

    Причем, DAL и BL можно брать и без изменений копировать в Android и Windows Phone 7 версии, а это около 50% исходного кода!

    DAL


    Классический для веб-приложений Data Access Layer. Бизнес-логика (BL) для доступа к данным использует только функции этого слоя.

    Возможно, вы подумаете, что это через чур и лишняя трата времени. Но, например, в WP7 используется SQL Compact Edition и другой ORM, поэтому в целях кросс-платформенности мы и сделали тонкую обертку над ORM.

    BL


    Business Logic или бизнес-логика приложения, слой отвечает за:
    — создание транзакций, повторяющиеся транзакции, историю транзакций;
    — категории и автобюджет (приложение само определяет сколько нужно тратить :) подробнее в разделе Автоматика);
    — статистику и отчеты;
    — логику накопления на цели;
    — транзакции между счетами в разных валютах.

    Пользовательский интерфейс использует исключительно объекты бизнес-логики, представленные как статические классы.

    В целом и все про архитектуру, если что осталось непонятным — задавайте вопросы, расскажу подробнее.

    «Фишки»

    Автоматика


    Как известно, пользователи iPhone очень капризны и не любят разные кропотливые действия, поэтому мы постарались максимально избавить их от лишней работы.

    Автобюджет


    При первом запуске пользователя мы предлагаем ему автоматически сформировать бюджет на месяц, в зависимости от зарплаты. Данные основываются на публичной статистике, вот например предложение по расходам россиянина с зарплатой 30 000 рублей.



    Предустановленные категории


    Вторая удобная мелочь — база категорий. Мы собрали в приложении 100 типовых категорий расходов и привязали их к иконкам. Создание статей расходов стало проще некуда :)



    Перевод валют


    Счета и траты в Coin Keeper могут храниться в разных валютах. Изначально при переводах между разными валютами мы предлагали пользователю ввести оба значения.

    Потом поняли, что это грустно и теперь каждый день обновляем актуальные курсы валют с зарубежной биржи. Пользователь, если захочет, может скорректировать значение.



    Инкрементальная статистика


    Вернемся все же к удачным техническим решениям. В приложении есть два графика: столбчатая диаграмма доходов и расходов по месяцам и круговая диаграмма расходов за месяц.

    Казалось бы, что можно оригинального придумать при построение диаграмм? Но есть вот какая проблема, если пользователь зайдет посмотреть статистику доходов/расходов за год и мы начнем ее считать по всем транзакциям, это может затянуться на пару секунд, что недопустимо для мобильных приложений.

    Мы применили простой прием проектирования баз данных — денормализацию. Каждая добавленная пользователем транзакция обновляет записи в двух специальных таблицах:




    При заходе в статистику мы просто выводим строчки из этих таблиц.

    Unit тесты


    Когда мы начинали разработку приложения замечательной библиотеки Touch Unit еще не было, поэтому пришлось написать свой маленький тестовый фремворк.

    Идея простая: был метод TestAll, который запускал все тесты, создавал новый объект интерфейса прямо внутри приложения и выводил результаты. Запускалось это все на эмуляторе или телефоне при помощи специальной цели для сборки.



    Анимация



    Тут было 2 сложных момента.

    Cкрывание и раскрывание верхней и нижней плашек.




    Сначала мы просто подписывались на события TouchesBegan, TouchesMoved, TouchesEnded у соответсвующих view и при начале прикосновения к нижней/верхней части плашки начинали ее двигать. Однако после первых тестов данный подход оказался сильно неудобен для пользователей: они часто начинали двигать пальцем выше или ниже области «захвата» плашки.

    Явно напрашивалось какое-то другое решение. Задача еще усложнялась тем, что внутри плашек есть UIScrollView, который перехватывал тачи внутри себя, а также есть категории при нажатии на которые должна вытаскиваться монета.

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

    public override void SendEvent (UIEvent evt)
    {
    	base.SendEvent (evt);
    			
    	if (PanelsDragger.TrackTouches)
    	{
    		var touch = evt.AllTouches.AnyObject as UITouch;
    				
    		if (touch == null)
    			return;
    				
    		PanelsDragger.TouchAction(touch, touch.LocationInView(this));
    	}
    }


    И уже на основании информации о месте тача, мы соответствующим образом двигаем нужные плашки. В итоге сейчас можно начать жест в любой части экрана и когда палец дойдет до нужной плашки — она подцепится и начнет скрываться. При этом тач события доходят и до других контролов, что позволяет работать UIScrollView и механизму перетягивания монет. Да, в iOS 5 с введением нотификаций, которые вытаскиваются сверху, зеленую плашку доставать стало труднее, но в новой версии мы постараемся избавиться от этой проблемы.

    Анимация и отображение категорий




    В приложении красочно показывается уровень текущих расходов: в виде наполняющегося цветом круга. При этом цвет зависит от интенсивности расходов в этой категории и того насколько вы вписываетесь в бюджет в рамках месяца. Для реализации этой идеи мы придумали 2 разных подхода, один из которых опишем здесь.

    Первой рисуется статичная картинка фона, тут все понятно. Далее нам нужно каким-то образом «отрезать» верхнюю часть круга у картинки с цветным кругом. Для этого мы создаем view внутрь которой помещаем картинку круга и задаем у этой view свойство ClipToBounds. Далее мы двигаем картинку круга вверх таким образом, чтобы часть круга вылезала за границы родительской view и обрезалась. Правильно позиционируем эту clipper view и вуаля у нас есть наполнение :)

    Заключение


    Если вам интересна тема разработки на MonoTouch/MonoDroid, подписывайтесь на наш блог, где AndreyBaskov будет постепенно выкладывать цикл статей по разработке на основе этих фреймворков, а также различные решения из практики, упрощающие мобильную кросс-платформенную разработку.

    Спасибо что дочитали! Напомню про 5 промокодов, которые вышлю тому, кто сможет дать ценный совет по приложению :)

    UPD: с промокодами мы какую-то ерунду придумали :) Отдам первым 5 людям, которые попросят.
    UPD2: промокоды закончились :(
    Touch Instinct
    Разрабатываем мобильные приложения

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

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

      0
      Выглядит отлично.
      Проще/удобнее ли вам было писать на Monotouch+C# нежели ObjectiveC? Стоит ли начинающим пробовать сразу эту связку?
        +6
        Все зависит от сложности приложения и ваших навыков. Если вы уже знаете C# то вам будет значительно легче начать писать на Monotouch — достаточно будет изучить UIKit и принципы работы iOS приложений.

        Но когда речь заходит о достаточно сложных и больших приложениях надо будет понимать все тонкости работы Monotouch'a, его Garbage Collector'a и много других деталей. Также нужно будет уметь сходу переводить разные примеры и код снипеты с Objective-C на С#. Сейчас с новой документаций Monotouch стало значительно лучше, но от чтения Apple документации все равное никуда не деться.

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

        0
        Зашел на сайт, выбрал немецкий язык. «Закладка» 4 — пустой айфон (Вин7, 64, ФФ8.0)
        Перевод на немецкий не Гугль случайно делал? :) Сильно смахивает на китайские инструкции…
          0
          Выглядт очень вкусно. Хотелось бы попробовать. Еще было бы здорово, если бы можно было вести бюджет в удобной валюте, которая задавалась бы в настройках, а не использовать конвертер для перевода значений.

          И огромное спасибо за наводку на фреймворки.
            0
            Валюта по умолчанию берется из настроек телефона. При начале использования приложения вы можете ее поменять.
            +1
            > используя фреймворки Monotouch и Monodroid.

            А версия под андроид-то есть?
              0
              и я хочу такое же и под андроид.
                0
                А Monodroid это по вашему что?
                  0
                  хотят такую же программу под андроид
                –1
                Версия под Андройд будет :)
                  –4
                  Повторяюсь. Нет такого слова «андройд». йФон, йПад, йОс, йМак. Нравится?
                    +2
                    Вполне нормально, никто не комплексует. Еще нет таких слов как Макдональдс, Суши, Митсубиси и огромного количество слов с двоякимп роизношением. Будьте проще.
                +1
                Молодцы, что ту скажешь! Откройте тогда еще и маркетинговый секрет. Как продвигали приложение? И топ 3 Русского AppStore это сколько скачек в день?
                  0
                  Мне, кажется, основной маркетинговый секрет — классное приложение.

                  Как обычно сделали первые пару скачек и отзывов сами, потом был удачный пост на 4PDA. Подробности можно уточнить у tchernetski.
                  +1
                  А нет мыслей сделать графики за месяц, год и т.д. в виде линейной диаграммы? Это, по-моему, самое интересное — посмотреть как менялись ли или иные расходы или доходы в течении продолжительного времени.
                    0
                    Как насчет нескольких пользователей?
                      +1
                      Ага, и сайт со сравнительной статистикой. Найти друзей по бюджету.=)
                        0
                        У нас с супругой один счет на который все приходит и с которого все оплачивается — нам все по 2 раза вводить? Ах да, айфона у нас тоже 2 :)
                          0
                          Ну стандартная проблема синхронизации. =) Как вариант в настройках хранить путь к базе, а базу держать в каком-нить dropbox-е.
                            0
                            Не, допиливать платную программу — мазохизм ))
                              0
                              Ну, это скорей идея для разработчиков. Вполне реализуемо и в духе времени )
                                0
                                iOS и Android идеологии в лицах)
                            0
                            Мы думаем об этом, возможно реализуем в будущем.
                        0
                        Интересно. Куплю — попробую. Понравится — перейду с iBearSoft Money.
                          –3
                          Вчера разработанное нами приложение Coin Keeper заняло третье место в топе платных приложений русского AppStore.

                          вчера разработали, а сегодня оно уже в топе платных?
                            +4
                            Под Android делать будете?
                              0
                              да
                              –1
                              Расскажите как с помощью вашей программы можно выполнить следующие шаги:
                              1. Я взял кредит и ежемесячно плачу за него, хочу звнать сколкьо отдал и осталось
                              2. Долги ммне и мои

                              В программе от jumsoft я завожу разные счета для таких целей, но это не совсем удобно :)

                              И еще вопрос, испорт из каких-то систем мобильного бюджета для того же айфона возможен?
                                0
                                Вам скорее к zenmoney.ru :)
                                  0
                                  А ведь была бы отличная функция в программе! Будет ли веб-сервис с расширенными отчетами и планированием бюджета непосредственно с сайта, а не с телефона?
                                +1
                                Совет/недоработка такая есть: при раскрытии верхней плашки пользователи iOS5 открывают не верхнюю плашку, а центр уведомлений… Неудобно получается.
                                  0
                                  Да, мы знаем об этой проблеме. Дело в том, что дизайн и разработка велись под iOS4, а сразу после релиза вышла пятая с центром.

                                  Попробуем что-нибудь придумать, может у вас есть идеи?
                                  +1
                                  Очень интересно. Айфона нету под рукой, да и приложения собственно. Но скажите, как насчет такой пары ситуаций (на вскидку):
                                  • Жена/Подруга увидела сумочку/шарфик/шубу и вы не можете ей отказать. Насколько удобно с помощью приложения, пока кассирша пробивает покупку, вбить потраченную сумму и куда она запишется? Насколько можно это оптимизировать/автоматизировать пользователю (или каждый раз заново пробивать категории и т.п.)?
                                  • Мне лично в такого рода приложениях видится один существенный недостаток — привязка к реальным деньгам. У вас есть что-то такое? Как например идея с парсингом смсок от мобильного банка — по ключевым словам, «сняли со счета» или «зачислено на счет»?
                                    0
                                    Автоматический бюджет? Ожень даже iOS-style :0) Интересно было бы попробовать. Можно промокод?
                                      0
                                      Приложение выглядит симпатично, хотя некоторые элементы интерфейса вызывают вопросы.

                                      Прошу промокод. :)
                                        0
                                        HD версия планируется?
                                          +4
                                          Рад что есть популярная альтернатива Objective C. Совсем не улыбает изучать узкоплатформенный язык.
                                            0
                                            Objective C — кроссплатформенный. Он в gcc входит.
                                            0
                                            А какой размер файла при загрузке получается?
                                              0
                                              14 мегабайт в AppStore. (Если я правильно понял ваш вопрос)
                                                0
                                                Не многовато для приложения, не игры?
                                                  0
                                                  Хоть это и не игра, но ресурсов в виде различных картинок там достаточно много — около 8мб. Но конечно Monotouch свой вес добавил — это плата за удобный язык и возможность кроссплатформенной разработки.
                                              0
                                              Дайте промокод.)
                                                0
                                                А промокод можно?
                                                  0
                                                  Хотелось бы потестить, с вашего позволения, посему прокод был бы не лишним :)
                                                    +3
                                                    Сделали бы промо акцию лучше. Например цену на 1 день или несколько часов (не знаю как можно в аппсторе делать) установили бы цену в 0.99, я вот допустим с удовольствием ради пробы купил бы за доллар, за три извольте. это конечно ИМХО
                                                      0
                                                      будет распродажа, попробую всем про нее напомнить.
                                                        0
                                                        гут:)
                                                      0
                                                      Присоединяюсь к коментарию про корявый перевод, выше. Французкая версия тоже сильно смахивает на гуглоперевод. Было-бы неплохо сделать лайт версию приложения.
                                                        0
                                                        Monotouch какую версию использовали?
                                                          0
                                                          Текущая версия собрана с Monotouch 5.0. Обычно мы используем stable версии для отправки приложения в аппстор.
                                                          +1
                                                          Присоединяюсь к просьбам про лайт версию. Программа кажется вкусной, но 3 доллара многовато без уверенности (ну уж простите, пользовался несколькими бюджетоводами, но ни один не понравился), так что хотелось бы попробовать. В лайт версии можно было бы сделать ограничение по количеству транзакций (записей в бд). Тогда можно было бы посмотреть и если понравится — купить.
                                                            0
                                                            Не могли бы вы рассказать о недостатках MonoTouch и MonoDroid? Слышал, что дистрибутив весит намного больше, чем обычное приложение. Как дела обстоят с производительностью?
                                                              +1
                                                              Да, размер приложения становится больше. Сейчас приложение весит 14мб, из них ресурсов около 8мб. Однако если отказаться от armv6 процессоров (iPhone 2G, 3G) и воспользоваться новым LLVM компилятором можно значительно снизить этот размер, где-то до 11-12мб. Но в данном случае поддержка старых айфонов для нас была достаточно важна.

                                                              Производительность практически такая же как у нативного решения. Как раз на примере этого приложения видно что никаких проблем с производительностью нет. В любом случае это быстрее чем Javascript решения (PhoneGap, Appcelerator). Ну и если есть какие-то критические к производительности части, их всегда можно вынести в отдельную C или Objective-C библиотеку и использовать ее из Monotouch кода.

                                                                0
                                                                Еще вопрос: К примеру, опытному дотнетчику надо написать бизнес-приложение с нуля (без уже существуещего какого-либо кода) только для iPhone. Насколько оправдано писать приложение на MT? Сколько времени требуется на его освоение?
                                                                  0
                                                                  (не знаещего objective c)
                                                                    0
                                                                    нашел все ответы здесь:)
                                                                      0
                                                                      Оправдано, на освоение у нас уходит в среднем 2-3 недели. Правда это достаточно поверхностное знакомство, но для большинства бизнес приложений его должно хватить.
                                                                        0
                                                                        спасибо за консультацию:)!
                                                                  0
                                                                  Как у вас решается проблема фрагментации Android устройств при использовании MonoDroid? Имеется в виду в первую очередь разные размеры экранов.
                                                                    0
                                                                    Точно также как и при нативной разработке. MT и MD просто предоставляют все контролы и АПИ которые есть на соответсвующей платформе.

                                                                    Обычно в случае Андройда проблема разных размеров экрана решается путем создания ресурсов под разные dpi.
                                                                    –1
                                                                    то ли у меня не корректно открывает, то ли вы код в обернули… извиняюсь за тавтологию…
                                                                    желательно в
                                                                      0
                                                                      Что? :)
                                                                      +1
                                                                      А можно одолжить денег?
                                                                        0
                                                                        Конечно, сколько нужно? :)
                                                                          0
                                                                          Я имел в виду все эти планировщики бюджета создаются для людей, которые не дают в долг денег.
                                                                          Можно ли там как-то выбрать, что дана такая-то сумма на такой-то срок? Или только как трату вводить.
                                                                            0
                                                                            если честно мы против давания денег в долг, поэтому нет.

                                                                            Шутка. Подумаем, может появится в следующих версиях. Отдельного кошелька Долги с текстовым комментарием к транзакциям хватит?
                                                                              0
                                                                              Хотя бы что-то нужно. Причем желательно чтобы в обе стороны.
                                                                              И тому, кто одалживает, и для тех, кто берет в долг.
                                                                        0
                                                                        А отсутствие нативных элементов UI в приложении — это есть ваш выбор или специфика использованных фреймвроков Moni* ???
                                                                          0
                                                                          Приложение как раз таки написанно на нативных элементах UI. Просто у него достаточно нестандартный дизайн. Но все плашки и иконки это обычные ImageView и кастомные View.

                                                                          Если же, например, зайти в историю транзакций то там будет обычный UITableView c кастомными UIViewCell. Также на стандартных контролах сделано расширенное добавление транзакции, настройки приложения.

                                                                          Monotouch всего лишь предоставляет C# обертку к UIKit классам iOS, с точки зрения UI он ничего нового не добавляет.
                                                                          0
                                                                          Хороший дизайн.
                                                                          Как я понимаю — все полностью кастомное? Ничего из стандартного GUI iOS не использовалось? Хотя вроде серые кнопки — стандартные.
                                                                          Насколько удобнее или труднее оказалось создавать приложение на C#? Ведь Xcode не использовался?
                                                                            0
                                                                            Про UI ответил выше. Суммарно разрабатывать удобнее и приятнее. Но в процессе приходилось натыкаться на разные подводные камни. Сейчас с учетом накопленного опыта разработка на Monotouch для нас удобнее и быстрее.

                                                                            Для разработки используется cреда MonoDevelop — свободный аналог Visual Studio. Там есть все необходимое включая IntelliSense, Debug, интеграция с Git. XCode используется для редактирования xib файлов и создания аутлетов.
                                                                            +1
                                                                            Очень красивое и видимо полезное приложение.
                                                                            Мои все начинания использования данных программ, заканчивались в Ашане, где набираешь товар из разных финансовых категорий — авто, еда, одежда.
                                                                              0
                                                                              Можно ведь проанализировать чек. Это в любом случае полезно делать, иногда встречаются ошибки.
                                                                                0
                                                                                Согласен, ну после парочки таких анализов — забиваешь
                                                                              0
                                                                              Мне понравилась, 3-й день пользуюсь.… Но не хватает процентной ставки для вкладов, «расшареных» кошельков (по apple ID например) — у нас с женой по мимо личных счетов есть общие деньги=) Плюс бюджет не подходит для всех видов трат… Например есть «здоровье» — вот откуда я знаю какой месячный бюджет у моего здоровья. Это так называемые форс мажорные затраты, у которых не может быть бюджета.
                                                                                0
                                                                                вы код в обернули, уберите :)
                                                                                  0
                                                                                  долбанный хабрапарсер…
                                                                                  вот, что я хотел сказать: у вас код содержится в теге «пре», а «код» тут не понятно зачем… либо «код» уберите, либо оберните в него и уберите тег «пре»
                                                                                    0
                                                                                    спасибо большое! поправил.
                                                                                    0
                                                                                    Приобрел ваше приложение, без вопросов не остался, может поможете?
                                                                                    — Не нашел валюты «гривны».
                                                                                    — Не нашел как изменить уже выбранную валюту
                                                                                    — Решил потестировать все вокруг, в результате оказалось, что удалить бесследно мои эксперименты нельзя, я правильно понял?
                                                                                    — Не понял точного смысла разделов «счет» и «расходы», простите за недалекость.
                                                                                    — Транзакции — вообще испугали, не понял что и куда.
                                                                                    До этого аналогами не пользовался, так что для меня это все новое.
                                                                                      0
                                                                                      гривны будут (да, мы забыли :)
                                                                                      выбранная валюта меняется в режиме редактирования (профиль-->редактировать)
                                                                                      можно, swipe влево на ненужной транзакции в истории
                                                                                      доходы = зарплата, счета = наличные, яд, кредитки, расходы = категории трат

                                                                                      если не понятно шлите картинки, попробую на них объяснить
                                                                                        0
                                                                                        С вашего позволения я еще раз к вам пристану, но это последний, честно :)

                                                                                        На примере:

                                                                                        Я получаю доход 2 раза вмесяц из двух источников.
                                                                                        Есть ежемесячные траты типа мобильного, спортзала, интернета и пр.
                                                                                          0
                                                                                          И есть цели, например один долг висит.
                                                                                          Вот, вроде условно раскидал.
                                                                                          Как указать программе что я получил зарплату или заплатил за интернет?
                                                                                          img195.imageshack.us/img195/9117/img02291.png

                                                                                          Простите, вроде 17 лет за компьютером, а чувствую себя блондинкой сейчас :)
                                                                                            0
                                                                                            С радостью помогу :)

                                                                                            Вам нужно добавить счет (наличные, например) и перетащить монетку на него с доходов.

                                                                                            Получилось?

                                                                                              0
                                                                                              Наконец! Разобрался, спасибо
                                                                                      0
                                                                                      Промокоды еще остались? :)

                                                                                      Пользуюсь iBearSoft Money, уже довольно давно, не слезаю только из-за накопившейся там базы, сама программа бесит по многим причинам. Поэтому с удовольствием читаю о конкурентах, но так как покупать все программы без разбора не хочется, то стараюсь пощупать возможности программ до покупки. В связи с этим, планируется ли Lite версия приложения?

                                                                                      Хотелось бы иметь ПК-клиент для вдумчивого вечернего вбивания чеков — на компьютере это делать все же удобнее.

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

                                                                                      Приятна была бы возможность высылать подробные отчеты на свой Email для дальнейшего анализа.

                                                                                      Присутствуют ли кросс-валютные операции? То есть, платить с валютного счета другой валютой по курсу? Было бы очень полезно, часто требуется. (Пример, с долларовой карточки плачу коммунальные в местной валюте)

                                                                                      Как вижу, курсы обновляются, а как много валют поддерживается? iBearSoft неприятно удивил отсутствием моей валюты в списке, о чем я узнал только после покупки (MDL, Молдавский Лей).

                                                                                      Все вопросы основаны только на информации из статьи, программу не щупал, надеюсь будет шанс :)
                                                                                        0
                                                                                        Спасибо за советы! Коды кончились, но скоро будет распродажа.
                                                                                        0
                                                                                        Кому интересно, сейчас новогодняя распродажа на CoinKeeper (по доллару).
                                                                                          0
                                                                                          Хотел спросить, т.е. апплстор ныне позволяет продавать проги написанные на чистом C#? Я к тому, что не хотел бы тратить время, на обучение только одного obj-c, а начать с шарпа. Что посоветуете?

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

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