Обновить

Мобильная разработка

Сначала показывать
Порог рейтинга

Магазину приложений RuStore исполнилось три года. Количество установок этого приложения на устройствах пользователей превысило 100 млн.

25 мая 2022 года VK при поддержке Минцифры запустила открытое бета‑тестирование отечественного магазина мобильных приложений для Android под названием RuStore.

В начале февраля 2023 года RuStore объявил о завершении этапа бета‑тестирования магазина приложений. Также создатели платформы перевели интерфейс консоли разработчика на английский язык для удобства иностранных издателей и партнёров.

В декабре 2024 года месячная аудитория магазина приложений RuStore составила 50 млн пользователей старше 12 лет по всей России, согласно исследованию Mediascope. Аудитория Xiaomi Mi Store составила 19 млн, Samsung Galaxy Store — 14 млн, HUAWEI AppGallery — 10 млн, рассказали Хабру в пресс‑службе RuStore. А в Минцифры заявили, что RuStore от VK обошёл по числу пользователей в России App Store от Apple.

В VK добавили, что в каталоге RuStore уже более 50 тысяч приложений, доступных на ОС Android, Harmony OS и «Аврора», от разработчиков из 40 стран мира. Также вышли версии RuStore для электронных книг и умных телевизоров, для проекторов, Hi‑Fi‑аудиоплееров, игровых консолей, кассовых терминалов, умных часов.

Теги:
Всего голосов 6: ↑2 и ↓40
Комментарии9

Основатель мессенджера Павел Дуров сообщил, что Telegram поднялся на восьмое место в рейтинге самых скачиваемых приложений в первом квартале 2025 года.

Теги:
Всего голосов 1: ↑1 и ↓0+2
Комментарии0

Почему мы разлюбили Isar

Isar — это NoSQL база данных, которую когда-то разработали создатели Hive. Про все плюсы этой БД мы уже писали. Однако однажды нашей Flutter-команде достался проект, который заставил их в корне изменить отношение к Isar и отказаться от этой технологии раз и навсегда.

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

Но специфика приложения накладывала на нас и вполне себе конкретные технические требования: оно должно было бесперебойно работать в офлайне — поля всё-таки бывают далековато от вышек мобильных операторов. Для реализации офлайн-режима как раз и был выбран Isar — это решение казалось удобным.

Как же мы ошибались! Так как у приложения был офлайн-режим, на старте оно загружало большие объемы данных, среди которых, например, было гигантского видео. И это создавало проблемы. В приложении добавлялись новые справочники, но документации на миграцию в Isar не было. К тому же на Android 32-ой архитектуры в базе вылезли баги.

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

Кстати, этот проект в целом оказался судьбоносным для нашей команды Flutter. Какие еще уроки они вынесли после работы над приложением — в отдельной статье.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

$10,1 млрд заработала Apple на комиссиях в App Store с американских разработчиков, говорится в исследовании Appfigures. По оценкам компании, в 2024 году американские разработчики заработали в App Store $33,68 млрд, но после уплаты комиссии Apple их доход сократился до $23,57 млрд.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Google I/O 2025: два вечера главных анонсов вместе с Surf

20 и 21 мая — подключайся к нашим стримам по Google I/O. Будем вместе следить за анонсами новинок, делиться первыми впечатлениями и обсуждать всё самое интересное из мира технологий и разработки в прямом эфире.

Смотрим и комментируем:

  • 20 мая (вторник)
    → 20:00 — Google Keynote: все главные анонсы и будущее технологий от Google.

  • 21 мая (среда)
    → 20:00 — What’s new in Android development tools: новинки для Android-разработчиков.
    → 21:00 — What’s new in Flutter: свежие обновления для Flutter-сообщества.

Время указано по Москве. Позже добавим сюда наших спикеров и персональные ссылки на трансляции.

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

Теги:
Рейтинг0
Комментарии0

Как работать с реактивным кодом в iOS на примере Combine

Пожалуй, каждый iOS-разработчик видел в требованиях вакансий «знание фреймворков RxSwift, RxCocoa». Эти инструменты основаны на концепции реактивного программирования.

Реактивное программирование, как следует из названия, основано на реакции на событие: пользователь взаимодействует с интерфейсом и ждёт реакцию от приложения. Этот подход популярен в фронтенд-разработке, в том числе на iOS.

