Не дадим Windows Phone умереть! Как я написал свои клиенты VK, YouTube для Nokia Lumia? Сам себе экосистема ч.2


Windows Phone. когда слышишь название этой мобильной системы, невольно начинаешь с теплотой вспоминать своего последнего, такого необычного мобильного друга, как будто прошло всего пару месяцев с момента перехода со смартфона на iPhone/Android . Но с момента фактической смерти Windows Phone прошло почти 10 лет! Увы, время не повернуть вспять и мобильное подразделение Nokia не спасти, но если у вас есть навыки разработки мобильных приложений, большой энтузиазм и фанатизм, есть шанс вернуть к жизни вашего старого друга! Недавно я снова полон энтузиазма и смог вернуть к жизни старую Люмию, выписав с нуля собственных клиентов на нужные мне услуги - и я готов поделиться этим с вами во всех подробностях!

Сегодня вы узнаете о моей мотивации оживлять старые смартфоны, о трудностях разработки мобильных приложений, о том, как Windows Phone был на голову выше Android в техническом плане и почему провал Windows Phone — одна из самых больших потерь в истории мобильный рынок. Интересный? Тогда добро пожаловать в статью!

❯ Предыстория


Возможно, довольно большой процент моих читателей и подписчиков когда-либо владели и использовали смартфоны на базе Windows Phone. Мнения пользователей этой мобильной платформы во многом расходятся – кто-то хвалит действительно продуманный и плавный интерфейс, кто-то ругает Microsoft за «обман» с обновлениями, но большинство сходятся во мнении, что Windows Phone был очень необычным и имел свою душу.


Конечно, Windows Phone был далеко не первым выходом Microsoft на рынок мобильных устройств. До этого компания из Редмонда поддерживала очень крутую платформу для коммуникаторов и КПК под названием Windows Mobile. По сути, это был полноценный компьютер в кармане — большинство кнопочных телефонов могли максимум запускать простые J2ME-приложения, тогда как WM позволял запускать множество разных программ — как написанных на C++/Pascal, так и написанных на C. #/ВБ.Нет. Мобильная платформа старалась во всем подражать старшему брату — системный API был очень похож на то, что мы видим в обычной Windows — это и полноценная оконная система, и waveout для вывода звука, и GDI для вывода графики.


Windows Mobile хорошо заняла свою нишу на мобильном рынке: HTC постоянно представляла новые модели коммуникаторов, которые неплохо продавались. Но затем появился первый iPhone, который перевернул все с ног на голову. Оказывается, вашим смартфоном можно полностью управлять пальцами, нажимая на красивые анимированные элементы интерфейса! Это перевернуло всю индустрию с ног на голову – даже Nokia с Symbian было трудно конкурировать с продуктом Apple. В Microsoft увидели, что пользователям нужна не столько свобода и настройка в системе, сколько плавный интерфейс, стабильность и простота использования.


Zune HD стал дебютом нового подхода к созданию интерфейсов — Metro UI. И хотя само устройство не обрело особой популярности и стало в некотором роде провальным, Microsoft взяла на вооружение концепцию этого интерфейса, чтобы реализовать его уже в полноценной мобильной ОС. В октябре 2010 года вышла первая версия новой мобильной платформы Microsoft — Windows Phone 7, положившая начало самой системе, которую мы до сих пор вспоминаем с теплотой!


На WP7 вышло много устройств: есть аппараты от HTC и смартфоны Lumia от Nokia, и даже продолжение линейки Omnia от Samsung! Но у этой платформы были и серьёзные недостатки: она базировалась на ядре обычной Windows CE (оно также использовалось в Windows Mobile), а из-за желания повысить безопасность системы Microsoft отключила возможность использовать в своих программах код на родном языке. Приложения. Кроме того, WP7 во многом был довольно сырым — хотя для него регулярно выходили обновления.

❯ Почему провал WP — трагедия для мобильного рынка?


Разумеется, параллельно с доработкой WP7 компания Microsoft разработала новую версию операционной системы, которая должна объединить мобильные и десктопные приложения в одну общую концепцию. Кроме того, разработчики решили отказаться от легковесного ядра Windows CE в пользу более тяжелого и совершенного ядра Windows NT, которое используется в полноценных версиях Windows.


К сожалению, обновления с WP7 до WP8 не произошло, что многие пользователи считают «мошенничеством» со стороны Microsoft. Частично это так, но проблема заключалась в том, что даже флагманские устройства на WP7 имели 512 МБ оперативной памяти, чего было недостаточно для первой версии WP8. Думаю, в какой-то степени Microsoft просто не хотела портить имидж самых плавных смартфонов тормозами обновлённой системы, хотя примеры быстрой работы на 512 МБ ОЗУ есть — например, Lumia 520.


