Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 10907 сообщений
Cообщения с меткой

ios - Самое интересное в блогах

Следующие 30  »
masiania1

Игра Jet car stunts android и iOS

Суббота, 19 Августа 2017 г. 22:36 (ссылка)
lapplebi.com/games/3989-jet...i-ios.html

Это великолепная 3D гонка с довольно необычной целью для гоночного жанра.
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Полезные книги о разработке мобильных игр на Android и iOS

Четверг, 17 Августа 2017 г. 17:30 (ссылка)

image



Вы решили заняться разработкой мобильных игр. С чего начать? Большинство программистов в геймдеве не ходили в учебные заведения, специализирующие только на играх. Скорее, это был какой-нибудь аналог GeekUniversity с видеоуроками или самостоятельный путь, начавшийся с огромного количества любимых игр, разбора механики, курсов в целом по мобильной разработке, оттачивания найденных алгоритмов в простых игрушках, создаваемых для первого портфолио.



Вне зависимости от выбранного пути, рано или поздно появится необходимость подключить еще один источник знаний, и тут вы можете задуматься о книгах. Учитывайте, что ни одна книга по мобильной разработке не заменит практику. В больших статьях по геймдеву вы слово «книга» можете вообще не встретить. Однако книги имеют определенное преимущество по сравнению со статьями — легко отсортировать их по рейтингу и выбрать лучшие.



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

Читать дальше ->

https://habrahabr.ru/post/335606/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Борьба с динамическими библиотеками в Swift

Среда, 16 Августа 2017 г. 16:51 (ссылка)

Честно говоря, когда мы приступили к работе над перезапуском Яндекс.Карт, я и представить себе не мог, сколько проблем нам в итоге доставит Swift. Если вы начали писать на Swift совсем недавно, то, поверьте, вы пропустили все самое интересное. Каких-то два года назад не было инкрементной компиляции в принципе (даже пробел в любом файле приводил к полной пересборке), сам компилятор постоянно вылетал с Segmentation Fault на вполне безобидных вещах вроде тройной вложенности типов или наследования от Generic, индексация проекта длилась невообразимо долго, автодополнение работало через раз и так далее и тому подобное, всех бед не счесть. Подобные моменты несомненно усложняют жизнь программистам, но постепенно решаются с каждым обновлением Xcode. Однако есть более существенные проблемы, влияющие не только на разработку, но и на качество приложения: запрет компиляции статических библиотек из свифтового кода, а также отсутствие поддержки Swift на уровне iOS.





Изначально не было очевидно, что использование Swift и динамических библиотек приводит к росту времени запуска. Мы не сравнивали время запуска с предыдущей версией и воспринимали долгую загрузку как данность. Да и средств диагностики того, что же на самом деле происходит на этапе загрузки приложения, в общем-то не было. Но в один прекрасный день разработчики Apple добавили возможность профилирования работы системного загрузчика. Оказалось, что загрузка динамических библиотек занимает очень много времени по сравнению с другими этапами. Конечно, с нашим кодом тоже не все было идеально, но, пожалуй, это частные особенности отдельного приложения и не всем будет интересно о них читать. А вот борьба с динамическими библиотеками — общая тема для всех разработчиков, использующих Swift. Именно об этой проблеме и пойдет речь.


Читать дальше ->

https://habrahabr.ru/post/335768/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест интересных материалов для мобильного разработчика #216 (6 августа — 13 августа)

Воскресенье, 13 Августа 2017 г. 16:28 (ссылка)

В центре этой недели – история противостояния разработчиков, ДИТа Москвы и закрытие API для доступа к электронным дневникам. А кроме нее: автоматизация тестирования, чистая архитектура, мобильный фрод и многое другое.












Сначала они воруют, а когда ты побеждаешь, то тебя убивают

В начале лета 2017 года, я спросил ЕМП: «Будут ли какие-то изменения в методах или в функционале?», а мне ответили, что пока они не знают. 1 августа я получил письмо о том, что АПИ больше не будет и попросили меня сообщить моим пользователям, что теперь надо пользоваться госуслугами.




Заблуждения Clean Architecture

