This media is not supported in your browser
VIEW IN TELEGRAM
Сколько стоит дизайн мобильного приложения?
Белорусская компания провела неофициальное исследование по местному IT-рынку. Задача была получить цену за полный цикл разработки: от веб-дизайна и макетов до приложений на iOS и Android.
Полученные офферы раздели на 3 категории и указали среднюю стоимость проекта:
https://tprg.ru/Hc3K
Если вам интересно узнать о данных в других регионах (Австралия, США, Великобритания и т.д.), то подробнее — в статье: https://tprg.ru/ZERv
#ios #android
Белорусская компания провела неофициальное исследование по местному IT-рынку. Задача была получить цену за полный цикл разработки: от веб-дизайна и макетов до приложений на iOS и Android.
Полученные офферы раздели на 3 категории и указали среднюю стоимость проекта:
https://tprg.ru/Hc3K
Если вам интересно узнать о данных в других регионах (Австралия, США, Великобритания и т.д.), то подробнее — в статье: https://tprg.ru/ZERv
#ios #android
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Работа со списками во Flutter-приложениях
Создать простой статический список в приложение несложно, но задача усложняется, если нужно реализовать список из самостоятельно обновляемых записей или с ссылками на другие записи.
В этой статье рассматривается, как осуществлять в списках функции асинхронной загрузки, фильтрации и актуализации данных. Также автор показывает на примере собственной библиотеки, как можно упростить создание контроллеров для управления списками:
Часть 1: https://habr.com/ru/post/656297/
Часть 2: https://habr.com/ru/post/688864/
#flutter
Создать простой статический список в приложение несложно, но задача усложняется, если нужно реализовать список из самостоятельно обновляемых записей или с ссылками на другие записи.
В этой статье рассматривается, как осуществлять в списках функции асинхронной загрузки, фильтрации и актуализации данных. Также автор показывает на примере собственной библиотеки, как можно упростить создание контроллеров для управления списками:
Часть 1: https://habr.com/ru/post/656297/
Часть 2: https://habr.com/ru/post/688864/
#flutter
💩7👍5🤔1
Пример реализации Dynamic Island и ActivityKit
Dynamic Island используется для отображения обновлений в текущей задаче. Некоторым крупным компаниям Apple предоставила инструменты для реализации динамического острова до выпуска официальных API: WhatsApp, Pandora, Amazon Music и другим.
Например, в Spotify с помощью Dynamic Island отображаются элементы управления музыкой, Uber отображает профиль водителя и время прибытия.
Если вам интересно, как реализовать Dynamic Island, то в этом руководстве подробно разбираются ActivityAttributes, Live Activity и сам виджет:
https://tprg.ru/JxwG
Спойлер: Dynamic Island несложно настроить т.к. большую часть работы за нас делает iOS.
#ios
Dynamic Island используется для отображения обновлений в текущей задаче. Некоторым крупным компаниям Apple предоставила инструменты для реализации динамического острова до выпуска официальных API: WhatsApp, Pandora, Amazon Music и другим.
Например, в Spotify с помощью Dynamic Island отображаются элементы управления музыкой, Uber отображает профиль водителя и время прибытия.
Если вам интересно, как реализовать Dynamic Island, то в этом руководстве подробно разбираются ActivityAttributes, Live Activity и сам виджет:
https://tprg.ru/JxwG
Спойлер: Dynamic Island несложно настроить т.к. большую часть работы за нас делает iOS.
#ios
👍3
ExKeyMo — кастомизируем раскладку внешней клавиатуры на Android без root
Существует несколько способов настройки внешней клавиатуры на Android:
— установка сторонней клавиатуры, например, External Keyboard Helper Pro,
— добавление kl или kcm файлов,
— установка приложения, которое позволяет добавить дополнительные клавиатурные раскладки.
Если вы выбрали третий вариант, но нет желания заморачиваться со сборкой, то ExKeyMo может значительно упростить задачу. Это веб-сервис, с помощью которого можно получить готовое Android-приложение со встроенными раскладками. Подробнее об ExKeyM и его реализации — в статье:
https://habr.com/ru/post/689370/
#android
Существует несколько способов настройки внешней клавиатуры на Android:
— установка сторонней клавиатуры, например, External Keyboard Helper Pro,
— добавление kl или kcm файлов,
— установка приложения, которое позволяет добавить дополнительные клавиатурные раскладки.
Если вы выбрали третий вариант, но нет желания заморачиваться со сборкой, то ExKeyMo может значительно упростить задачу. Это веб-сервис, с помощью которого можно получить готовое Android-приложение со встроенными раскладками. Подробнее об ExKeyM и его реализации — в статье:
https://habr.com/ru/post/689370/
#android
👍3
Сборка на последней версии iOS без обновлений в Xcode
Нет желания обновлять Xcode до последней версии? Автор статьи рассказал о простом способе, как собрать приложение на устройстве, которое работает на последней версии iOS, не обновляя Xcode:
https://tprg.ru/KsOC
Спойлер: решение в два действия
#ios
Нет желания обновлять Xcode до последней версии? Автор статьи рассказал о простом способе, как собрать приложение на устройстве, которое работает на последней версии iOS, не обновляя Xcode:
https://tprg.ru/KsOC
Спойлер: решение в два действия
#ios
👍14
Корутины изнутри: как выглядит процесс создания корутин?
Наверняка вы уже знаете, что такое корутины и используется их в проекте, но как они создаются?
В этой статье подробно разбирается процесс создания корутин от launch() до invokeSuspend(), а также анализ байт-кода на указанных примерах:
https://tprg.ru/xUmA
#android #kotlin
Наверняка вы уже знаете, что такое корутины и используется их в проекте, но как они создаются?
В этой статье подробно разбирается процесс создания корутин от launch() до invokeSuspend(), а также анализ байт-кода на указанных примерах:
https://tprg.ru/xUmA
#android #kotlin
👍8
Как загрузить и кэшировать изображение без использования библиотек?
Именно такая задача была задана автору статьи в качестве теста при приёме на работу. Пример решения:
— добавить android.permission.INTERNET в manifest файл и зависимости корутин в проект,
— создать CachingUtil с функциями:
1. getBitmapFromURL, которая загружает изображение с URL-адреса.
2. storeBitmap — эта функция будет кэшировать изображение в виде файла и сохранять его во внутреннем хранилище.
3. loadBitmap — для получения изображения из хранилища.
— реализовать Main Activity, в котором проверяется, существует или нет кэшированное изображение для отображения.
Источник: https://tprg.ru/WsTi
Репозиторий: https://github.com/osamaalek/load-and-caching-image
Как бы вы решили эту задачу?
#android
Именно такая задача была задана автору статьи в качестве теста при приёме на работу. Пример решения:
— добавить android.permission.INTERNET в manifest файл и зависимости корутин в проект,
— создать CachingUtil с функциями:
1. getBitmapFromURL, которая загружает изображение с URL-адреса.
2. storeBitmap — эта функция будет кэшировать изображение в виде файла и сохранять его во внутреннем хранилище.
3. loadBitmap — для получения изображения из хранилища.
— реализовать Main Activity, в котором проверяется, существует или нет кэшированное изображение для отображения.
Источник: https://tprg.ru/WsTi
Репозиторий: https://github.com/osamaalek/load-and-caching-image
Как бы вы решили эту задачу?
#android
👍14💩4🤔2
This media is not supported in your browser
VIEW IN TELEGRAM
SwiftUI Spring — примеры анимаций в SwiftUI
В этом репозитории собраны интересные варианты анимаций Spring, а также примеры их реализации:
https://github.com/GetStream/swiftui-spring-animations
#ios #swiftui
В этом репозитории собраны интересные варианты анимаций Spring, а также примеры их реализации:
https://github.com/GetStream/swiftui-spring-animations
#ios #swiftui
👍7🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Как реализовать всплывающие окна на Flutter карте
Во Flutter есть плагин flutter_map_marker_popup, который позволяет добавлять всплывающие окна на маркеры положения на карте. Также в плагине есть методы для отображения/скрытия всплывающих окон. Marker_popup работает с Flutter_map, поэтому для работы с Яндекс.Карты или Google Maps он не подойдет.
В этой статье рассматривается, как добавить Flutter_map в проект, настроить маркеры и отслеживать нажатие по ним:
https://habr.com/ru/post/689578/
#flutter
Во Flutter есть плагин flutter_map_marker_popup, который позволяет добавлять всплывающие окна на маркеры положения на карте. Также в плагине есть методы для отображения/скрытия всплывающих окон. Marker_popup работает с Flutter_map, поэтому для работы с Яндекс.Карты или Google Maps он не подойдет.
В этой статье рассматривается, как добавить Flutter_map в проект, настроить маркеры и отслеживать нажатие по ним:
https://habr.com/ru/post/689578/
#flutter
👍6❤🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Какие изменения коснулись системного Back в Android 13?
Начиная с Android 13, метод onBackPressed() считается устаревшим. Одной из главных причин таких изменений стал новый подход «predictive back gesture».
По сути, это жест назад, который показывает превью — куда переходит пользователь перед самим переходом обратно. С учётом нововведений в OnBackPressedDispatcher появился вызов OnBackInvokedCallback.
В этой статье рассматривается, как заменить устаревшую функцию onBackPressed() на OnBackPressedCallback:
https://tprg.ru/4A8N
#android
Начиная с Android 13, метод onBackPressed() считается устаревшим. Одной из главных причин таких изменений стал новый подход «predictive back gesture».
По сути, это жест назад, который показывает превью — куда переходит пользователь перед самим переходом обратно. С учётом нововведений в OnBackPressedDispatcher появился вызов OnBackInvokedCallback.
В этой статье рассматривается, как заменить устаревшую функцию onBackPressed() на OnBackPressedCallback:
https://tprg.ru/4A8N
#android
👍16🤔1💩1
Можно ли автоматизировать процесс обнаружения регрессии размера Android-приложений?
По данным Google, пользователи все ещё избегают загрузки больших приложений, особенно в странах, где действуют тарифы с оплатой за каждый байт. Также компания советует уменьшить размер приложения, если это возможно. Однако как отслеживать процесс оптимизации?
В этой серии статей рассматривается, как проверить регрессию размера приложения на CI в development ветке, в pull request и максимально автоматизировать этот процесс:
Часть 1: https://tprg.ru/B1vh
Часть 2: https://tprg.ru/pSTk
#android
По данным Google, пользователи все ещё избегают загрузки больших приложений, особенно в странах, где действуют тарифы с оплатой за каждый байт. Также компания советует уменьшить размер приложения, если это возможно. Однако как отслеживать процесс оптимизации?
В этой серии статей рассматривается, как проверить регрессию размера приложения на CI в development ветке, в pull request и максимально автоматизировать этот процесс:
Часть 1: https://tprg.ru/B1vh
Часть 2: https://tprg.ru/pSTk
#android
👍5💩1
This media is not supported in your browser
VIEW IN TELEGRAM
Проблемы многопоточности: обнаружение deadlocks
Самый просто пример взаимоблокировки в Swift — вызов метода sync на главном потоке. В таких случаях приложение перестаёт отвечать на запросы и, как может показаться, самым простым решением является перезапуск приложения.
Такие функции, как actors, могут снизить количество дедлоков, но не решают проблему до конца. В этой статье рассматриваются основные причины взаимоблокировок, способы их обнаружения в Xcode, а также методы решения этой проблемы:
https://www.avanderlee.com/swift/deadlocks-detecting-solving/
#ios
Самый просто пример взаимоблокировки в Swift — вызов метода sync на главном потоке. В таких случаях приложение перестаёт отвечать на запросы и, как может показаться, самым простым решением является перезапуск приложения.
Такие функции, как actors, могут снизить количество дедлоков, но не решают проблему до конца. В этой статье рассматриваются основные причины взаимоблокировок, способы их обнаружения в Xcode, а также методы решения этой проблемы:
https://www.avanderlee.com/swift/deadlocks-detecting-solving/
#ios
👍6
Бойлерплейт для построения СI/CD pipeline для Android-приложений
Можно ли как-то автомизировать процессы проверки и доставки приложения в тестовую и производственную среду? Один из вариантов — это использовать бойлер для быстрой настройки CI/CD пайплайна.
Команда разработчиков из Mad Devs рассказала про преимуществах работы бойлера на Fastlane, а также о том, как настроить окружения под него:
https://tproger.ru/articles/bojlerplejt-na-fastlane-dlja-integracii-obnovlenij-ci-cd-android-prilozhenij/
#android
Можно ли как-то автомизировать процессы проверки и доставки приложения в тестовую и производственную среду? Один из вариантов — это использовать бойлер для быстрой настройки CI/CD пайплайна.
Команда разработчиков из Mad Devs рассказала про преимуществах работы бойлера на Fastlane, а также о том, как настроить окружения под него:
https://tproger.ru/articles/bojlerplejt-na-fastlane-dlja-integracii-obnovlenij-ci-cd-android-prilozhenij/
#android
👍4
Подборка актуальных вакансий
— Старший Android-разработчик
Где: Москва
Опыт: от 3 лет
— Senior Android-разработчик
Где: Москва, можно удалённо
Опыт: от 3 лет
— iOS-разработчик
Где: удалённо
Опыт: можно без опыта
— iOS-разработчик
Где: Москва
Опыт: можно без опыта
— iOS-разработчик
Где: Москва, Санкт-Петербург, Казань, Пермь, можно удалённо
Опыт: от 2 лет
— Middle iOS-разработчик
Где: Москва
Опыт: от 3 лет
— Senior iOS-разработчик
Где: Москва
Опыт: от 3 лет
#вакансии #работа
— Старший Android-разработчик
Где: Москва
Опыт: от 3 лет
— Senior Android-разработчик
Где: Москва, можно удалённо
Опыт: от 3 лет
— iOS-разработчик
Где: удалённо
Опыт: можно без опыта
— iOS-разработчик
Где: Москва
Опыт: можно без опыта
— iOS-разработчик
Где: Москва, Санкт-Петербург, Казань, Пермь, можно удалённо
Опыт: от 2 лет
— Middle iOS-разработчик
Где: Москва
Опыт: от 3 лет
— Senior iOS-разработчик
Где: Москва
Опыт: от 3 лет
#вакансии #работа
🤮7
Создаём приложение для брони в кинотеатрах на SwiftUI
В этом видеоуроке рассматривается, как реализовать приложение для iOS на основе дизайна в Figma. В приложение можно выбирать не только фильмы и время сеанса, но и места в кинотеатре. Автор показывает примеры, как создать drag-жест, карточки в стиле Tinder со swipe.
Подробнее: https://youtu.be/EkcKeGQm3_U
#ios
В этом видеоуроке рассматривается, как реализовать приложение для iOS на основе дизайна в Figma. В приложение можно выбирать не только фильмы и время сеанса, но и места в кинотеатре. Автор показывает примеры, как создать drag-жест, карточки в стиле Tinder со swipe.
Подробнее: https://youtu.be/EkcKeGQm3_U
#ios
👍4
История миграции AOSP QuickSearchBox приложения на Kotlin
В общей сложности для рефакторинга приложения из AOSP с Java на Kotlin у стажёра заняло 6 недель. В статье разбираются баги, с которыми пришлось столкнуться при автоматической конвертации.
Также, чтобы проанализировать изменения, разработчики провели несколько контрольных тестов и сравнили показатели производительности, подробнее:
https://tprg.ru/rE1t
#android #kotlin
В общей сложности для рефакторинга приложения из AOSP с Java на Kotlin у стажёра заняло 6 недель. В статье разбираются баги, с которыми пришлось столкнуться при автоматической конвертации.
Также, чтобы проанализировать изменения, разработчики провели несколько контрольных тестов и сравнили показатели производительности, подробнее:
https://tprg.ru/rE1t
#android #kotlin
👍3❤🔥1
Релиз Kotlin 1.7.20: что нового?
— Компилятор Kotlin K2 теперь поддерживает all-open, no-arg, Lombok и несколько других плагинов.
— Новый оператор «..<» для создания открытых диапазонов (open-ended ranges).
— Поддержка Gradle 7.1.
— Модель памяти Kotlin/Native теперь работаeт по умолчанию.
— Новая экспериментальная функция для JVM: Generic Inline Class.
Источник: https://blog.jetbrains.com/kotlin/2022/09/kotlin-1-7-20-released/
Документация: https://kotlinlang.org/docs/whatsnew1720.html
#kotlin
— Компилятор Kotlin K2 теперь поддерживает all-open, no-arg, Lombok и несколько других плагинов.
— Новый оператор «..<» для создания открытых диапазонов (open-ended ranges).
— Поддержка Gradle 7.1.
— Модель памяти Kotlin/Native теперь работаeт по умолчанию.
— Новая экспериментальная функция для JVM: Generic Inline Class.
Источник: https://blog.jetbrains.com/kotlin/2022/09/kotlin-1-7-20-released/
Документация: https://kotlinlang.org/docs/whatsnew1720.html
#kotlin
👍12💩3🤔1
Анти-паттерны: как правильно обрабатывать исключения в Dart
В статье рассмотрены распространенные ошибки, которые можно допустить при обработке исключений, а также способы, как сделать это правильно.
Большинство багов связаны с потерей стека вызовов, из-за чего логи в журналах (например, в Crashlytics или Sentry) практически не дают полезной информации, и проблему отследить ещё сложнее:
https://plugfox.dev/error-handling-and-anti-patterns/
#flutter #dart
В статье рассмотрены распространенные ошибки, которые можно допустить при обработке исключений, а также способы, как сделать это правильно.
Большинство багов связаны с потерей стека вызовов, из-за чего логи в журналах (например, в Crashlytics или Sentry) практически не дают полезной информации, и проблему отследить ещё сложнее:
https://plugfox.dev/error-handling-and-anti-patterns/
#flutter #dart
🔥7
Звёздным разрабам — звёздные продукты
МТС ищет опытных IT-специалистов по самым разным направлениям: от разработки и архитектуры до продуктовой аналитики и тестирования.
Сегодня МТС - это технологичная экосистема, в которой создают и развивают сервисы в финтехе, медиа,
стриминге, облаках, IoT, AI, Big Data и не только.
Узнайте подробнее о вакансиях, приходите возглавить процесс разработки цифровых продуктов и строить новый МТС.
#работа #вакансии
МТС ищет опытных IT-специалистов по самым разным направлениям: от разработки и архитектуры до продуктовой аналитики и тестирования.
Сегодня МТС - это технологичная экосистема, в которой создают и развивают сервисы в финтехе, медиа,
стриминге, облаках, IoT, AI, Big Data и не только.
Узнайте подробнее о вакансиях, приходите возглавить процесс разработки цифровых продуктов и строить новый МТС.
#работа #вакансии
💩18👎2❤🔥1👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Как заменить стандартное окно сбоя своим пользовательским экраном ошибки?
Идея проста: нужно создать Crash Activity и App Class. Crash Activity будет запускаться каждый раз, когда в приложении происходит сбой.
В этой статье рассматривается, как реализовать GlobalExceptionHandler со всеми методами для перехвата исключений и ошибок, Crash Activity, а также шаблон простого дизайна для окна:
https://tprg.ru/012a
#android
Идея проста: нужно создать Crash Activity и App Class. Crash Activity будет запускаться каждый раз, когда в приложении происходит сбой.
В этой статье рассматривается, как реализовать GlobalExceptionHandler со всеми методами для перехвата исключений и ошибок, Crash Activity, а также шаблон простого дизайна для окна:
https://tprg.ru/012a
#android
👍26🤔1
YouTube плеер для Android и Chromecast
Аndroid-youtube-player — это библиотека, которая позволяет легко встроить YouTube плеер в приложение. Библиотека работает под IFrame Player API (официальный API от YouTube).
Таким образом, приложение YouTube не требуется на устройстве пользователя, и нет никаких нарушений со стороны разработчика в Terms of Service.
Репозиторий: https://github.com/PierfrancescoSoffritti/android-youtube-player
(GitHub 2.8 тыс. звёзд)
#android
Аndroid-youtube-player — это библиотека, которая позволяет легко встроить YouTube плеер в приложение. Библиотека работает под IFrame Player API (официальный API от YouTube).
Таким образом, приложение YouTube не требуется на устройстве пользователя, и нет никаких нарушений со стороны разработчика в Terms of Service.
Репозиторий: https://github.com/PierfrancescoSoffritti/android-youtube-player
(GitHub 2.8 тыс. звёзд)
#android
👍20❤1