Но где WP8 был передовым, так это под капотом. Microsoft смогла сделать нечто немыслимое для мира ARM-устройств: они реализовали обычный уровень абстракции от аппаратного обеспечения и представили концепцию ACPI, известную нам по обычным настольным ПК. Если коротко, то ACPI — это что-то вроде списка оборудования в устройстве, для которого операционная система должна найти и загрузить драйверы, не забывая при этом выделить для всего этого ресурсы (дерево устройств в Linux реализует аналогичную концепцию). Кроме того, Microsoft реализовала в своих смартфонах полноценный UEFI, что позволило, например, создать в будущем двойную загрузку. На практике это означает, что даже неподдерживаемые смартфоны No-Name можно обновить до Windows 10, просто изменив несколько ключей в реестре: на Android-устройствах это немыслимо. По сути, это стандартизация оборудования ARM.


На этом технические возможности Windows Phone не заканчиваются. Переходя к пользовательской части, стоит упомянуть фреймворк для построения интерфейса (WPF/Silverlight), который работает очень быстро «из коробки», отлично масштабируется под разные размеры экрана и предлагает мощные возможности по анимации и адаптации интерфейса под свои нужды стиль приложения. А сам SDK навязал изначально правильную концепцию программирования, заставив распределять все задачи по отдельным потокам, не только используя дополнительные ядра процессора, но и улучшая взаимодействие с пользователем от приложения (неправильно написанные Android-приложения могут легко зависать при выполнении некоторой работы).


И третья классная возможность, о которой все почему-то забыли, — это поддержка DirectX 11. Разумеется, в WP7 уже была поддержка Xna (именно на ее основе была написана Terraria), что позволяло одновременно писать игры для Windows, Xbox 360 и мобильные телефоны, но он имел некоторые ограничения и представлял собой прослойку между графическим API (например, Direct3D или OpenGL) и самой игрой. Windows Phone 8 же предоставил настоящий полноценный DirectX 11 — он хоть и поддерживал максимум других шейдеров, но умел делать те трюки, которые не умел Android — экземпляры для оптимального рендеринга геометрии, настройки состояния в «пакетах» и эффективное управление ресурсами шейдера «без привязки». Теоретически это позволяло портировать полноценные игры для ПК/Xbox на Windows Phone, хотя на практике этим пользовались немногие.


Ну а если вы помните спор о махинациях Microsoft с обновлениями, то помните, что была обратная совместимость с приложениями для предыдущих версий системы: на Windows Phone 8 можно было хорошо поиграть и с Windows Phone 7 (NFS Undercover, NFS Hot Pursuit, Mirrors Edge и еще несколько классных мобильных игр), а на Windows 10 Mobile можно запустить практически любое приложение для Windows Phone 8.


Так почему же потеря WP стала трагедией для мобильного рынка? И вы сейчас смотрите на свой Android-смартфон. Сколько у него оперативной памяти? 4ГБ? 8 ГБ? 12 ГБ? Вас не беспокоит, что Android умудряется неприятно тормозить даже при таких ресурсах? А теперь вспомните Lumia 520: Snapdragon 200, 512 мегабайт ОЗУ. Вот как это работает прямо из коробки:

Думаю, все это красноречиво объясняет тот факт, что без WP на рынке сложилась дуополия — Android продолжает быть жирным, пустой тратой ресурсов и при этом из года в год практически не получает новых чипов, а iPhone, хотя и все так же плавен и шустр, ребята из Apple явно не чувствуют конкуренции и их смартфоны стагнируют в плане дизайна и в какой-то степени интерфейса…

❯ Мотивация


Мои давние читатели знают мою любовь к смартфонам прошлых лет. Для меня не существует понятия планового устаревания: если есть комплект разработки и документация к устройству, то я могу сам добавить нужные мне приложения, если очень захочу.
Мой проект SelfEco (само экосистема) как раз об этом — почти полгода назад я написал клиент YouTube и ВК для Android 2.2+. Фактически это означает, что мои приложения работали на ВСЕХ Android-смартфонах начиная с 2010 года выпуска.


Я свободно делюсь исходным кодом своих приложений — как для примера для читателей, так и для возможности каких-то исправлений в будущем или даже модов. В 2021-2022 году ездил с Lumia 640XL с Win10 Mobile на борту, как с основным смартфоном. И в целом меня все устраивало и все нравилось: был и подходящий клиент ВК (ЛунаВК) и обычный клиент корзины, а браузер еще нормально переваривал некоторые страницы. Но больше всего мне нравится Windows Phone 8 — он работает еще быстрее и несколько строже в плане дизайна. Да и "люмия" сейчас стоит копейки - моя 640XL обошлась мне в 100 российских рублей (~$1,5 по такой цене), я не шучу. А на интернет-барахолках можно найти живые, целые устройства с нормальными аккумуляторами за 200-500 рублей, иногда даже в родных коробках!