Мы в Surf долгое время избегали «реактивщины» в приложениях. Во-первых, это лишние зависимости. Во-вторых, подобные библиотеки несут в себе не только преимущества, но и проблемы с дебагом, сложностью поддержки кода и так далее.

Однако с выходом Combine и SwiftUI, мы решили начать внедрять реактивный подход в наши приложения. Благо, теперь не нужны сторонние решения: хватит того, что предоставляет Apple. Давайте посмотрим, как можно работать с реактивным кодом.

Главные элементы Combine, с которыми происходит работа:

1) Publisher — издатель

Протокол, указывающий, что тип может передавать последовательность значений со временем. Publisher предоставляет данные только подписчику (Subscriber) и делает это, когда данные становятся доступны. Без подписки Publisher не активен.

Publisher описывается двумя ассоциированными типами: <Output, Failure>

  • Output — тип выдаваемых значений

  • Failure — тип возможной ошибки. Если ошибок быть не может, используется Never.

2) Subscriber — подписчик

Отвечает за запрос и получение данных от издателя, а также за обработку ошибок.
Имеет типы <Input, Failure>:

  • Input — тип входных данных

  • Failure — тип ошибки

Subscriber сам инициирует запрос и управляет объёмом поступающих данных. Основные способы обработки:

  • sink(receiveCompletion:receiveValue:)Принимает два замыкания: первое вызывается при завершении (успешно или с ошибкой); второе — при получении значений.

  • assign(to:on:)Присваивает полученные значения свойству объекта по keyPath.

3) Operators — операторы

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

4) Subjects — субъекты

Особый вид Publisher. Объекты, реализующие этот протокол, могут отправлять значения подписчикам через метод .send(_).

Subjects полезны для интеграции императивного кода: позволяют вручную вставлять значения в поток.

Управление подпиской

Publisher продолжает отправку до завершения или ошибки. Если подписка больше не нужна, её можно отменить с помощью метода cancel(). Все подписчики реализуют протокол Cancellable.

Пример использования Combine с URLSession

var cancellable = Set<AnyCancellable>()

func sendURLRequest(_ urlRequest: URLRequest) {
	URLSession.shared.dataTaskPublisher(for: urlRequest) // 1
    	.map(\.data) // 2
    	.decode(type: LocationModel.self, decoder: JSONDecoder()) // 3
    	.mapError { $0.toServerError() ?? .unidentifiedError } // 4
    	.receive(on: DispatchQueue.main) // 5
    	.sink { completion in // 6
        	print("finished stream with: \(completion)")
    	} receiveValue: { value in
        	print("receive value: \(value)")
    	}
    	.store(in: &cancellable) // 7
}

Что происходит:

  1. Создание Publisher — оборачивает загрузку данных по URL.

  2. map(.data) — извлекает Data из ответа.

  3. decode — преобразует Data в модель LocationModel.

  4. mapError — конвертирует ошибку в нужный формат.

  5. receive(on:) — переключает поток на нужную очередь.

  6. sink — обрабатывает завершение и полученные данные.

  7. store(in:) — сохраняет подписку, чтобы поток не завершился сразу.

Такой подход делает код более читаемым, управляемым и реактивным.

Больше про iOS-разработку — в нашем Telegram-канале Surf Mobile Team. Кейсы, лучшие практики, новости индустрии, анонсы наших мероприятий и вакансий.

Присоединяйтесь!

Теги:
Рейтинг0
Комментарии1

ОТП Банк – трижды победитель премии по клиентскому опыту CX World Awards 2024/2025

На 10 ежегодной церемонии вручения премии по клиентскому опыту CX WORLD AWARDS ОТП Банк был признан победителем сразу в 3 номинациях:

- Лучший проект изменений, CX Трансформация (CX - Customer Experience)

В рамках данного проекта СХ команда ОТП Банка внедрила единый подход к исследованиям и разработке продуктов «от клиента», а также интегрировала клиентоцентричный подход в работу всего банка. В результате данных преобразований индекс лояльности клиентов (NPS) за год вырос более чем в 1,5 раза.