На первый взгляд, Clean Architecture – довольно простой набор рекомендаций к построению приложений. Но и я, и многие мои коллеги, сильные разработчики, осознали эту архитектуру не сразу. А в последнее время в чатах и интернете я вижу всё больше ошибочных представлений, связанных с ней. Этой статьёй я хочу помочь сообществу лучше понять Clean Architecture и избавиться от распространенных заблуждений.




Разработка интерфейса приложения для пожизненного использования на примере мобильного дневника диабета

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



Дайджест доступен и в виде рассылки. Подписаться вы можете тут.



iOS





Android





Windows





Разработка





Аналитика, маркетинг и монетизация





Устройства, IoT, AI







< Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335534/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Разработка интерфейса приложения для пожизненного использования на примере мобильного дневника диабета

Четверг, 10 Августа 2017 г. 19:30 (ссылка)

https://habrahabr.ru/post/335372/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

UI-тесты для iOS: почему нужно поверить в дружбу QA и разработки, но не обольщаться

Четверг, 10 Августа 2017 г. 15:51 (ссылка)



С недавних пор мы взялись за внедрение UI-тестирования в iOS для iFunny. Путь этот тернист, долог и холиварен. Но все равно хочется поделиться с умными людьми своими первыми шагами в этом направлении. На истину не претендуем – всё примеряли к собственному продукту. Поэтому под катом немного информации о том, что такое iFunny на iOS и зачем нам понадобился UI + много фидбека по инструментам и примеров кода.



Что такое iFunny на iOS



iFunny — это популярное в США приложение про юмор и мемы с ежемесячной аудиторией в 10М. Подробнее о том, как все затевалось, можно прочитать здесь. Разработка приложения на iOS стартовала 6 лет назад, и мы до сих пор обходимся без каких-либо революционных вкраплений:


  • 99% кода держим на Objective-C;

  • придерживаемся классического MVC с аккуратными делениями на модули;

  • активно работаем с Cocoapods для зависимостей;

  • используем собственный проигрыватель webm-контента: сторонние решения тормозили, не давали контенту зацикливаться и прочее. В случае с iFunny, который является полностью UGC, эта тема критична;

  • форк от SDWebImage используем не только для картинок, но и для остального загружаемого контента;

  • для API выбираем RestKit – достаточно зрелый фреймворк, за несколько лет работы с которым почти не было проблем.



Unit-тесты



У нас все наоборот: работать — значит мемы смотреть :)



Unit-тесты мы используем для критичных моментов бизнес-логики и Workarounds.

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



- (void)testIsNewFeaturedSetForContentArrayFalse {
FNContentFeedDataSource *feedDataSource = [FNContentFeedDataSource new];
NSMutableArray *insertArray = [NSMutableArray arrayWithArray:[self baseContentArray]];
feedDataSource.currentSessionCID = @"0";
BOOL result = [feedDataSource isNewFeaturedSetForContentArray:insertArray];
XCTAssertFalse(result, @"cid check assert");
feedDataSource.currentSessionCID = @"777";
result = [feedDataSource isNewFeaturedSetForContentArray:insertArray];
XCTAssertTrue(result, @"cid check assert");
}




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

Xcode и Objective-С не давали какого-либо решения для защиты от неправильно написанного кода.

Поэтому мы написали такой тест:



- (void)testAllAnalyticParametersClasses {
NSArray *parameterClasses = [FNTestUtils classesForClassesOfType:[FNAnalyticParameter class]];
for (Class parameterClass in parameterClasses) {
FNAnalyticParameter *parameter = [parameterClass value:@"TEST_VALUE"];
XCTAssertNotNil(((FNAnalyticParameter *)parameter).key);
XCTAssertNotNil(((FNAnalyticParameter *)parameter).dictionary);
}
}




Здесь проверяется, что у класса определены 2 статичных метода, key и dictionary, необходимых для правильной работы отправки событий в системы аналитики.



UI-тесты



Мы уже достаточно хорошо изучили работу с UI-элементами и поразмышляли над тестовым окружением в процессе написания тестов для Android. Получилось примерно так:


  • отдельный flavor для запуска приложения с предварительными настройками, чтобы не задавать их вручную в тестах каждый раз;

  • моки для API с использованием WireMock, чтобы каждый раз не лезть за ответами на сервер и не зависеть от него;

  • поигрались с процессом запуска тестов и настроили на CI Bitrise достаточно удобный флоу, в ходе которого тесты заливаются и запускаются на реальных девайсах в Amazon Device Farm, отчеты со скриншотами и видео мы можем посмотреть там же, перейдя по ссылке из Bitrise.



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