Lumia 1320 и Lumia 640XL — это подарки для читалок Kotenilla!
Так почему бы не использовать всю эту крутость и мощь во благо, учитывая дешевизну смартфонов? Решено: Скачать SDK и написать свой клиент для ВК и YouTube - это тот минимум приложений, который мне нужен!

❯ Подготовка


Для отладки и установки сторонних приложений на смартфоны Windows Phone их необходимо сначала разблокировать и выполнить «Разблокировку взаимодействия». Процедура простая и на большинстве люмий занимает немного времени.

Обратите внимание: Экономный ремонт Iphone 8.

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

❯ YouTube


Начнем с клиента YouTube. На самом деле, концепция совершенно не изменилась со времени прошлой статьи — мы по-прежнему используем Invidous API для получения информации о видео. Нативный API YouTube — это полный бардак, да еще и ограниченный одним токеном, тогда как Invidous сам управляет токенами и распределяет их по мере необходимости. Нам просто нужно написать «лицо», которое будет отображать полученные с сервера данные и отправлять ссылку на видео во встроенный плеер.


В отличие от Android, с TLS проблем не возникло: смартфон без проблем смог связаться с экземпляром Invidous и получить данные о трендовых видео. Сам по себе формат ответа очень прост и возвращается в формате JSON, который можно описать такой иерархией:

Практически сразу система навязывает нам распараллеленную парадигму написания кода — часть API просто не имеет синхронных аналогов! Например, из WebRequest убрали GetResponse, чтобы неопытные разработчики не совершали ошибок и не пытались вызывать длинные операции ввода-вывода в основном потоке (из-за чего приложение зависает). В самой NET есть классный механизм задач (мульти- потоковые задачи) и реализацию концепции async/await, которая позволяет дождаться завершения операции, не блокируя остальную часть приложения.

Я решил придерживаться более знакомой концепции обратного вызова, которая позволяет мне обрабатывать ошибки в таких случаях, и вообще мне не очень нравится такой синтаксический сахар (а async/await — это «сахар», потому что он разворачивается в Государственный аппарат). В качестве десериализатора (механизма разбора JSON непосредственно в экземпляры класса с помощью отражения) я использовал классический Newtonsoft.Json.

После того как механизм получения и обработки данных с сервера был готов, я приступил к реализации интерфейса приложения. И здесь WP показал себя во всей своей списочной красе? RecycleView? После этих костылей винфон нормально может отрисовывать выбранные вами в ScrollView элементы интерфейса. И что забавно: в Android даже реализация со ScrollView вызывала задержки при активной загрузке данных — на WP такого вообще нет! Все просто работает из коробки!

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

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

А дальше логика воспроизведения видео, которая запускает встроенный плеер и отправляет ему ссылку на видео — которая выбирается в зависимости от кодека (только mp4), разрешения устройства и предпочтений пользователя:

Кроме того, в приложение пришлось добавить настройки — в WP8 нет для этого встроенных инструментов, логику приходится реализовывать самостоятельно. Впрочем, ничего сложного в этом нет — глобальный синглтон с полями настроек и логикой сохранения/загрузки (тут код не влез, нормальной подсветки кода нет).

WP предлагает специальное изолированное хранилище для пользовательских программ — IntegratedStorage, к которому невозможно получить доступ из остальной части системы (без разблокированного загрузчика и режима Mass Storage). Там же можно хранить конфигурации — но с некоторыми API для файлов они очень умные — навязывать параллельное чтение обычно небольших файлов — это уже совсем.

Итак, буквально за один день разработки мне удалось реализовать приложение, которое умеет отображать списки YouTube по регионам (трендовые/популярные), умеет искать видео и воспроизводить видео с разным разрешением. Кроме того, приложение умеет загружать превью и имеет собственный раздел истории. Неплохо для 24 часов для программиста, у которого до этого практически не было опыта работы с платформой UWP/WinRT, не так ли? :)

❯ ВК


Теперь пришло время реализовать клиент ВК! На самом деле, нет ничего сложного в реализации клиента с базовым функционалом — это всё тот ​​же «рот» к данным с сервера, к которому добавляется необходимость получения уведомлений и реализации логики обновления данных.
На этот раз я решил использовать API WP8.1: он гораздо более функционален и ближе к современному UWP, чем Silverlight в WP8. Так уж получилось, что API обычного WP8 ближе к WP7 и совместим с WP8.1 только с помощью специального слоя.

