Воскрешение Windows Phone: Как я создал свои клиенты VK и YouTube для Nokia Lumia


Услышав название Windows Phone, многие с теплотой вспоминают своих необычных мобильных спутников, будто с момента перехода на iPhone или Android прошло всего несколько месяцев. Однако с фактического ухода этой платформы с рынка прошло уже почти десять лет! Хотя время не повернуть вспять и мобильное подразделение Nokia не спасти, у энтузиастов с навыками разработки есть шанс вдохнуть новую жизнь в старые устройства. Недавно мне удалось оживить свою старую Lumia, написав с нуля клиенты для ключевых сервисов — VK и YouTube. В этой статье я поделюсь своим опытом, расскажу о мотивации, трудностях и уникальных технических преимуществах Windows Phone, которые делают его уход одной из самых больших потерь для мобильного рынка.

❯ Предыстория и эволюция платформы


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


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


Windows Mobile уверенно занимала свою нишу, но появление первого iPhone перевернуло индустрию. Пользователи оценили управление пальцами по анимированному интерфейсу. Microsoft осознала, что важнее плавность, стабильность и простота, чем абсолютная свобода настройки.


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


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

❯ Технологическое превосходство и причины провала


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


К сожалению, обновления с WP7 до WP8 не произошло, что многие пользователи сочли обманом. Частично это было связано с аппаратными ограничениями: даже флагманы на WP7 имели лишь 512 МБ ОЗУ, чего было недостаточно для WP8. Возможно, Microsoft просто не хотела портить имидж плавных смартфонов возможными тормозами после обновления.


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


Технические преимущества на этом не заканчивались. Фреймворк для построения интерфейса (WPF/Silverlight) работал очень быстро "из коробки", отлично масштабировался и предлагал мощные возможности для анимации. Сам SDK навязывал правильную архитектуру, заставляя распределять задачи по потокам, что улучшало отзывчивость интерфейса.


Ещё одной крутой, но забытой возможностью была поддержка DirectX 11. WP7 уже имел XNA (на ней, например, была написана Terraria), но WP8 предоставил полноценный DirectX 11 с поддержкой инстансинга, пакетной настройки состояний и эффективным управлением шейдерными ресурсами. Теоретически это позволяло портировать игры с ПК/Xbox, хотя на практике этим мало кто воспользовался.


Важным преимуществом была обратная совместимость: на WP8 отлично работали игры с WP7 (NFS Undercover, Mirror's Edge), а на Windows 10 Mobile запускалось почти любое приложение для WP8.


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

Без Windows Phone на рынке утвердилась дуополия: Android продолжает быть ресурсоёмким и медленно развивающимся, а iPhone, оставаясь плавным, явно не чувствует былой конкуренции, что приводит к стагнации в дизайне и интерфейсе.

❯ Мотивация и начало проекта


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


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


Lumia 1320 и Lumia 640XL — отличные устройства для чтения!
Почему бы не использовать весь этот потенциал, учитывая доступность смартфонов? Решено: скачать SDK и написать свои клиенты для ВК и YouTube — тот минимум, который мне необходим!

❯ Подготовка устройства


Для отладки и установки сторонних приложений на Windows Phone их необходимо разблокировать, выполнив процедуру "Developer Unlock". Процесс простой и для большинства Lumia занимает немного времени.

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

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

❯ Разработка клиента YouTube


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


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

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

Я решил придерживаться более знакомой концепции обратных вызовов (callbacks), которая даёт больше контроля над обработкой ошибок. В качестве десериализатора JSON использовал классический Newtonsoft.Json.

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

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

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

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

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

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

Таким образом, за один день разработки я реализовал приложение, которое умеет показывать трендовые и популярные видео, искать контент, воспроизводить видео в разных разрешениях, загружать превью и вести историю просмотров. Неплохо для 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 не удалось, вместо них используется длинный опрос (long polling), пока приложение в фоне. Однако система со временем "прибивает" неактивные задачи, и создать "вечную" фоновую задачу, как в Android, не получится — Windows Phone очень строг к фоновой работе.

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

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

Отдельного внимания заслуживает загрузка музыки в библиотеку. Приложения не могут просто "вторгнуться" в личное пространство пользователя — нужны разрешения. Но настоящая проблема — полностью асинхронный API. Захотел найти файл — асинхронно, открыть — снова асинхронно. Так как вся загрузка идёт в отдельном воркере, пришлось сделать костыли с Task.Wait().

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

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


❯ Итоги и реальное использование


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

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


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

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

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

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

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