Пришла очередь iOS, и мы, команда QA и iOS-разработчики, начали с того, что еще раз собрались и аргументировали для себя, зачем нам нужны автотесты. Это был важный ритуал, и действовал он почти как мантра:


  • уменьшить объем ручных проверок;

  • автоматизировать регресс;

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





Инструменты



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





Appium – популярный кроссплатформенный фреймворк. Бытует мнение, что именно он станет стандартом в тестировании мобильных приложений в ближайшем будущем. Несколько месяцев назад мы решили потестить его как с полгода вышедшей iOS 10, но немного огорчились: версия Appium с ее поддержкой была в бете, а использовать в проде нестабильную версию не очень хотелось. Appium Inspector, который работает на Android, тоже использовать не смогли: не было поддержки Xcode 8 и iOS 10. Вскоре они выпустили stable-версию, но ждать полгода после обновления оси для нас крайне нежелательно. Решили не мучить ни себя, ни Appium.





Calabash – кроссплатформенное open source решение, которое использует подход BDD в написании тестов и до последнего времени поддерживалось компанией Xamarin. Недавно разработчики сообщили, что поддержка – всё. Мы тоже решили дальше не идти.





И, наконец, XCTest – нативный фреймворк от Apple, который мы в итоге выбрали. Поэтому почитайте про плюсы:


  • нет лишних зависимостей, которых у нас в проекте и так много;

  • кроме самого Apple, никто со стороны не принесет и не добавит багов. У нас уже был опыт с Appium и KIF. Получалось так, что внизу все равно используется XCTest и баги Apple накладываются на баги KIF, а это значит садись, дружок, и ковыряй большие фреймворки. Эти зависимости нам точно были не нужны;

  • можно использовать стандартные языки iOS-разработки Objective-C и Swift: QA могут легко взаимодействовать с разработчиками;

  • тестируемое приложение – это черный ящик, кроме того, в тесте можно работать с любым приложением в системе.



Потом рассмотрели еще и Recorder — нативный инструмент от Apple, который позиционируется как вспомогательный, без надежды на то, что он будет использоваться при написании реальных тестов. С его помощью можно изучить лейблы UI-элементов и поиграться с основными жестами. Recoder сам пишет код и генерирует указатели на объекты, если это не было сделано при разработке. Это единственное преимущество, которое мы смогли выделить. Минусов оказалось гораздо больше:


  • сложно записать тест, потому что UI тормозит – делаешь какое-то действие и ждешь секунд 10-15, чтобы оно записалось. Неудобно;

  • код пишется всегда разный. Сегодня я такой умный и назову этот элемент button[1], а завтра – “smilebutton”. Непонятно;

  • постоянные ошибки в распознавании жестов. Вы можете сделать swipe left, а он определит, что это tap. Делаешь tap, а это уже swipe. Нестабильно;

  • сломанный тест, записанный с помощью Recorder, скорее всего, придется заново полностью переписывать, потому что он не будет отражать реальной ситуации. Просто WTF?!





Разработчик спешит на помощь



А теперь про проблемы, с которыми столкнулись на практике: их мы будем решать, привлекая разработку.



Черный ящик





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



Также нам понадобились pre-action в Xcode.

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



xcrun simctl uninstall booted ${PRODUCT_BUNDLE_IDENTIFIER}




C Environment-переменными мы работаем так:



app = [[XCUIApplication alloc] init];
app.launchEnvironment = @{
testEnviromentUserToken : @"",
testEnviromentDeviceID : @"",
testEnviromentCountry : @""
};
app.launchArguments = @[testArgumentNotClearStart];




В тесте создается объект приложения и в поля launchEnviroment и launchArguments записывается словарь (или массив) с настройками, которые нужно передать в приложение.

В приложении настройки и аргументы считываются в делегате при самом старте приложения в методе:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions


Так у нас выполняется обработка:



NSProcessInfo *processInfo = [NSProcessInfo processInfo];

[FNTestAPIEnviromentHandler handleArguments:processInfo.arguments
enviroment:processInfo.environment];




Класс TestAPIEnvHandler реализует обработку словаря настроек и массива аргументов.