Я не ставил перед собой задачу написать полную замену ныне несуществующему официальному клиенту, но мне хотелось, чтобы мое приложение поддерживало базовый функционал:

  • Мессенджер: Конечно, самое главное в нашем клиенте — это мессенджер.

  • Музыка: Куда же без практичной музыки ВК? Реализация в кастомных клиентах отнюдь не сложная, но немного затруднительная из-за политики ВК в отношении лицензирования аудио. Опять пойдем на хаки, чтобы получить работающее приложение!

  • Новости: Помимо общения и прослушивания музыки, есть необходимость пролистать ленту — чтобы узнать новости или посмотреть свежие мемы.


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

Реализовать менеджер классов для связи с API ВК я решил по тому же принципу, что и для клиента YouTube: у нас на все есть два метода, один сразу десериализует ответ в виде корневого объекта (каждый тип ответа имеет свой свои, все они описаны в Data.Packet.Root):

До async/await я тут тоже не дорос :)
Спустя довольно короткое время я уже был готов загружать диалоги:

Реализация обновления одинакова во всех секциях: есть метод RequestUpdate, который запускает процедуру обновления и получает данные с сервера, затем ставит в очередь задачу на обновление пользовательского интерфейса из основного потока с помощью UpdateUI:

И механизм загрузки/отправки сообщений.
В целом ничего сложного в этом нет, но сейчас самое время разобраться с уведомлениями. Увеличить push мне пока не удалось, вместо них достаточно длинного опроса для уведомлений, пока приложение в фоне, но система со временем "прибивает" неактивные задачи, и создать "бесконечный" не получится фоновая задача как в Андроиде - система очень строгая, касается любой фоновой работы.

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

Реализация фонового прослушивания музыки очень похожа на другие платформы, но в то же время заметно отличается. Само приложение может воспроизводить звуки с помощью MediaElement или BackgroundMediaPlayer, но при свертывании звук будет приостановлен (в отличие от MediaPlayer на Android). Для прослушивания музыки в фоновом режиме Microsoft решила создать отдельный сервис BackgroundMusicPlayer, который запускается при попытке доступа к плееру из программы. Общаться с этим сервисом можно посредством межпроцессных вызовов — RPC и система предоставляет для него API. Вкратце: нам нужно создать фоновую задачу в виде отдельного модуля WinRT, который будет получать RPC-сообщения от приложения Foreground и при необходимости отправлять ответы обратно. Ничего сложного!

Отдельного внимания заслуживает механизм загрузки музыки в библиотеку. В WP программы не могут просто «вторгнуться» в личный кабинет пользователя — им нужны разрешения. Но это нормально, спросить разрешения вообще не проблема. Но настоящая проблема — ПОЛНОСТЬЮ асинхронный API. Захотел найти описание файла в ФС - асинхронно, захотел открыть - опять асинхронно. Так как у меня вся работа по загрузке выполняется в отдельном воркере и взаимоблокировок я не боюсь, пришлось сделать костыли с Task.Wait() :)

А ВК возвращает mp3 без ID3-тегов, поэтому пришлось добавлять их вручную, чтобы музыку в плеере можно было легко сортировать:

Кроме того, для возможности управления музыкой из других приложений и экрана блокировки Microsoft предоставляет так называемый интерфейс SMTC — общее наложение окна регулировки громкости, позволяющее управлять воспроизведением музыки. Реализация безумно проста — просто включите нужные кнопки (IsPlayEnabled, IsPauseEnabled и т д.), добавьте обработчик событий нажатия кнопки и обновите информацию и обложку с помощью DisplayUpdater.


❯ Заключение


Таким образом, всего за несколько дней мы реализовали клиенты для нужных нам приложений с базовым функционалом. Разработка клиента YT заняла ровно один день, разработка клиента ВК - два дня. Но можно ли реально использовать все это добро и как оно работает на реальном устройстве? См ниже:

Довольно прилично, правда? Еще до публикации статьи я разместил YT-клиент на 4PDA и в профиле чата Telegram - люди благодарны и очень довольны. Только в англоязычном чате про WP8.1 (не считая WM10 и WP7/WP8) более 2 тысяч человек! Так что да, устройства последних нескольких лет действительно нужны довольно большому количеству пользователей.


Ну а разработка клиентов была для меня своего рода вызовом — нарезать что-то полезное под новый API всегда интересно, да и сами устройства очень классные с точки зрения UX и скорости. Что вы думаете? Жду вашего мнения в комментариях!

Статья подготовлена ​​при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи каждую неделю!

[моё]ГаджетыСмартфонМобильные телефоныWindowsWindows PhoneNokia LumiaNokiaРетроУстройствоВкусностиWindows 10РукаПрограммированиеВКонтактеYouTubeВидеоLongpost 129 Пожертвовать чувства

Больше интересных статей здесь: Гаджеты.

Источник статьи: Не дадим Windows Phone умереть! Как я написал свои клиенты VK, YouTube для Nokia Lumia? Сам себе экосистема ч.2.