- Лучшая практика измерения и улучшения клиентского опыта
Эксперты высоко оценили практики ОТП Банка по инновационной системе сбора обратной связи в виде удобных микро-опросов в мобильном приложении банка, которые позволяют получать мгновенный отклик клиента и сразу брать проблему в работу. Микро-опрос предполагает широкий выбор предустановленных вариантов ответов, что сделало возможным минимизировать число открытых вопросов, на которые клиенты, как правило, не хотят тратить время. Благодаря такому подходу отклик на опросы вырос до 20% от всей базы клиентов.

- Лучший опыт сотрудников (Employee Experience - EX)
Культура работы с сотрудником ОТП Банка как с главным клиентом, которая делает его по-настоящему счастливым, вовлеченным, заинтересованным в работе и продуктах банка, была признана жюри одной из лучших. Проект включал в том числе улучшение продуктов и клиентских путей для сотрудников, а также перевод более десятка HR процессов в диджитал. В результате eNPS за год вырос до 40 п.п.

СХ WORLD AWARDS - самая крупная, престижная и признанная всеми участниками рынка профессиональная премия в индустрии клиентского опыта. Ежегодно в премии принимает участие более 350 номинантов и более 500 гостей из индустрии СХ на Торжественной Церемонии становятся свидетелями награждения Лауреатов Премии. Цель Премии – содействовать развитию клиентоцентричной стратегии компаний, выявляя и поддерживая профессионалов и лидеров рынка.

Оценка проектов номинантов проходила в 2 этапа. На 1 этапе все участники подавали письменное эссе с максимально подробным описанием проекта, достижений, стратегии. После оценки экспертного жюри финалисты приглашались на онлайн- защиту, по ее итогам жюри определяет лауреатов и победителей. Все финалисты приглашаются на торжественную церемонию объявления имён Победителей и Лауреатов премии.

Теги:
Рейтинг0
Комментарии2

⚡️Вести с полей - Duit

Новый релиз flutter_duit v3.5.0!

Что внутри:

⚙️ Новые виджеты: AnimatedAlign, AnimatedRotation, AnimatedPadding, AnimatedPositioned, AnimatedScale

⚙️ Фикс работы колбека окончания анимации для implicitly animated widgets

⚙️ Добавлены отсуствующие свойства атрибутов для виджета ElevatedButton

⚙️ Добавлена обработка свойств TextDecoration при парсинге TextStyle

⚙️ Передача свойства body для виджета Scaffold теперь осуществляется через свойство child json-схемы, а не через атрибуты виджета

⚙️ Исправление ряда багов в DSL-пакетах

Подробности о самом интересном:

🔧 В рамках релиза удалось исправить ряд проблем с DSL, где отсутствовали реализации некоторых виджетов (например AnimatedSize в duit_go)

🛠 Улучшена стабильность фреймворка, увеличено покрытие важных участков кода тестами

Поддержать проект:
- Кодом
- Денежкой
- TG канал DUIT

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Небольшая заметка, по всем этим вашим tiktokam..

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

Былобы круто на мой взгляд.. не?..

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

Спасибо)

Теги:
Рейтинг0
Комментарии1

Android-приложение «Контакты»: работает — не трогай

У многих полей контакта есть типы. Например, у номеров телефонов или адресов электронной почты по умолчанию есть типы «рабочий» и «домашний». Аналитики сказали, что нужно реализовать дополнительные типы и дать пользователю возможность создавать свои. Звучит легко, но на деле оказалось совсем непросто.

Чтобы заменить стандартные типы полей, нужно добавить новую базу данных с доступными типами полей, а также реализовать отображение и возможность выбора поля. Для этого пришлось во многом переписать код редактирования полей контакта, где и без этого логика была непростой. Теперь стало совсем сложно: при добавлении или обновлении поля в contentProvider нужно указывать тип поля, так что мы начали указывать «custom».

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

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

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

Пришлось опять добавлять костыль: в отдельной корутине ожидать инициализации БД и только потом начинать рисовать экран...

Дмитрий Бражник, старший инженер-программист в департаменте разработки мобильных приложений YADRO, рассказал в статье, как его команда пыталась допилить стандартное AOSP-приложение «Контакты» и к чему они в итоге пришли.

Теги:
Всего голосов 3: ↑2 и ↓1+2
Комментарии0

Решаю строительные задачи с помощью питона на телефоне