Свойства элементов



Когда мы начали работать с ХСТest для UI, возникла проблема: стандартный набор инструментов не дает считывать шрифты и цвета.

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

После поиска альтернативных решений мы посмотрели в сторону Accessibility API, с помощью которого работают UI-тесты.



В качестве “моста” между тестом и приложением решили использовать accessibilityValue, который есть у каждого видимого элемента из iOS SDK.

Поехал велосипед, и получилось такое решение:


  1. В accessibilityValue записываем json-строку.

  2. В тесте читаем и декодируем.

  3. Для UI-элементов пишем категории, которые определяют набор необходимых нам в тестах полей.



Вот пример для UIButton:



@implementation UIButton (TestApi)

- (NSString *)accessibilityValue {
NSMutableDictionary *result = [NSMutableDictionary new];
UIColor *titleColor = [self titleColorForState:UIControlStateNormal];
CGColorRef cgColor = titleColor.CGColor;
CIColor *ciColor = [CIColor colorWithCGColor:cgColor];
NSString *colorString = ciColor.stringRepresentation;
if (titleColor) {
[result setObject:colorString forKey:testKeyTextColor];
}
return [FNTestAPIParametersParser encodeDictionary:result];
}

@end




Чтобы прочитать accessibilityValue в тесте нужно обратиться к ней, для этого у каждого объекта XCUElement есть поле value:



XCUIElement *button = app.buttons[@"FeedSmile"];
NSData *stringData = [button.value dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:stringData options:0 error:&error];




Пользовательские взаимодействия



Проблема жестов и экшенов решается (о чудо!) самим инструментом, благодаря большому набору стандартных методов – tap, double tap. Но в нашем приложении есть не только стандартные, но и очень нетривиальные вещи. Например triple tap, свайпы по всем осям в разные стороны. Чтобы это решить, мы использовали те же стандартные методы, конфигурируя параметры. Большой занозой это не оказалось.



Пример простого теста с использованием подхода:








  • запускаем iFunny с определенными настройками;

  • выбираем страну;

  • выбираем нужного пользователя;

  • указываем доп.настройки (первый ли это запуск приложения или нет);

  • проверяем открытие ленты и загрузку контента;

  • делаем смайл;

  • проверяем через UI засмайлен ли контент (изменилось состояние кнопки). Продолжаем скролить;

  • смотрим мемасики и радуемся жизни.





- (void)testExample {
XCUIElement *feedElement = app.otherElements[@"FeedContentItem"];
XCTAssertNotNil(feedElement);
XCUIElement *button = app.buttons[@"FeedSmile"];
[button tap];
[[[[XCUIApplication alloc] init].otherElements[@"FeedContentItem"].scrollViews childrenMatchingType:XCUIElementTypeImage].element tap];

NSDictionary *result = [FNTestAPIParametersParser decodeString:button.value];
CIColor *color = [CIColor colorWithString:result[testKeyTextColor]];
XCTAssertFalse(color.red - 1.f < FLT_EPSILON &&
color.green - 0.76f < FLT_EPSILON &&
color.blue - 0.29f < FLT_EPSILON,
@"Color not valid");
XCUIElement *feed = app.scrollViews[@"FeedContentFeed"];
[feed swipeLeft];
[feed swipeLeft];
[feed swipeLeft];
}




Мы не планировали делать полное тестовое покрытие, поэтому на этом наши эксперименты пока закончились. Стало ясно, что если мы когда-то решимся полноценно внедрить автотесты в процесс, использовать будем XCtest, но сейчас заниматься этим на постоянной основе очень трудозатратно. И вот почему:


  • все равно придется изобретать велосипеды;

  • QA не сможет в полном объеме тестировать приложения без разработчиков;

  • UI-тесты для нашей продуктовой разработки – это лухари функционал и применять его получается только в исключительных случаях.



P.S. При съёмке превью ни один баг не пострадал. Семён продолжает вдохновлять команду QA.




Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335328/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Социальная сеть для киноманов или как не закопаться, разрабатывая еще одну соцсеть

Среда, 09 Августа 2017 г. 14:58 (ссылка)

Редизайн или немного больше?



