Отлаживаем приложение вместе со SwiftUI Instruments
Apple по доброте душевной поделилась с разработчиками инструментом отладки SwiftUI. Удобный он или не очень — разберёмся вместе с Surf iOS Team.
Статья: https://habr.com/ru/companies/surfstudio/articles/903264/
Платформа: iOS
Apple по доброте душевной поделилась с разработчиками инструментом отладки SwiftUI. Удобный он или не очень — разберёмся вместе с Surf iOS Team.
Статья: https://habr.com/ru/companies/surfstudio/articles/903264/
Платформа: iOS
👍3
Закулисный взгляд на то, как Spotify выпускает приложения
Чтобы проиллюстрировать наш релизный цикл, давайте проследим путь версии 8.9.2 от зарождения до внедрения.
Статья: https://apptractor.ru/info/articles/spotify-release-1.html
Платформа: разработка
Чтобы проиллюстрировать наш релизный цикл, давайте проследим путь версии 8.9.2 от зарождения до внедрения.
Статья: https://apptractor.ru/info/articles/spotify-release-1.html
Платформа: разработка
👍3
AAInfographics - элегантный современный декларативный фреймворк для создания графиков и визуализации данных для iOS, iPadOS и macOS. Чрезвычайно мощный, поддерживает около 20 типов диаграмм, с его помощью можно очень быстро добавлять интерактивные графики в мобильные проекты. Он поддерживает касание для проверки данных, мультитач для масштабирования и улучшенную отзывчивость для ваших приложений.
AAInfographics на GitHub: https://github.com/AAChartModel/AAChartKit-Swift
Платформа: iOS
⭐️: 2.5K
AAInfographics на GitHub: https://github.com/AAChartModel/AAChartKit-Swift
Платформа: iOS
⭐️: 2.5K
👍3
Forwarded from Mobile Development by AppTractor
Транзакционные рассылки без головной боли для разработчиков
Чего обычно ждут от транзакционных рассылок? Они должны быть быстрыми, надёжными и безопасными. И настраиваться за пару кликов.
Если вы не хотите заниматься настройкой почтовой инфраструктуры, попробуйте Yandex Cloud Postbox:
• Быстро: медианное время отправки – меньше 3 секунд
• Надёжно: доставляемость в 99,9%
• Безопасно: отправляет email по TLS 1.2+ и соответствует DMARC, DKIM и SPF
Можно выбрать протокол: SMTP/AWS SES API. Первые 2 000 писем в месяц - бесплатно. Попробовать
Чего обычно ждут от транзакционных рассылок? Они должны быть быстрыми, надёжными и безопасными. И настраиваться за пару кликов.
Если вы не хотите заниматься настройкой почтовой инфраструктуры, попробуйте Yandex Cloud Postbox:
• Быстро: медианное время отправки – меньше 3 секунд
• Надёжно: доставляемость в 99,9%
• Безопасно: отправляет email по TLS 1.2+ и соответствует DMARC, DKIM и SPF
Можно выбрать протокол: SMTP/AWS SES API. Первые 2 000 писем в месяц - бесплатно. Попробовать
CI/CD по кнопке: как мы автоматизировали сборку SampleApp для SDK RuStore
В этой статье расскажу, как мы автоматизировали сборку нашего SampleApp — внутреннего Android‑приложения для тестирования SDK RuStore — и сделали процесс сборки максимально простым, быстрым и доступным для всей команды. Теперь любой участник проекта — даже без навыков Android‑разработки — может собрать актуальный APK с набором поставляемых SDK в пару кликов через CI/CD.
Статья: https://habr.com/ru/companies/vk/articles/903528/
Платформа: Android
В этой статье расскажу, как мы автоматизировали сборку нашего SampleApp — внутреннего Android‑приложения для тестирования SDK RuStore — и сделали процесс сборки максимально простым, быстрым и доступным для всей команды. Теперь любой участник проекта — даже без навыков Android‑разработки — может собрать актуальный APK с набором поставляемых SDK в пару кликов через CI/CD.
Статья: https://habr.com/ru/companies/vk/articles/903528/
Платформа: Android
👍1👎1
Архитектурный линтинг для Swift: часть 3
В этой серии статей мы рассказали о трудностях написания правил архитектурного линтинга в SwiftLint и представили Harmonize, новый архитектурный линтер с открытым исходным кодом для Swift. В предыдущей статье мы рассказали, как Harmonize позволяет разработчикам, используя простой в применении DSL, писать правила для того, чтобы слои приложения сочетались друг с другом.
В этой статье мы поделимся практическими советами, которые мы нашли, используя Harmonize в течение почти года в нашей компании (обратите внимание, что эти правила также применимы и к проектам Konsist для Android).
Статья: https://apptractor.ru/info/articles/arhitekturnyy-linting-dlya-swift-chast-3.html
Платформа: iOS
В этой серии статей мы рассказали о трудностях написания правил архитектурного линтинга в SwiftLint и представили Harmonize, новый архитектурный линтер с открытым исходным кодом для Swift. В предыдущей статье мы рассказали, как Harmonize позволяет разработчикам, используя простой в применении DSL, писать правила для того, чтобы слои приложения сочетались друг с другом.
В этой статье мы поделимся практическими советами, которые мы нашли, используя Harmonize в течение почти года в нашей компании (обратите внимание, что эти правила также применимы и к проектам Konsist для Android).
Статья: https://apptractor.ru/info/articles/arhitekturnyy-linting-dlya-swift-chast-3.html
Платформа: iOS
👍2
Создание типобезопасных высокопроизводительных моделей SwiftData/Core Data
Swift предлагает мощную систему типов, но при использовании Core Data приходится идти на компромиссы. Например, нельзя напрямую использовать
Автор предлагает использовать computed properties и скрытые свойства для создания обёрток, которые обеспечивают типобезопасность и соответствуют требованиям Core Data.
Например:
Это позволяет использовать
Если вы хотите улучшить архитектуру своих моделей данных в Swift и сделать их более надёжными и выразительными, обязательно прочитайте статью.
Статья: https://fatbobman.com/en/posts/building-typesafe-highperformance-swiftdata-core-data-models/
Платформа: iOS
Swift предлагает мощную систему типов, но при использовании Core Data приходится идти на компромиссы. Например, нельзя напрямую использовать
Double? для опциональных чисел — приходится работать с NSNumber?, что снижает типобезопасность и усложняет код.Автор предлагает использовать computed properties и скрытые свойства для создания обёрток, которые обеспечивают типобезопасность и соответствуют требованиям Core Data.
Например:
extension People {
@NSManaged var weightRaw: NSNumber?
var weight: Double? {
get { weightRaw?.doubleValue }
set { weightRaw = newValue as NSNumber? }
}
}Это позволяет использовать
Double? в коде, сохраняя совместимость с Core Data. Для строковых значений можно использовать типы, обеспечивающие дополнительные гарантии. Например, NonEmptyString из библиотеки NonEmpty гарантирует, что строка не пуста. Можно также создать собственные типы, например, ValidatedName, которые инкапсулируют бизнес-правила и обеспечивают их соблюдение на уровне типов. В SwiftData такие обёртки реализуются автоматически, что упрощает работу с типами и повышает безопасность кода.Если вы хотите улучшить архитектуру своих моделей данных в Swift и сделать их более надёжными и выразительными, обязательно прочитайте статью.
Статья: https://fatbobman.com/en/posts/building-typesafe-highperformance-swiftdata-core-data-models/
Платформа: iOS
👍1
Обновляем AOSP-приложение «Контакты», или Чем обернулось «приключение на 20 минут» с legacy-кодом
Лучше было написать приложение с нуля, чем вносить столько изменений в legacy-код. Мы дважды раздумывали отправить «Контакты» в релиз и дважды решали этого не делать. На третий раз решили уже писать новое приложение под новый дизайн, который все равно не ложился на старую кодовую базу. Сейчас пишем «Контакты» на стеке Kotlin + Jetpack Compose с чистой архитектурой и многомодульностью, что точно упрощает и разработку, и дальнейшую поддержку.
Сегодня многие компании начинают свою разработку на базе AOSP. Стоит заранее оценить, насколько ваш новый дизайн отличается от старого, какие требования и фичи предполагается добавлять в приложение и уже затем решать — дорабатывать текущее или создавать новое. У нас, например, в первом нашем случае визуальных отличий было немного, а во втором они были критичные. Что можем сказать точно: использовать два стека в рамках одних классов — плохая идея.
Статья: https://habr.com/ru/companies/yadro/articles/903316/
Платформа: Android
Лучше было написать приложение с нуля, чем вносить столько изменений в legacy-код. Мы дважды раздумывали отправить «Контакты» в релиз и дважды решали этого не делать. На третий раз решили уже писать новое приложение под новый дизайн, который все равно не ложился на старую кодовую базу. Сейчас пишем «Контакты» на стеке Kotlin + Jetpack Compose с чистой архитектурой и многомодульностью, что точно упрощает и разработку, и дальнейшую поддержку.
Сегодня многие компании начинают свою разработку на базе AOSP. Стоит заранее оценить, насколько ваш новый дизайн отличается от старого, какие требования и фичи предполагается добавлять в приложение и уже затем решать — дорабатывать текущее или создавать новое. У нас, например, в первом нашем случае визуальных отличий было немного, а во втором они были критичные. Что можем сказать точно: использовать два стека в рамках одних классов — плохая идея.
Статья: https://habr.com/ru/companies/yadro/articles/903316/
Платформа: Android
👍1
На хребтах безумия с Jetpack Compose
В статье автор делится своим опытом решения неожиданной проблемы при реализации функции pull-to-refresh в Jetpack Compose.
При использовании компонента PullToRefreshBox индикатор обновления застревал на экране и не исчезал, как ожидалось. После отладки выяснилось, что состояние isRefreshing обновлялось слишком быстро: оно переключалось на true и сразу обратно на false быстрее, чем UI успевал обработать изменения. На устройствах с частотой обновления 60 Гц экран обновляется каждые 16,67 мс, и если изменения происходят быстрее, Compose может пропустить промежуточные состояния.
Чтобы решить проблему, автор добавил задержку в 2000 мс, что позволило индикатору корректно отображаться и исчезать. Однако это временное решение. Позже стало известно, что в версии Material3 v1.4.0-alpha01 эта проблема была исправлена.
Статья подчеркивает важность понимания того, как Jetpack Compose обрабатывает обновления состояния и как частота обновления экрана может влиять на поведение UI. Для надежной работы рекомендуется учитывать возможные задержки и особенности обработки состояний в Compose.
Статья: https://proandroiddev.com/at-the-mountains-of-madness-with-jetpack-compose-09d3625597ad
Платформа: Android
В статье автор делится своим опытом решения неожиданной проблемы при реализации функции pull-to-refresh в Jetpack Compose.
При использовании компонента PullToRefreshBox индикатор обновления застревал на экране и не исчезал, как ожидалось. После отладки выяснилось, что состояние isRefreshing обновлялось слишком быстро: оно переключалось на true и сразу обратно на false быстрее, чем UI успевал обработать изменения. На устройствах с частотой обновления 60 Гц экран обновляется каждые 16,67 мс, и если изменения происходят быстрее, Compose может пропустить промежуточные состояния.
Чтобы решить проблему, автор добавил задержку в 2000 мс, что позволило индикатору корректно отображаться и исчезать. Однако это временное решение. Позже стало известно, что в версии Material3 v1.4.0-alpha01 эта проблема была исправлена.
Статья подчеркивает важность понимания того, как Jetpack Compose обрабатывает обновления состояния и как частота обновления экрана может влиять на поведение UI. Для надежной работы рекомендуется учитывать возможные задержки и особенности обработки состояний в Compose.
Статья: https://proandroiddev.com/at-the-mountains-of-madness-with-jetpack-compose-09d3625597ad
Платформа: Android
❤1
SoundRemote - приложение для Android, которое в паре с сервером SoundRemote позволяет захватывать и передавать звук с ПК на устройство Android, выполнять клавиатурные команды на ПК удаленно из приложения Android либо непосредственно через его пользовательский интерфейс, либо путем привязки к определенным событиям, таким как встряхивание устройства или входящий телефонный звонок, управлять медиафайлами на ПК через медиауведомление Android.
SoundRemote на GitHub: https://github.com/SoundRemote/client-android
Платформа: Android
⭐️: 70
SoundRemote на GitHub: https://github.com/SoundRemote/client-android
Платформа: Android
⭐️: 70
👍1
•
(iOS Ru) Работа в Booking, жизнь в Амстердаме, автогонки в Европе•
(iOS Ru) Многопоточность с нуля на примере пиццы•
(iOS En) SwiftUI Inline Toasts - Xcode 16•
(iOS En) Special Effects with SwiftUI Text•
(iOS En) Mastering SwiftUI Transitions – Custom & Built-in Animations•
(iOS En) Build a Custom Location Picker in SwiftUI: Search & Map Interactions•
(iOS En) SwiftUI - Auto / Manual Scrolling Infinite Carousel in 4 Minutes - Xcode 16•
(And Ru) Разработка SDK•
(And Ru) Прожарка на код-ревью от Яндекса•
(And Ru) Алиса, открой багажник!•
(And Ru) Зачем нужен виртуальный дисплей в Android•
(And En) Developing for the SDK Runtime•
(And En) Now in Android: 115 - Gemini in Android Studio, Enhancing Safety and Security, and more•
(And En) The 3 Biggest Coding Mistakes I Made In My Android Projects•
(And En) Full Guide to Testing APIs on Android & KMP With Ktor MockEngine•
(And En) How Junie Helps You Code Faster with Kotlin in IntelliJ IDEA•
(And En) Double Dispatch: Prelude to the Visitor Pattern•
(And En) What if your IDE could talk back... and help? Junie by JetBrains is here.•
(And En) Why did my build fail? Using AI to troubleshoot faster with Failure Summaries•
(Dev Ru) Разработчик и стартап: работать - основать - избегать?•
(Dev Ru) Чего боится твой тимлид?•
(Dev Ru) Как прогнозируют погоду в 2025 году — ML, Fortran и Big Data•
(Dev En) How to Embed HTML5 Games in Apps & Grow App Revenue•
(Dev En) Code Your Own Llama 4 LLM from Scratch – Full Course•
(Dev En) Essential Machine Learning and AI Concepts AnimatedПрошлогодние видео:
•
(iOS Ru) Организация и поддержка нативных UI-тестов в iOS•
(And Ru) Находим и увольняем low-перформеров•
(Dev Ru) Как проходит архитектурная секция в команду мобильной разработки Яндекс 360 (+ все собеседования)•
(Dev Ru) Настройка CI/CDPlease open Telegram to view this post
VIEW IN TELEGRAM
Как Dropbox масштабирует тестирование Android-приложения, сохраняя доверие пользователей
Статья от команды Android-разработчиков Dropbox подробно описывает, как компания трансформировала свою стратегию тестирования, чтобы обеспечить высокое качество и надежность своего приложения при масштабировании.
Эволюция стратегии тестирования
Изначально Dropbox полагался на обширные End-to-End (E2E) тесты, которые симулировали поведение пользователей. Однако со временем эти тесты стали громоздкими и ненадежными, особенно после перехода на модульную архитектуру. Это привело к замедлению обратной связи и снижению доверия к результатам тестов.
В ответ на эти вызовы команда перераспределила акценты в своей "пирамиде тестирования", сосредоточившись на юнит-тестах и интеграционных тестах, которые обеспечивают более быструю и надежную обратную связь.
Инструменты и подходы
• Модульность: Переход на модульную архитектуру позволил изолировать компоненты и упростить тестирование.
• Инструменты тестирования: Использование современных библиотек, таких как Espresso и Robolectric, улучшило качество юнит-тестов.
• CI/CD: Интеграция с Firebase Test Lab и использование Flank для параллельного выполнения тестов ускорили процесс тестирования.
• Анализ покрытия: Переход от кастомных решений к стандартным инструментам, таким как Jacoco, повысил надежность анализа покрытия кода.
📈 Результаты
Благодаря этим изменениям, Dropbox сократила среднее время выполнения CI-пайплайна с 75 до 25 минут, улучшив производительность и стабильность приложения.
Этот опыт может быть полезен командам, стремящимся улучшить свои процессы тестирования и обеспечить высокое качество мобильных приложений при масштабировании.
Статья: https://medium.com/androiddevelopers/how-dropbox-leverages-testing-to-maintain-high-level-of-trust-at-scale-b7b1bdf6161e
Платформа: Android/тестирование
Статья от команды Android-разработчиков Dropbox подробно описывает, как компания трансформировала свою стратегию тестирования, чтобы обеспечить высокое качество и надежность своего приложения при масштабировании.
Эволюция стратегии тестирования
Изначально Dropbox полагался на обширные End-to-End (E2E) тесты, которые симулировали поведение пользователей. Однако со временем эти тесты стали громоздкими и ненадежными, особенно после перехода на модульную архитектуру. Это привело к замедлению обратной связи и снижению доверия к результатам тестов.
В ответ на эти вызовы команда перераспределила акценты в своей "пирамиде тестирования", сосредоточившись на юнит-тестах и интеграционных тестах, которые обеспечивают более быструю и надежную обратную связь.
Инструменты и подходы
• Модульность: Переход на модульную архитектуру позволил изолировать компоненты и упростить тестирование.
• Инструменты тестирования: Использование современных библиотек, таких как Espresso и Robolectric, улучшило качество юнит-тестов.
• CI/CD: Интеграция с Firebase Test Lab и использование Flank для параллельного выполнения тестов ускорили процесс тестирования.
• Анализ покрытия: Переход от кастомных решений к стандартным инструментам, таким как Jacoco, повысил надежность анализа покрытия кода.
📈 Результаты
Благодаря этим изменениям, Dropbox сократила среднее время выполнения CI-пайплайна с 75 до 25 минут, улучшив производительность и стабильность приложения.
Этот опыт может быть полезен командам, стремящимся улучшить свои процессы тестирования и обеспечить высокое качество мобильных приложений при масштабировании.
Статья: https://medium.com/androiddevelopers/how-dropbox-leverages-testing-to-maintain-high-level-of-trust-at-scale-b7b1bdf6161e
Платформа: Android/тестирование
❤2
Если бы CoreData порвала с legacy, приняла современный Swift и вышла замуж за GraphQL - вы бы получили SwiftletModel.
SwiftletModel - это то, чем вы хотели бы видеть SwiftData, если бы она была переосмыслена с нуля. Библиотека дает вам мощь управления графами на уровне CoreData с простыми Swift-структурами, скоростью работы в памяти и нулевым шаблонным кодом.
SwiftletModel не является традиционным ORM или слоем базы данных. Она не абстрагирует SQL и не управляет дисковой персистентностью. Это безопасный с точки зрения типов, нормализованный, in-memory движок графовой модели - место для объединения, формирования и управления данными о бизнес-субъектах из различных источников без особых усилий.
SwiftletModel отлично подходит для следующих сценариев:
• Сложные доменные модели: Идеально подходит для приложений со сложными доменными моделями, содержащими множество взаимосвязанных типов сущностей.
• Легкое локальное хранилище: Подходит для тех случаев, когда вы хотите избежать накладных расходов на разработку постоянных хранилищ, таких как CoreData, SwiftData, Realm или SQLite.
• Приложения, ориентированные на бэкенд: Идеально подходит для приложений, в которых бэкенд является основным источником истины и нет необходимости в полноценной локальной базе данных.
• Множество источников данных: Настоящее обезболивающее для приложений, которые управляют и объединяют данные из нескольких источников - API бэкенда, локальных файлов, облачных сервисов, HealthKit, Location и т.д. - в единый, типобезопасный in-memory граф.
Несмотря на то, что модели данных SwiftletModel работают преимущественно в памяти, они представляют собой простые Codable-структуры, что позволяет легко интегрировать их с любыми решениями для хранения данных: плоскими файлами, CRDTs, GRDB, CoreData/SwiftData, SQLite, iCloudKit, Firebase, API бэкэндов и т. д.
SwiftletModel на GitHub: https://github.com/KazaiMazai/SwiftletModel
Платформа: iOS
⭐️: 54
SwiftletModel - это то, чем вы хотели бы видеть SwiftData, если бы она была переосмыслена с нуля. Библиотека дает вам мощь управления графами на уровне CoreData с простыми Swift-структурами, скоростью работы в памяти и нулевым шаблонным кодом.
SwiftletModel не является традиционным ORM или слоем базы данных. Она не абстрагирует SQL и не управляет дисковой персистентностью. Это безопасный с точки зрения типов, нормализованный, in-memory движок графовой модели - место для объединения, формирования и управления данными о бизнес-субъектах из различных источников без особых усилий.
SwiftletModel отлично подходит для следующих сценариев:
• Сложные доменные модели: Идеально подходит для приложений со сложными доменными моделями, содержащими множество взаимосвязанных типов сущностей.
• Легкое локальное хранилище: Подходит для тех случаев, когда вы хотите избежать накладных расходов на разработку постоянных хранилищ, таких как CoreData, SwiftData, Realm или SQLite.
• Приложения, ориентированные на бэкенд: Идеально подходит для приложений, в которых бэкенд является основным источником истины и нет необходимости в полноценной локальной базе данных.
• Множество источников данных: Настоящее обезболивающее для приложений, которые управляют и объединяют данные из нескольких источников - API бэкенда, локальных файлов, облачных сервисов, HealthKit, Location и т.д. - в единый, типобезопасный in-memory граф.
Несмотря на то, что модели данных SwiftletModel работают преимущественно в памяти, они представляют собой простые Codable-структуры, что позволяет легко интегрировать их с любыми решениями для хранения данных: плоскими файлами, CRDTs, GRDB, CoreData/SwiftData, SQLite, iCloudKit, Firebase, API бэкэндов и т. д.
SwiftletModel на GitHub: https://github.com/KazaiMazai/SwiftletModel
Платформа: iOS
⭐️: 54
👍2
Как запустить локальную LLM (AI) в Android Studio
Если вы мобильный разработчик и следите за AI-трендами, наверняка задумывались о том, как интегрировать языковые модели (LLM) в свои приложения прямо из Android Studio. В этой статье я расскажу, как это можно сделать быстро и просто, не полагаясь на внешние API и облачные решения.
Статья: https://habr.com/ru/articles/904648/
Платформа: Android
Если вы мобильный разработчик и следите за AI-трендами, наверняка задумывались о том, как интегрировать языковые модели (LLM) в свои приложения прямо из Android Studio. В этой статье я расскажу, как это можно сделать быстро и просто, не полагаясь на внешние API и облачные решения.
Статья: https://habr.com/ru/articles/904648/
Платформа: Android
❤1
Offline First в мобильных приложениях. CRUD на стороне клиента
Надеюсь, эта статья поможет оценить объем работы и предугадать, какие подводные камни ожидают вас при реализации поддержки offline first в ваших приложениях :)
Статья: https://habr.com/ru/companies/friflex/articles/904448/
Платформа: разработка
Надеюсь, эта статья поможет оценить объем работы и предугадать, какие подводные камни ожидают вас при реализации поддержки offline first в ваших приложениях :)
Статья: https://habr.com/ru/companies/friflex/articles/904448/
Платформа: разработка
❤1
SharingGRDB: быстрая, легкая замена SwiftData
Компания Point-Free выпустила значительное обновление библиотеки SharingGRDB, которая предлагает быструю, эргономичную и легкую замену SwiftData, работающую на базе SQL. Она предоставляет API, аналогичные
Статья: https://apptractor.ru/info/articles/sharinggrdb.html
Платформа: iOS
Компания Point-Free выпустила значительное обновление библиотеки SharingGRDB, которая предлагает быструю, эргономичную и легкую замену SwiftData, работающую на базе SQL. Она предоставляет API, аналогичные
@Model, @Query и #Predicate, но настроена на прямой доступ к базовой базе данных (то, от чего абстрагируется SwiftData), что дает вам больше возможностей, больше гибкости и больше производительности при сохранении и получении данных в приложении.Статья: https://apptractor.ru/info/articles/sharinggrdb.html
Платформа: iOS
Cколько раз ваши представления SwiftUI перерисовываются: узнаем с помощью Инструментов
Если вы столкнулись с проблемой производительности SwiftUI-приложения, причина может заключаться в слишком частой перерисовке представлений. Apple предоставляет инструменты, которые позволяют увидеть, сколько раз SwiftUI перерисовывает представления, а также свойства представлений, которые вызывают перерисовку. В этой статье мы расскажем, как использовать эти инструменты.
Статья: https://apptractor.ru/info/articles/ckolko-raz-vashi-predstavleniya-swiftui-pererisovyvayutsya-uznaem-s-pomoschyu-instrumentov.html
Платформа: iOS
Если вы столкнулись с проблемой производительности SwiftUI-приложения, причина может заключаться в слишком частой перерисовке представлений. Apple предоставляет инструменты, которые позволяют увидеть, сколько раз SwiftUI перерисовывает представления, а также свойства представлений, которые вызывают перерисовку. В этой статье мы расскажем, как использовать эти инструменты.
Статья: https://apptractor.ru/info/articles/ckolko-raz-vashi-predstavleniya-swiftui-pererisovyvayutsya-uznaem-s-pomoschyu-instrumentov.html
Платформа: iOS
Android Gif Search - LazyVerticalGrid с картинками на MVVM с использованием Dagger 2 + Hilt с Retrofit 2, Moshi, Kotlin Coroutines, JUnit, Espresso и Robolectric тестами.
Gif Search на GitHub: https://github.com/jaredsburrows/android-gif-search
Платформа: Android
⭐️: 406
Gif Search на GitHub: https://github.com/jaredsburrows/android-gif-search
Платформа: Android
⭐️: 406
This media is not supported in your browser
VIEW IN TELEGRAM
Как одна строчка кода может сломать ваш iPhone
Еще в середине 2024 года автор в iOS нашел уязвимость, которая может навсегда (до восстановления из бэкапа) брикнуть устройство.
Дело в том, что процессы в ОС могут обмениваться уведомлениями Darwin, это низкоуровневый механизм для простого обмена данными в операционных системах Apple. При этом они:
• Не требуют особых привилегий для получения
• Не требуют специальных привилегий для отправки
• Доступны как общедоступный API
• Не имеют механизма проверки отправителя
И именно такие сообщения использовались для работы ключевых системных процессов, вроде входа и выхода устройства из «режима потери» Find My или запуска режима «идет восстановление».
Последний и послужил отличным "отказом в обслуживании", поскольку операция неизбежно завершалась неудачей после тайм-аута, ведь устройство фактически не восстанавливалось, и единственным средством решения этой проблемы было нажатие кнопки «Restart», что приводило к перезагрузке устройства.
Дальше дело было только за тем, чтобы снова отправлять уведомление при новом старте устройства, но с этим прекрасно справилась подсистема виджетов, которая стартует еще до разблокировки устройства.
Итого - 9 месяцев на исправление в iOS 18.3 (теперь уведомления принимаются только от системных процессов) и $17,500 за найденную ошибку.
Статья: https://apptractor.ru/info/articles/kak-odna-strochka-koda-mozhet-slomat-vash-iphone.html
Платформа: iOS
Еще в середине 2024 года автор в iOS нашел уязвимость, которая может навсегда (до восстановления из бэкапа) брикнуть устройство.
Дело в том, что процессы в ОС могут обмениваться уведомлениями Darwin, это низкоуровневый механизм для простого обмена данными в операционных системах Apple. При этом они:
• Не требуют особых привилегий для получения
• Не требуют специальных привилегий для отправки
• Доступны как общедоступный API
• Не имеют механизма проверки отправителя
И именно такие сообщения использовались для работы ключевых системных процессов, вроде входа и выхода устройства из «режима потери» Find My или запуска режима «идет восстановление».
notify_post(«com.apple.MobileSync.BackupAgent.RestoreStarted»)
Последний и послужил отличным "отказом в обслуживании", поскольку операция неизбежно завершалась неудачей после тайм-аута, ведь устройство фактически не восстанавливалось, и единственным средством решения этой проблемы было нажатие кнопки «Restart», что приводило к перезагрузке устройства.
Дальше дело было только за тем, чтобы снова отправлять уведомление при новом старте устройства, но с этим прекрасно справилась подсистема виджетов, которая стартует еще до разблокировки устройства.
Итого - 9 месяцев на исправление в iOS 18.3 (теперь уведомления принимаются только от системных процессов) и $17,500 за найденную ошибку.
Статья: https://apptractor.ru/info/articles/kak-odna-strochka-koda-mozhet-slomat-vash-iphone.html
Платформа: iOS
🙈2
Руководство по потреблению памяти Android Studio
Android Studio — мощная IDE, но она может быть требовательна к памяти. Несколько твиков могут значительно повысить производительность и уменьшить чрезмерное использование памяти. В этой статье я дам советов и более подробно расскажу о том, как работает каждая оптимизация и как ее применять.
1. Включите индикатор памяти и настройте размер кучи IDE
2. Оптимизируйте настройку демона Gradle для сборок
3. Включите параллельные сборки проектов
4. Используйте автономный режим Gradle и кэш сборки
5. Управляйте использованием памяти эмулятора Android (или используйте физическое устройство)
6. Отключите неиспользуемые плагины и функции в Android Studio
Статья: https://apptractor.ru/info/articles/rukovodstvo-po-potrebleniyu-pamyati-android-studio.html
Платформа: Android
Android Studio — мощная IDE, но она может быть требовательна к памяти. Несколько твиков могут значительно повысить производительность и уменьшить чрезмерное использование памяти. В этой статье я дам советов и более подробно расскажу о том, как работает каждая оптимизация и как ее применять.
1. Включите индикатор памяти и настройте размер кучи IDE
2. Оптимизируйте настройку демона Gradle для сборок
3. Включите параллельные сборки проектов
4. Используйте автономный режим Gradle и кэш сборки
5. Управляйте использованием памяти эмулятора Android (или используйте физическое устройство)
6. Отключите неиспользуемые плагины и функции в Android Studio
Статья: https://apptractor.ru/info/articles/rukovodstvo-po-potrebleniyu-pamyati-android-studio.html
Платформа: Android
❤1👍1
SSZipArchive - простая библиотека для архивации и разархивации файлов на iOS, macOS, tvOS, watchOS и visionOS. Умеет распаковывать zip-файлы, в том числе защищенные паролем или зашифрованных AES, создавать архивы такие же архивы - с паролями и шифрованием (в том числе и прямо из NSData).
SSZipArchive на GitHub: https://github.com/ZipArchive/ZipArchive
Платформа: iOS
⭐️: 5.5K
SSZipArchive на GitHub: https://github.com/ZipArchive/ZipArchive
Платформа: iOS
⭐️: 5.5K