Привет хабр!
Я учусь в строительном сфере Проектировщиком здании.
Во время уроков я пользуюсь pydroid3 и задачи похожую на математику решаю питоном.
Из библиотек я пользуюсь основном Jupyter notebook и sympy::{solve,simplify} и math::{degrees,radians,sin,cos,hypos}. А pandas, mathplot, ipycanvas для красивого оформления.
На моём телефоне собралось много решённых и не решённых задач и я решил попробовать публиковать на гидхаб.
Хочу представить вам мою публикацию гидхаб Kurut‑eater/TaskWithHelpPL
Каталог «Osnovy_i_fundamenty» является моей первой публикацией
На данный момент я сделал задачу «Выбор оборудования для погружения несущих элементов». Дальнейшая будущие идей будут зависеть от общества.

Теги:
Всего голосов 4: ↑2 и ↓20
Комментарии7

Зачем разработчику учиться работать с неопределенностью, развивать мультиперспективность и прокачивать социальную стелс-механику?
Об этом (и о том, что вообще эти слова значат) рассказал наш Senior Software Developer Леша Приньков, который параллельно ведёт академическую карьеру в математике. В общем, с абстракциями, сложными системами и парадоксами неопределённости он на «ты». Бери на заметку неклишированные и реально актуальные софт-скилы 2025 года. 

Скил №1: Эмоциональный интеллект 
в виртуальной реальности
Включает в себя:
1. Умение считывать невербальные сигналы — тон, мимику, паузы (даже
в Zoom). Так ты лучше поймешь эмоциональное состояние собеседника.

2. Способность подстраиваться под эмоциональный контекст. Это делает общение более плавным и понятным.

Скил №2: Этикет
в онлайн-взаимодействии
Включает в себя:
1. Уважение к собеседникам.
Без пассивной агрессии 
и колкостей — просто вежливо и по делу.

2. Ясные и короткие сообщения. Чтобы никто не запутался и всё понял с первого раза.

3. Уважение к чужим границам. Не пересылаешь личную инфу без разрешения и не навязываешься.

Скил №3. Креативное решение задач с помощью нейросетей
Это про умение формулировать запросы к ИИ, чтобы получать крутой результат.
Скил пригодится как для быстрого решения рутинных задач, так и тогда, когда нужно придумать нестандартное решение. В общем, учимся составлять максимально четкие запросы с примерами и деталями.

Скил №4. Работа с неопределенностью и использование вероятностного подхода в принятии решений
Включает в себя:
1. Умение учитывать разные сценарии и просчитывать риски. Так ты принимаешь более взвешенные решения.

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

Скил №5. Адаптивность
и гибкость
Включает в себя:
1. Умение быстро перестраиваться под новые задачи, условия и инструменты.
2. Способность учиться на ходу и не застревать в старых подходах.

А еще этот скил помогает сохранять продуктивность и мотивацию в условиях неопределенности.

Скил №6. Мультиперспективность
Это про умение посмотреть на задачу глазами не только разработчика.
За счет этого скила можно: 
— принимать более эффективные решения, ведь ты видишь больше вариантов решения.
— видеть риски, которые незаметны при узком взгляде, и снижать их.
— генерить нестандартные идеи, комбинируя подходы из разных областей.

Скил №7. Управление уровнем детализации
Это про способность поддерживать нужный уровень абстракции. Где надо — зарываешься в детали, где не надо — держишь фокус на главном.

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

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Ближайшие события

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

Я обожаю фантастику, космос и, конечно же, звёзды. В Сибири можно отъехать от города на десяток километров и увидеть звёзды, огромные и яркие. В этом году я поехала в Таиланд и хотела сравнить видимые звёзды. Но тёмных дорог там просто нет! Сотрудники отеля подсказали площадку. Договорилась с местным водителем прокатиться ближе к вечеру.

Чего я никак не ожидала — что поеду в кузове по размытой бетонке. С правой стороны нависала гора и местами осыпалась на дорогу, слева был обрыв. Было похоже на американские горки, только к сидениям ты совершенно не пристёгнут. Из-за переполняющих меня эмоций стала делать видео, сначала в настроении «если я не вернусь — завещаю…», а потом: «как же страшно и красиво!»

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

А мой телефон сел, и после зарядки застрял на иконке яблока. Оказалось, айфон позволяет занять даже и ту память, которая необходима для старта операционки! А я научилась чинить и это.

Теги:
Всего голосов 3: ↑3 и ↓0+7
Комментарии0