FontBlaster - библиотека для программной загрузки кастомных шрифтов в приложения для iOS, macOS и tvOS. FontBlaster автоматически импортирует и загружает все шрифты из бандла вашего приложения с помощью одной строки кода.
FontBlaster на GitHub: https://github.com/ArtSabintsev/FontBlaster
Платформа: iOS
⭐️: 1.2K
FontBlaster на GitHub: https://github.com/ArtSabintsev/FontBlaster
Платформа: iOS
⭐️: 1.2K
Введение в Trio: часть 3
Trio - это фреймворк Airbnb для экранной архитектуры Jetpack Compose в Android. Он построен на базе Mavericks, библиотеки управления состояниями Jetpack от Airbnb с открытым исходным кодом. В этой серии статей мы разбираем принцип работы Trio, чтобы объяснить наши дизайнерские решения, в надежде, что другие команды смогут воспользоваться аспектами нашего подхода.
Мы рекомендуем начать с первой части, посвященной архитектуре Trio, а затем прочитать вторую, рассказывающую о том, как работает навигация в Trio, прежде чем погружаться в эту статью. В третьей, заключительной части нашей серии мы расскажем о том, как Props в Trio позволяют упростить безопасное для типов взаимодействие между ViewModel. Мы также расскажем о текущем внедрении Trio в Airbnb и о том, что будет дальше.
Часть 1: https://apptractor.ru/info/articles/vvedenie-v-trio.html
Часть 2: https://apptractor.ru/info/articles/vvedenie-v-trio-chast-2.html
Часть 3: https://apptractor.ru/info/articles/vvedenie-v-trio-chast-3.html
Платформа: Android
Trio - это фреймворк Airbnb для экранной архитектуры Jetpack Compose в Android. Он построен на базе Mavericks, библиотеки управления состояниями Jetpack от Airbnb с открытым исходным кодом. В этой серии статей мы разбираем принцип работы Trio, чтобы объяснить наши дизайнерские решения, в надежде, что другие команды смогут воспользоваться аспектами нашего подхода.
Мы рекомендуем начать с первой части, посвященной архитектуре Trio, а затем прочитать вторую, рассказывающую о том, как работает навигация в Trio, прежде чем погружаться в эту статью. В третьей, заключительной части нашей серии мы расскажем о том, как Props в Trio позволяют упростить безопасное для типов взаимодействие между ViewModel. Мы также расскажем о текущем внедрении Trio в Airbnb и о том, что будет дальше.
Часть 1: https://apptractor.ru/info/articles/vvedenie-v-trio.html
Часть 2: https://apptractor.ru/info/articles/vvedenie-v-trio-chast-2.html
Часть 3: https://apptractor.ru/info/articles/vvedenie-v-trio-chast-3.html
Платформа: Android
Kotlin Faker генерирует реалистично выглядящие фейковые данные, такие как имена, адреса, банковские реквизиты, адреса электронной почты и многое другое. Они могут быть использованы для тестирования и анонимизации данных.
Kotlin Faker на GitHub: https://github.com/serpro69/kotlin-faker
Платформа: Android
⭐️: 415
Kotlin Faker на GitHub: https://github.com/serpro69/kotlin-faker
Платформа: Android
⭐️: 415
Как быстро сделать файл PrivacyInfo.xcprivacy для вашего iOS-приложения
В начале 2024 года Apple объявила, что все приложения вскоре должны будут включать файл Privacy Manifest, названный PrivacyInfo.xcprivacy. С 1 апреля 2024 года уже рассылаются предупреждающие письма, а приложения без файла PrivacyInfo.xcprivacy будут отклоняться с 1 мая 2024 года.
Статья: https://apptractor.ru/info/articles/kak-bystro-sdelat-fayl-privacyinfo-xcprivacy-dlya-vashego-ios-prilozheniya.html
Платформа: iOS
В начале 2024 года Apple объявила, что все приложения вскоре должны будут включать файл Privacy Manifest, названный PrivacyInfo.xcprivacy. С 1 апреля 2024 года уже рассылаются предупреждающие письма, а приложения без файла PrivacyInfo.xcprivacy будут отклоняться с 1 мая 2024 года.
Статья: https://apptractor.ru/info/articles/kak-bystro-sdelat-fayl-privacyinfo-xcprivacy-dlya-vashego-ios-prilozheniya.html
Платформа: iOS
❤1
Reflection в iOS: как посмотреть содержимое любой сущности
В Swift, как и во многих других языках программирования, есть возможность получать информацию о структуре объекта в Runtime. Для этого в языке есть специальный механизм — Reflection. С его помощью можно просматривать содержимое любых сущностей, не зная о них абсолютно ничего.
Статья: https://habr.com/ru/companies/tinkoff/articles/808139/
Платформа: iOS
В Swift, как и во многих других языках программирования, есть возможность получать информацию о структуре объекта в Runtime. Для этого в языке есть специальный механизм — Reflection. С его помощью можно просматривать содержимое любых сущностей, не зная о них абсолютно ничего.
Статья: https://habr.com/ru/companies/tinkoff/articles/808139/
Платформа: iOS
RxJava — всё?
RxJava остается эффективным инструментом для решения различных задач при условии, что этот инструмент находится в умелых руках. Несмотря на всенародную любовь к корутинам, RxJava по-прежнему используется на многих крупных проектах, хотя в целом сама библиотека стала менее популярной, чем корутины.
При написании приложения с нуля RxJava выглядит не самым оптимальным решением ввиду официальной политики Google по поддержке корутин и интереса компании к Kotlin Multiplatform. Кроме того, наличие RxJava в стеке проекта может снизить привлекательность вакансии среди кандидатов, часть разработчиков могут принять использование Rx в проекте за легаси.
Для начинающих знание RxJava будет не лишним, поскольку на рынке достаточное количество вакансий на проекты, в которых используется Rx. В то же время, в ряде случаев отсутствие опыта с RxJava можно компенсировать уверенными знаниями Kotlin Flow. И если вы сумели разобраться с Flow, изучение RxJava станет не такой сложной задачей.
Статья: https://habr.com/ru/articles/807925/
Платформа: Android
RxJava остается эффективным инструментом для решения различных задач при условии, что этот инструмент находится в умелых руках. Несмотря на всенародную любовь к корутинам, RxJava по-прежнему используется на многих крупных проектах, хотя в целом сама библиотека стала менее популярной, чем корутины.
При написании приложения с нуля RxJava выглядит не самым оптимальным решением ввиду официальной политики Google по поддержке корутин и интереса компании к Kotlin Multiplatform. Кроме того, наличие RxJava в стеке проекта может снизить привлекательность вакансии среди кандидатов, часть разработчиков могут принять использование Rx в проекте за легаси.
Для начинающих знание RxJava будет не лишним, поскольку на рынке достаточное количество вакансий на проекты, в которых используется Rx. В то же время, в ряде случаев отсутствие опыта с RxJava можно компенсировать уверенными знаниями Kotlin Flow. И если вы сумели разобраться с Flow, изучение RxJava станет не такой сложной задачей.
Статья: https://habr.com/ru/articles/807925/
Платформа: Android
Gradiente - это простая библиотека для iOS, позволяющая накладывать размытый, цветной и яркий фон на ваши представления. Она написана на SwiftUI и легко применима к любому View. Особенности - поддержка цветов и градиентов, может быть применена как модификатор SwiftUI к любому представлению, может быть расположена в верхней или нижней части представления, совместима с iOS 15.
Gradiente на GitHub: https://github.com/letvarhq/Gradiente
Платформа: iOS
⭐️: 11
Gradiente на GitHub: https://github.com/letvarhq/Gradiente
Платформа: iOS
⭐️: 11
Kodein DI для Android. Целостность графа и тесты на DI
DI фреймворки бывают двух видов: те, что строят свой граф зависимостей во время компиляции (compile time фреймворки), и те, которые делают это уже при выполнении кода (runtime фреймворки).
Kodein — типичный представитель runtime фреймворков. Это значит, что о пропущенной зависимости вы узнаете непосредственно в процессе работы приложения, что может стать неприятным сюрпризом. Только представьте себе: вы пропустили на регрессе какой-то кейс, и у вас краш в продакшене из-за DI! Это же настоящий кошмар!
Но неужели нам придётся отказываться от Kodein или других runtime фреймворков? Что можно сделать, чтобы сделать их более надёжными? Есть ответ! Мы переведём наш DI из разряда runtime проверок в разряд deploy time проверок.
Статья: https://habr.com/ru/companies/dododev/articles/807969/
Платформа: Android
DI фреймворки бывают двух видов: те, что строят свой граф зависимостей во время компиляции (compile time фреймворки), и те, которые делают это уже при выполнении кода (runtime фреймворки).
Kodein — типичный представитель runtime фреймворков. Это значит, что о пропущенной зависимости вы узнаете непосредственно в процессе работы приложения, что может стать неприятным сюрпризом. Только представьте себе: вы пропустили на регрессе какой-то кейс, и у вас краш в продакшене из-за DI! Это же настоящий кошмар!
Но неужели нам придётся отказываться от Kodein или других runtime фреймворков? Что можно сделать, чтобы сделать их более надёжными? Есть ответ! Мы переведём наш DI из разряда runtime проверок в разряд deploy time проверок.
Статья: https://habr.com/ru/companies/dododev/articles/807969/
Платформа: Android
Хабр
Kodein DI для Android. Целостность графа и тесты на DI
DI фреймворки бывают двух видов: те, что строят свой граф зависимостей во время компиляции (compile time фреймворки), и те, которые делают это уже при выполнении кода (runtime фреймворки). Kodein —...
Droid-ify - неофициальный клиент магазина F-Droid с чистым материальным дизайном, “гладким” пользовательским опытом. В нем нет неподходящей анимации, есть быстрая синхронизация репозитория, стандартные компоненты Android и минимальные зависимости.
Droid-ify на GitHub: https://github.com/Droid-ify/client
Платформа: Android
⭐️: 2.8K
Droid-ify на GitHub: https://github.com/Droid-ify/client
Платформа: Android
⭐️: 2.8K
О, вы из Англии? Локализация Ozon Seller на iOS
Наша команда поставляет фичи, красит кнопки, работает над перформансом и всячески улучшает пользовательский опыт работы продавцов на Ozon.
Нашим приложением активно пользуются юзеры из разных стран, и поэтому день Х, когда мы решим добавить поддержку разных языков, был неизбежен. В этой статье я расскажу про стандартный процесс локализации iOS-приложения, про то, с какими трудностями мы столкнулись и как их решили. Разберём системный алгоритм определения языка и объясню, почему он нам не подошёл. Сделаем перевод приложения «на лету», а также посмотрим, как изменился наш флоу работы со строками.
Статья: https://habr.com/ru/companies/ozontech/articles/807775/
Платформа: iOS
Наша команда поставляет фичи, красит кнопки, работает над перформансом и всячески улучшает пользовательский опыт работы продавцов на Ozon.
Нашим приложением активно пользуются юзеры из разных стран, и поэтому день Х, когда мы решим добавить поддержку разных языков, был неизбежен. В этой статье я расскажу про стандартный процесс локализации iOS-приложения, про то, с какими трудностями мы столкнулись и как их решили. Разберём системный алгоритм определения языка и объясню, почему он нам не подошёл. Сделаем перевод приложения «на лету», а также посмотрим, как изменился наш флоу работы со строками.
Статья: https://habr.com/ru/companies/ozontech/articles/807775/
Платформа: iOS
Видео и подкасты за неделю:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Посоветуйте в комментариях интересные каналы по мобильной разработке? 🌐 @AppFiles
•
(iOS Ru) А так ли нужна Swift Modern Concurrency?•
(iOS Ru) Мгновенный фидбэк: как оперативно получать отзывы о приложении в App Store•
(iOS En) Your guide to Metal ray tracing•
(iOS En) Integrate Screen-Sharing Into a SwiftUI App•
(iOS En) SwiftUI Custom Transitions•
(iOS En) Building Netflix UI Animations•
(And Ru) Устройство Android Music SDK или как мы встроили музыку в суперапп-приложение•
(And Ru) Интеграция MediaPipe в Android-приложение видеоконференцсвязи•
(And En) Now in Android: 103 - Android 15 Beta, Gemini in Android Studio, Google Drive improvements, & more•
(And En) MVVM vs. MVI - Understand the Difference Once and for All•
(And En) The ONLY Thing to MASTER as an Android Developer (And Why 99% FAIL!)•
(And En) Boosting Bazel adoption on Android with automation•
(And En) Inline Functions: inline, crossinline, and noinline•
(Dev Ru) Инженерная культура BigTech: работа мечты или испытание на прочность?•
(Dev Ru) Как устроена мобильная разработка в Кинопоиске•
(Dev Ru) Пробить стеклянный потолок и стать сеньоромПосоветуйте в комментариях интересные каналы по мобильной разработке? 🌐 @AppFiles
AppTractor
А так ли нужна Swift Modern Concurrency?
Но новая модель конкурентности – это не просто синтаксис, а совершенно новая для Swift концепция, которая лежит глубоко под фасадом async/await.
Zephyr синхронизирует определенные ключи и/или все ваши UserDefaults через iCloud с помощью NSUbiquitousKeyValueStore. В библиотеку встроен мониторинг, позволяющий синхронизировать определенные ключи в фоновом режиме по мере их изменения.
Zephyr на GitHub: https://github.com/ArtSabintsev/Zephyr
Платформа: iOS
⭐️: 913
Zephyr на GitHub: https://github.com/ArtSabintsev/Zephyr
Платформа: iOS
⭐️: 913
Clean architecture и MVVM в iOS разработке
При разработке ПО важно использовать не только дизайн-, но и архитектурные паттерны. Их существует довольно много. В мобильной разработке самые распространенные - MVVM, Clean Architecture и Redux.
В этой статье мы покажем на примерах проектов как паттерны MVVM и Clean Architecture могут быть применены в iOS приложении.
Статья: https://habr.com/ru/articles/808923/
Платформа: iOS
При разработке ПО важно использовать не только дизайн-, но и архитектурные паттерны. Их существует довольно много. В мобильной разработке самые распространенные - MVVM, Clean Architecture и Redux.
В этой статье мы покажем на примерах проектов как паттерны MVVM и Clean Architecture могут быть применены в iOS приложении.
Статья: https://habr.com/ru/articles/808923/
Платформа: iOS
Генерируем отчеты PDF на Android с использованием HTML и WebView в фоне
Сервис, прежде всего, должен решать задачу пользователя. Часто приложения должны делать то, что, казалось бы, должно ложиться на плечи сервера и других публичных API. Так, например, произошло в нашем проекте. Сервис помогает составлять отчеты, удобно их менеджерить, автоматизирует задачи генерации и отправки клиентам. В рамках этой статьи хочу рассказать про наш опыт переноса функционала генерации PDF-отчетов на Android-устройство.
Статья: https://habr.com/ru/articles/809141/
Платформа: Android
Сервис, прежде всего, должен решать задачу пользователя. Часто приложения должны делать то, что, казалось бы, должно ложиться на плечи сервера и других публичных API. Так, например, произошло в нашем проекте. Сервис помогает составлять отчеты, удобно их менеджерить, автоматизирует задачи генерации и отправки клиентам. В рамках этой статьи хочу рассказать про наш опыт переноса функционала генерации PDF-отчетов на Android-устройство.
Статья: https://habr.com/ru/articles/809141/
Платформа: Android
Создаем гистограмму с помощью Swift Charts
Гистограмма — это всего лишь один из доступных вариантов визуализации данных. В целом, многие из методов, о которых вы сегодня узнаете, применимы и к другим графикам. Фактически, вы можете заменить всего один элемент, чтобы перейти от гистограммы к линейной диаграмме. Давайте погрузимся в работу!
Статья: https://apptractor.ru/info/articles/sozdaem-gistogrammu-s-pomoschyu-swift-charts.html
Платформа: iOS
Гистограмма — это всего лишь один из доступных вариантов визуализации данных. В целом, многие из методов, о которых вы сегодня узнаете, применимы и к другим графикам. Фактически, вы можете заменить всего один элемент, чтобы перейти от гистограммы к линейной диаграмме. Давайте погрузимся в работу!
Статья: https://apptractor.ru/info/articles/sozdaem-gistogrammu-s-pomoschyu-swift-charts.html
Платформа: iOS
Firebase Kotlin SDK - это Kotlin-first SDK для Firebase. API аналогичен Kotlin-расширениям Firebase Android SDK, но также поддерживает мультиплатформенные проекты, позволяя использовать Firebase непосредственно из единого источника, ориентированного на iOS, Android, Desktop или Web, что дает возможность использовать Firebase в качестве бэкенда, например, для Compose Multiplatform.
Firebase Kotlin SDK на GitHub: https://github.com/GitLiveApp/firebase-kotlin-sdk
Платформа: Android
⭐️: 882
Firebase Kotlin SDK на GitHub: https://github.com/GitLiveApp/firebase-kotlin-sdk
Платформа: Android
⭐️: 882
👍3
EeveeSpotify - это твик для Spotify, который дает некоторые функции премиум-подписки.
Как это работает
При входе в систему Spotify получает данные пользователя, включая активную подписку, и кэширует их в файле offline.bnk в каталоге /Library/Application Support/PersistentCache. Для хранения данных используется собственный двоичный формат, включающий, помимо прочих условностей, байт длины перед каждым значением. Некоторые ключи, такие как player-license, financial-product и type, определяют возможности пользователя.
Твик исправляет этот файл при инициализации. Spotify загружает его и предполагает, что у вас есть Premium. Честно говоря, это не совсем патч, а именно обходной твик, из-за проблем с динамической длиной и разными байтами. В идеале должен быть парсер, способный десериализовать и сериализовать такой формат. Однако пока твик просто извлекает имя пользователя из текущего файла offline.bnk и вставляет его в premiumblank.bnk (файл, содержащий все предустановленные значения Premium), заменяя им offline.bnk.
EeveeSpotify на GitHub: https://github.com/whoeevee/EeveeSpotify
Платформа: разработка/Swift
⭐️: 102
Как это работает
При входе в систему Spotify получает данные пользователя, включая активную подписку, и кэширует их в файле offline.bnk в каталоге /Library/Application Support/PersistentCache. Для хранения данных используется собственный двоичный формат, включающий, помимо прочих условностей, байт длины перед каждым значением. Некоторые ключи, такие как player-license, financial-product и type, определяют возможности пользователя.
Твик исправляет этот файл при инициализации. Spotify загружает его и предполагает, что у вас есть Premium. Честно говоря, это не совсем патч, а именно обходной твик, из-за проблем с динамической длиной и разными байтами. В идеале должен быть парсер, способный десериализовать и сериализовать такой формат. Однако пока твик просто извлекает имя пользователя из текущего файла offline.bnk и вставляет его в premiumblank.bnk (файл, содержащий все предустановленные значения Premium), заменяя им offline.bnk.
EeveeSpotify на GitHub: https://github.com/whoeevee/EeveeSpotify
Платформа: разработка/Swift
⭐️: 102
🤔1
Осваиваем ViewModel в Android: «можно» и «нельзя» — Часть 3
В предыдущих частях мы обсудили:
1. Избегайте инициализации состояния в блоке init{}.
2. Избегайте раскрытия мутабельных состояний.
3. Используйте update{} при использовании MutableStateFlows.
В этой части мы обсудим 4 и 5 пункты из списка:
4. Старайтесь не импортировать зависимости Android в ViewModel.
5. Лениво внедряйте зависимости в конструктор.
Статья: https://apptractor.ru/info/articles/osvaivaem-viewmodel-v-android-mozhno-i-nelzya-chast-3.html
Платформа: Android
В предыдущих частях мы обсудили:
1. Избегайте инициализации состояния в блоке init{}.
2. Избегайте раскрытия мутабельных состояний.
3. Используйте update{} при использовании MutableStateFlows.
В этой части мы обсудим 4 и 5 пункты из списка:
4. Старайтесь не импортировать зависимости Android в ViewModel.
5. Лениво внедряйте зависимости в конструктор.
Статья: https://apptractor.ru/info/articles/osvaivaem-viewmodel-v-android-mozhno-i-nelzya-chast-3.html
Платформа: Android
Оптимизируем обновление местоположения с помощью CLLocationUpdate в Swift
На WWDC 23 Apple значительно улучшила процесс обновления местоположения, представив класс CLLocationUpdate. Этот новый класс использует возможности современного Swift Concurrency, упрощая получение и управление данными о местоположении в ваших приложениях.
Статья: https://apptractor.ru/info/articles/optimiziruem-obnovlenie-mestopolozheniya-s-pomoschyu-cllocationupdate-v-swift.html
Платформа: iOS
На WWDC 23 Apple значительно улучшила процесс обновления местоположения, представив класс CLLocationUpdate. Этот новый класс использует возможности современного Swift Concurrency, упрощая получение и управление данными о местоположении в ваших приложениях.
Статья: https://apptractor.ru/info/articles/optimiziruem-obnovlenie-mestopolozheniya-s-pomoschyu-cllocationupdate-v-swift.html
Платформа: iOS
Jetpack Compose для ленивых
Если вы еще не используете Compose в своих проектах, то определенно стоит подумать о том, что бы начать, поскольку он позволяет делать сложные вещи простыми и, что самое главное, экономит время (и нервы).
Хочу надеяться, что мой опыт окажется полезным и поможет другим разработчикам в создании нестандартных экранов. И не бойтесь изучать что-то новое. Возможно когда-нибудь это новое сделает вашу жизнь чуточку легче.
Статья: https://habr.com/ru/articles/810123/
Платформа: Android
Если вы еще не используете Compose в своих проектах, то определенно стоит подумать о том, что бы начать, поскольку он позволяет делать сложные вещи простыми и, что самое главное, экономит время (и нервы).
Хочу надеяться, что мой опыт окажется полезным и поможет другим разработчикам в создании нестандартных экранов. И не бойтесь изучать что-то новое. Возможно когда-нибудь это новое сделает вашу жизнь чуточку легче.
Статья: https://habr.com/ru/articles/810123/
Платформа: Android