Хочу рассказать о своем опытом разработки приложения на Windows Phone 7.5, миграции его на Windows Phone 8, и что я думаю о перспективах в целом. Информация будет интересна в первую очередь начинающим разработчикам, так как сам я только недавно перешел с web разработки на мобильную и опыта у меня еще не очень много.
Что бы Вы не подумали, прочитав статью, что разработка под Windows Phone (WP) — ад кромешный, скажу сразу:
Ребята из Microsoft молодцы: отличный SDK, доступная ценовая политика, море документации, отличное комьюнити и с# — все это делает процесс разработки приятным и увлекательным. Просто я хочу рассказать именно о сложностях, с которыми я столкнулся.
Немного о том, чем я занимался. Задача стояла предельно простая:
есть успешное приложение на Iphone, Android, Ipad, Mac os, Windows (кому интересно) и нужно было перенести его на WP. Начинал я разработку в то время, когда на рынке телефонов от Microsoft передовой была Windows Phone 7.5 и вот-вот должна была появиться Windows Phone 8. После выяснения задачи следующее, что нужно было сделать — это определиться на чем писать и как писать. Если с тем, на чем писать вопросов не возникало, то над тем как писать пришлось задуматься. Дело в том, что я уже писал приложение для платформы WP7, но оно было простое и не требовало каких-либо сложных шаблонов проектирования. Начитавшись про крутость MVVM паттерна решил попробовать и начал искать фреймворки для его реализации. Больше всех мне понравился Mvvm Light toolkit за его простоту и легкий порог вхождения. Именно благодаря использованию MVVM процесс миграции на WP8, а затем и на Windows 8 стал в разы проще.
Дизайн
С дизайном мы провозились очень долго. Для нас этот опыт был первый и очень много было тонкостей. Кроме того не все то, что смотрится красиво, будет быстро работать на телефоне ( к примеру выбор между Pivot и Panorama). Так как мы сразу решили поддерживать светлую и темную темы, долго провозились с подбором backround — ов для страниц, но так и не пришли к варианту, который бы нас устроил (отдельный привет ApplicationBar, который как бельмо на глазу ). Советую сразу продумывать все менюшки в приложении и то, что у вас будет в ApplicationBar ( в него только самое необходимое: сохранить, удалить, отменить, добавить.). Подумайте как вы будете использовать accent colours и как это все будет смотреться в разных темах. Сетку мы попробовали и у нас не получилось. Я тогда первый раз узнал что такое полупиксель 8) (в приложении он и по сей день иногда всплывает 8) ). Минимализм хорошо, но сделать что-то выделяющиеся реально сложно.
А что с компонентами и контролами?
Все необходимые компоненты и контролы есть, но не все они работают так, как нужно. Начинал я с использования Windows Phone Toolkit. Все работало хорошо, но когда дело доходило до тонкостей, нужно было браться за напильник, особенно когда дело касалось производительности и юзабилити. Больше всего меня сводил с ума тормознутый LongListSelector. На одной из конференция я услышл о RadControls , попробовав я уже не смог работать с другими. Стоят не дорого, а времени сэкономят уйму, да и еще стандартные элементы, к примеру TextBox, PasswordBox, намного приятней в использовании (базовая анимация, clear button, открывания звездочек в PasswordBox ). Казус случился с Multiselect ListPicker, который напрочь отказался работать с Two-way databinding и пришлось немного шаманить.
Кроме того сводило с ума несколько вещей:
— Виртуальная клавиатура при появлении перкрывает нижнюю часть формы.С этой фичей я сражался на каждой странице и так полностью не победил. Пришлось каждую форму оборачивать в ScrollViewer и при появлении клавиатуры добавлять Margin с низу. Я реально не понимаю почему не работает как в Iphone.
— Переход по нажатию на кнопку ↲ на виртуальной клавиатуре, не переводит фокус на другой элемент, нужно обрабатывать самому. Для такой нехитрой операции я использовал хитрый helper
— Изменение фокуса элемента, при открытой виртуальной клавиатуре приводит к тому, что элемент сна который будет перенесен фокус, будет находиться под клавиатурой. ( я изменил фокус с Title на Original Title, нажав ↲)
— Пока фокус не уйдет с поля two-way DataBinding не происходит. К примеру, если в ситауции показанной на картинке выше, нажать на кнопку сохранить на AppBar, то все то, что будет в поле Original Title во ViewModel не прийдет. Это пришлось обходить при помощи кода
private void UpdateSource()
{
object focusObj = FocusManager.GetFocusedElement();
if (focusObj != null && focusObj is TextBox)
{
var binding = (focusObj as TextBox).GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
}
if (focusObj != null && focusObj is Telerik.Windows.Controls.RadTextBox)
{
var binding = (focusObj as Telerik.Windows.Controls.RadTextBox).GetBindingExpression(Telerik.Windows.Controls.RadTextBox.TextProperty);
binding.UpdateSource();
}
}
— ApplicationBar не работает с commands и локализировать ее можно только программно. Кроме того, сделать динамический ApplicationBar ( к примеру у каждого Pivot Item свой ApplicationBar) тот еще костыль. Пришлось использовать BindableApplicationBar , который очень плохо дружит с Expression Blend.
— Если Вы захотите показать большое количество текста на странице, Вас ждет разочарование в виде ограничения, и все что не вписывается 2048x2048 pixels будет поглащено черной дырой Microsoft, и поможет Вам только вот эта статья.
— как просто работать с картинками, чтобы они смотрелись на разных экранах одинаково хорошо, я не понял и использовал multi resolution image
База данных
С базой данных получилась самая большая заминка, я бы даже сказал реальный Fuck up. Версия WP7.5 (как и последующие) имеет свою встроеннуюю СУБД — SQL CE. Первая версия программы была реализована именно на этой СУБД. Надо сказать, что программа для Iphone, Ipad, Android и остальных ОС была написана с использованием SQlite. Но для WP7, на тот момент, официальных драйверов не было (как нет их и сейчас, появились только с версии Windows Phone 8 ), а с неофициальным связываться не хотелось. Для клиента это оказалось небольшим шоком, но со скрипом мы портировали уже готовую БД sqlite на SQL CE, создали модели, описали связи, индексы и т.д..
При работе с небольшими объемами данных БД работала без проблем, но когда количество записей переваливало за пару тысяч — тут начинались ощутимые тормоза. Я долго пытался оптимизировать работу с БД, но ничего не выходило. Кроме того, у меня стоит бесплатная версия студии и работать с БД было немного проблематично, вьювер для нее не ставился и пришлось долго и нудно искать программу для работы с sdf файлами.
Затем было принято решение начать разработку под Windows 8RT и каково было общее удивление, когда оказалось, что в Windows 8RT не потдерживается SQL CE и они рекомендуют использовать sqlite (к тому времени уже вышли версии драйверов sqlite для Windows 8RT Windows Phone 8 ).
Это был шок. Плюнув на все, решили искать варианты работы с sqlite на Windows 7.5. Потратив уйму времени, нашел устаревшую библиотеку. К счастью, в ней оказалась потдержка транзакций, без которой мы не смогли бы работать. Был написан небольшой helper для работы с библиотекой (могу дать страждущим). И все вроде заработало, но косяки в ней выгребаю и по сей день. Кроме того она очень плохо работает с UTF8.
Лично мною был сделан вывод: если нужна работа с БД, то только sqlite и только начиная с Windows Phone 8.
Работа с сервером
Работать с сервером оказалась не очень сложно. Облегчить работу с API мне помогла библиотека RestSharp (Simple REST and HTTP API Client for .NET) http://restsharp.org/. Единственной сложностью оказалось выполнение синхронных запросов. В WP7 это можно сделать используя делегаты. Правда, порою мне казалась, что я совсем запутался в хитросплетениях колбеков и приходилось производить рефакторинг.
Кроме того, работать с SSL оказалось невозможно и это очень грустно. Но в целом все не так страшно, как работа с базой данных.
Локализация
С локализацией особых проблем не было. В первой версии программы было решено поддерживать 12 языков. Переводы были сделаны с помощью сервиса http://www.icanlocalize.com. Ничего плохого сказать про работу сервиса не могу, но есть одно НО: работает только с IphoneAndroid и пришлось писать конвертер для конвертирования XML в resx и обратно (если кому надо — могу дать). И опять же есть небольшая несовместимость файлов локализации между Windows Phone и Windows 8 RT (Microsoft такой soft ). Небольшие трудности возникли с локализацией AppBar, но они легко обходятся.
“Ура”: новая Windows
Пока двигалась разработка, новость о том, что будет новая WP8 была все время на слуху. После презентации Windows Phone 8 в июне 2012 стало ясно, что телефоны на базе Windows Phone 7.5 не будут работать с WP8, а получат свое ущербное обновление. Для нас это оказалось довольно неприятной новостью. Ложкой меда было то, что программы, написаные для WP7.5, будут работать и на телефонах с WP8, но не смогут использовать все фичи новой ОС. Мы подумали: ну ок, нам, вроде, они и ни к чему. Но телефончик заказали.
Когда пришел телефон, пришлось ставить и новую студию 2012. Затем, в довесок к студии, купить новый ноутбук (так как нужен процессор выше i3 с поддержкой технологии SLAT ). Ну и конечно, Windows 8 ( куда ж без нее ...). В общем, переход получился очень затратный, как по времени, так и по деньгам. Установили на WP8 то, что мы сделали, поплакали и задумались: что делать дальше. Конечно, было не все так ужасно, но стало ясно, что в таком виде выходить нельзя. Основная проблема была в картинках, сплеш скринах, иконках, но и некоторые компоненты отказались работать. В решении этой проблемы помогла статья http://developer.nokia.com
можно посмотреть и вот ее
Делая отдельные проекты для каждой версии в одном солюшене, я все время радовался, что еще в самом начале принял решение использовать MVVM паттерн.
В MARKETplace
Так как у приложения уже было свое community ( для меня было откровением, что так много людей имеют телефоны на разных платформах одновременно), то мы решили сделать Betta Testing, и очень здорово, что платформа позволяет это сделать. Пригласив людей с форума имеющих WP телефоны начали тестирование. На исправление ошибок ушло около двух месяцев, попутно поменяли дизайн и нарастили функционал (все для клиента). К релизу мы подошли уже уверенные в себе, огромное спасибо тем людям, которые учавствовали в тестировании.
Загрузка приложения в магазин прошла быстро, сертификация заняла 8 дней и прошла с первого раза. Единственная морока была с подготовкой скринов, так как нужно для каждого языка делать свой набор скринов, а у нас 12 языков. Начались продажи, и вскоре выплыл один баг, который нужно было срочно исправить. Исправил я его за 10 минут и отправили update на сертификацию. Создали тикет в Microsoft с описанием того, что случилось и просьбой ускорить сертификацию. Ответа не получили, так же как и ускорения — 7 рабочих дней 8(, а с учетом выходных 9. 9 дней волнений и самобичеваний. Я уверен, что им для таких случаев нужно делать отдельный механизм сертификации, ведь проверить где и что поменялось с предыдущей версии не может занимать так много времени. Хотя бы для критических ошибок, ведь это и их деньги тоже.
Разместили рекламу в соцсетях, на сайте и сделали рассылку. Начало продаж было вяленьким и клиент сразу поник, так как у него уже был опыт запуска этого приложения на других платформах. Естественно после пика загрузок и покупок при запуске начался медленный спад продаж. На сегодняшний день продажи составляют в средней 10 приложений в сутки, что есть очень низким показателем в сравнении с другими платформами (50 покупок в день для Android и 150 для Iphone)
Статистика загрузок выглядит где-то так:
Ну и в сравнении с Iphone и Android
Очень расстраивает не то, что продажи такие низкие, а то что при таких низких продажах мы находились в рейтингах Top Paid приложений:
— Италия, Швеция, Норвегия: 40 место
— США: 70 место
— Швецария: 16 место.
— Чехия: 6 место
— Франция: 50 место
А в нутри своей категории на первомвтором местах! и это при таких низких покупках!!!
Можно предположить, что у приложений находящихся в топах дела идут чуть-чуть лучше.
Конечно необходим грамотный promotion, но даже если продажи вырастут в два раза, мы не догоним Android и не окупим дальнейшую разработку приложения.
На сегодняшний день, к сожалению, заказчик решает вопрос о целесообразности продолжении поддержки приложения для WP платформы, а я думаю над тем стоит ли связываться и в дальнейшем с этой платформой.
Автор: vovich