Осенью 2016 года ко мне по рекомендации обратился заказчик с просьбой разработать iOS приложение для киноманов с достаточно обширным функционалом. На тот момент уже существовал готовый прототип с, мягко говоря, примитивным UI. Задача стояла следующим образом: сделать редизайн с доработкой “кое-какого” функционала. Уже тогда у меня закралась идея, что редизайном дело не обойдется, но на сколько объемный это проект я не осознавал. Но тем интереснее…





Приступив к работе, я начал поиск подходящих решений для UI. Конечно же, сначала был проведен обширный ресерча существующих приложений на рынке. Были пересмотрены десятки рекомендательных сервисов о кино, начиная от всем известных IMDb и Rotten Tomatoes и заканчивая новыми сервисами, которые в маркете появились совсем недавно.



Социальная сеть или рекомендательный сервис?



Итогом процесса ресерча стало два варианта UI, которые значительно разнились между собой как внешне, так и по смысловому предназначению.



Первая «юайка» представляла собой темный интерфейс проводящий аналогию с кинотеатром. Яркие управляющие элементы, напоминающие светящиеся в темноте зеленые вывески «Выход” в кинозалах, которые однозначно дают понять свое предназначение.



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



В этот момент стал вопрос “какое основное предназначение приложения: рекомендательный сервис или же полноценная социальная сеть для киноманов?”. Решение было принято в пользу социальной сети. В этот момент я однозначно понял, что ввязался в нешуточную историю. Но почему-то меня это не остановило, а наоборот подзадорило. Такую задачу я еще не решал.



Flow



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





C учетом ориентира на социальную сеть, была доработана вторая версия UI. В пользу еще большего акцента на контент приложения, было принято решение отказаться от большинства цветов. Остался только акцентный синий цвет, похожий на системный цвет операционной системы Windows и несколько оттенков серого для текстов. В качестве основного шрифта остановились на универсальном общедоступном Open Suns, а для заголовков я выбрал один из моих любимых шрифтов Montserrat.





Я приступил к разработке интерфейса с одного из главных экранов – movie page.



Данный screen содержит полную информацию о фильме.

Перечень элементов Movie Page:




  • название,

  • продолжительность,

  • дата релиза,

  • жанры,

  • описание,

  • режиссер,

  • актеры



А также на movie page выводятся рейтинги авторитетных ресурсов о кино:




  • IMDB

  • Rotten Tomatoes

  • Raters Friends – рейтинг друзей, собственный рейтинг приложения, который формируется по формуле среднего арифметического рейтинга исключительно друзей пользователя. Данный рейтинг собственно является одним из главных УТП (уникальное торговое предложение) приложения.



Кроме этого на movie page должны присутствовать основные управляющие элементы – кнопки Rate и To Watch List. С помощью первой выставляется рейтинг фильм, вторая кнопка добавляет фильм в To watch list. Оба действия взаимоисключающие, а это значит, что после нажатия одной из них, вторая кнопка должна стать недоступной.



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



Далее последовали остальные экраны, такие как Timeline, Raters Friends, Comment page, все экраны Login/Registration, экраны имеющие отношение к Profile и еще несколько десятков скринов.



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



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





Иконографика



Главное управляющее меню имеет простые понятные иконки, нажатием на которые осуществляется навигация между основными экранами:




  1. Timeline

  2. Search

  3. Notification

  4. Profile



Более объемные иллюстрации были созданы преимущественно для Landing Page, но также используются в Onboarding.







Иконка



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





Зачем приложению сайт?



После детальной проработки всех элементов интерфейса и всех лейаутов настало время для разработки Landing Page. Я считаю, что любое уважающее себя приложение обязано иметь посадочную страницу. Raters App не стал исключением. Во время разработки приложения основная задача лендинга заключалась в сборе эмейлов, для оповещения о релизе приложения. После релиза лендинг должен перенаправлять трафик на маркетплейсы: AppStore и GooglePlay. Но при этом сайт должен подробно рассказать об основных фичах приложения.





Приблизительно таким образом рекомендательный сервис перерос в социальную сеть. Конечно, данный проект никогда не будет полностью завершен, он как и любая „социалка“ должен итеративно обновляться и развиваться в ногу со временем. Уже на данный момент расписан график нескольких апдейтов. Но чтобы это произошло, Raters App нужны базовые пользователи, а как их получить уже совсем другая история.




Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335252/

Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<ios - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda