es
Feedback
iOS Dev

iOS Dev

Ir al canal en Telegram

👨‍💻Автор: Виктор Грушевский (@Viktorianec) ⚒️ База: https://boosty.to/ios_dev | 🤖 @iOSIQBot | https://iosiq.ru 🍏Канал об iOS-разработке, алгоритмах и архитектурах ⭐️ Подготовка к собесам ⭐️ Код. Много кода. #ios #mobile #swift

Mostrar más
8 002
Suscriptores
+424 horas
+427 días
+8130 días
Archivo de publicaciones
iOS Dev
8 003
Какой у вас опыт разработки (не только iOS, а в целом)?
Anonymous voting

iOS Dev
8 003
iOS IQ — что доступно уже сейчас? Со времени создания закрытой базы знаний прошло уже более полугода, и за это время я получил множество отзывов. Многие из них о полезности контента и о структуре, которой нет больше ни в одном канале (небольшая ремарка, для меня это основа, когда ты делаешь то, что тебе нравится). Большинство читателей удивлены, насколько широкие вещи затрагиваются, и, конечно, приятно получать фидбэк, в котором ребята делятся, что контент помогает со многими вещами в работе. Знаю, что некоторые используют темы для подготовки к собеседованиям с обеих сторон. Но это не главное. Как уже неоднократно писал в канале, в первую очередь, я — разработчик, и поэтому тщательно подхожу к тому, о чём пишу, и как именно это преподносится. Мне важно рассказывать о практических анимациях и о том, что по-настоящему полезно. Конечно, посты и из канала, и из бусти иногда появляются в других местах (приятно, что подписчики делятся этим). Часто посты разбавляют сомнительной рекламой или непонятными заявлениями. Ни в этом канале, ни в iOS IQ, ни в приложении такого не было, нет и не будет. Иногда меня просят отреагировать на это или публично ответить, но я считаю, что выбор, который делают эти ребята, только на их совести. Приятнее потратить доступный отрезок свободного времени на разбор фишек Xcode или разбор ещё одного шейдера. В iOS IQ сейчас вы можете:
➡️Познакомиться с решением практических задач на самые разные темы (от поиска утечек памяти до примеров работы со SwiftData). ➡️Узнать, как работать с дебаггером (про трюки с lldb, получить советы по отладке и неообычные примеры использования брейкпоинтов). ➡️Получить базу для подготовки к собеседованиям (память, чтение кода, разборы конкретных вопросов, и конечно тематические подборки). ➡️Разбор архитектурных шаблонов на реальных примерах. За основу взяты паттерны проектирования банды четырёх. ➡️Полезные вопросы с секции system design. ➡️Разбор техник для решения алгоритмов. И мой собственный набор решённых задач от яндекса.
🧠 Если вы хотите поддержать канал и прокачаться в перечисленных выше темах, подпишитесь по специальному предложению на бусти или здесь, в телеграм - этот способ предпочтительнее. 😃 iOS Dev

iOS Dev
8 003
Ещё одно приятное нововведение в Xcode 16 🚀 Теперь в ассетах можно найти все места в проекте, где используется картинка за пару мгновений. Использование: щелчок правой кнопкой мыши + Find References to Item. Легко можно найти лишние ресурсы + избежать потенциальных опечаток (ну и сэкономить немного времени). 😃 iOS Dev

iOS Dev
8 003
Как автоматически обнаруживать утечки памяти с помощью UI-тестов 📖 Пол Пиелла написал отличную развёрнутую статью о том, как можно юзать функциональность, доступную нам аж с Xcode 13 (тогда появилась опция xcodebuild, генерирующая memory graph всякий раз, когда фэйлится тест XCTMemoryMetrics). Эта фича так и осталась незамеченной многими, хотя при правильном использовании это мощнейший инструмент для обнаружения утечек памяти в приложениях. Саму статью можно разбить на несколько важных частей: 1️⃣ Написание самого теста, чекающего использование памяти. 2️⃣ Генерация memory graph. 3️⃣ Разбор результатов и анализ графа. Тут пригодится ещё один материал про разбор содержимого XCResult. ✅Напомню, что в ноушне есть целый раздел по теории и вопросы по управлению памятью (в том числе и про шаги для предотвращения утечек). 😃 iOS Dev

iOS Dev
8 003
Как решить проблему с констрэинтами или как быть с ошибками вида «will attempt to recover by breaking constraint»? Многие уже
Как решить проблему с констрэинтами или как быть с ошибками вида «will attempt to recover by breaking constraint»? Многие уже используют SwiftUI в проде или пет-проектах. Несмотря на это, UIKit никуда не уходит, а проблемы с автолэйаутом встречаются довольно часто. Хотел бы напомнить про трюк, а если быть точнее, мастхэв-навык при поиске подобных проблемных вьюх с помощью стандартных инструментов Xcode. Если вы встретите такую ошибку (или её вариации): Will attempt to recover by breaking constraint <NSLayoutConstraint:0xb82d450 H:[UIButton:0xb82ad50]-(NSSpace(20))-| (Names: '|':UIView:0xb82f360 )> Запустите View Debugger и вставьте айдишник проблемной вьюхи в поле поиска слева внизу. Xcode автоматически подсветит её и уже после вы спокойно сможете устранить эту проблему. ⭐️ А ещё есть полезнейший сайт, который часто может помочь в таких ситуациях. ⭐️Кстати, в базе знаний я делюсь своим опытом, и стараюсь наполнять разные разделы, один из которых — разбор различных проблем в разработке. 😃 iOS Dev

iOS Dev
8 003
Swift Navigation: инструменты навигации от PointFree PointFree выкатили в опенсорс либу Swift Navigation — набор мощных инстр
Swift Navigation: инструменты навигации от PointFree PointFree выкатили в опенсорс либу Swift Navigation — набор мощных инструментов для всех платформ Swift (в качестве вдохновения использовались принципы SwiftUI). С помощью библиотеки можно управлять навигацией в SwiftUI, UIKit и AppKit. Более того, её можно использовать и для платформ, отличных от Apple, таких как Windows, Linux, Wasm и т.д.. 🛠 Инструментарий уже доступен на GitHub (1 800 ⭐) Примеры работы доступны здесь: 📖 Case Studies — коллекция примеров SwiftUI и UIKit, демонстрирующих API этой библиотеки. 📖 Inventory — многоэкранное приложение со списками, всплывающими окнами и алертами. 😃 iOS Dev

iOS Dev
8 003
🧠 Массивы в Swift: вопросы и техники В iOS IQ добавлен новый раздел с практическими вопросами по работе с массивами. Не всег
🧠 Массивы в Swift: вопросы и техники В iOS IQ добавлен новый раздел с практическими вопросами по работе с массивами. Не всегда операции над ними очевидны, а некоторые могут вызвать сложности даже у продвинутых разработчиков.
Кроме этого, в отдельной секции внутри уникальной базы знаний уже сегодня доступны: ➡️Вопросы на чтение кода ➡️Многопоточность ➡️DispatchQueue: практические вопросы ➡️Swift Concurrency ➡️Алгоритмы: терминология и примеры ➡️Память: ARC, side table, флаги, утечки Также вы получите доступ в закрытый чат, ранние релизы приложения iOS IQ, тонну теории, разбор крутых эффектов и многое другое.
Подпишитесь сегодня на бусти или через телеграм (в свете последних изменений я бы рекомендовал именно этот способ). 😃 iOS Dev

iOS Dev
8 003
Барбара Лисков — об абстракции данных и ООП Барбара — профессор MIT, автор языков Клу и Argus, лауреат премии Тьюринга, и вы все наверняка её знаете из-за изучения SOLID. Рекомендую посмотреть интересное видео, в котором Барбара отвечает на необычные вопросы не только о прошлом, но и о будущем ООП. А ещё затрагивает технические нюансы принципа подстановки Лисков в контексте SOLID. 🤩 Ведь как известно, лучше всего — получать ответы на свои вопросы из первоисточников. 😃 iOS Dev

iOS Dev
8 003
🥳 Создание файла из кода в буфере обмена в Xcode 16 Одна из наиболее приятных (если не топовых) фич в новом Xcode — новая возможность рефакторинга (и не только). Например, можно буквально за пару секунд скопировать любой кусок кода и создать из этого файл с помощью хоткея для вставки. При этом Xcode ещё и сам подберёт и задаст подходящее название (например, как на гифке). 😃 iOS Dev

iOS Dev
8 003
Ещё один шаг вперёд При изучении новой темы сложнее всего возвращаться к ней в случае, когда область неизведанного кажется непреодолимой, когда кажется, что с первого взгляда задачи не то что решить, а даже понять невозможно. К такому можно отнести работу с криптографией, для кого-то многопоточку, а для кого-то сложную вёрстку. Когда я делал приложение, то изначально преследовал две цели: во-первых, заюзать как можно больше фишек из новых версий iOS, во-вторых, что гораздо более прозаично — сделать инструмент, который будет интересно не только изучать, но и соревноваться. Саморазвитие через дополнительные задачи может казаться не лучшим времяпрепровождением, особенно, когда результат неясен, а область сама по себе размыта. Но оно жизненно необходимо, ведь умение тренировать переполненный мозг — это большая проблема современного общества эпохи тик-тока, рилсов, шортсов. Когда-то я читал любопытное мнение, что программист переходит на новый уровень, когда изучает второй язык. Мне оно кажется справедливым (и может пригодиться в неожиданные моменты). Этот канал — способ поделиться самыми разными областями знаний мобильного сообщества. 🎆 Сегодня я хотел бы анонсировать новый раздел для тех, кто саппортит развитие канала. Кроме подборок материалов по Metal, я буду делиться и своими опытами, пусть не всегда удачными или «правильными», но совершенно точно необычными. ✅Сделайте ещё один шаг вперёд уже сегодня, подпишитесь на бусти или в телеграме (код шейдера с видео уже там). 😃 iOS Dev

iOS Dev
8 003
Паттерны навигации в SwiftUI NavigationStack улучшил навигацию, обеспечив динамическую и программную маршрутизацию, вместе с
Паттерны навигации в SwiftUI NavigationStack улучшил навигацию, обеспечив динамическую и программную маршрутизацию, вместе с тем появились способы централизации маршрутов для всего приложения. 📖 В этой статье рассмотрены общие варианты навигации, которые можно использовать при создании приложений: 🔘 Базовая навигация при использовании List 🔘 Динамическая программная маршрутизация 🔘 Глобальная маршрутизация в SwiftUI 🔘 Реализация навигации c использованием Environment Values. 🔘 Реализация навигации для TabView. 📖 А вот тут можно почитать про особенности NavigationPath, принципы работы и отличия от UINavigationController в UIKit. 😃 iOS Dev

iOS Dev
8 003
Анимации в SwiftUI — подборка репозиториев на Github Реализация эффектов в приложениях может быть и интересной, и сложной задачей одновременно. В этой подборке добавил несколько популярных репозиториев на Github, где можно посмотреть на анимации и поискать вдохновение: 🔗 Open SwiftUI Animations — 4 000 ⭐ 🔗 SwiftUI-Animations — 1 800 ⭐ 🔗 kavsoft-swiftui-animations — 460 ⭐ 😃 iOS Dev

iOS Dev
8 003
Swift Translation API: примеры реализации Для перевода до анонса этого фреймворка в пет-проектах я использовал или Google Translate API, или DeepL (знаю, что многие юзают решение от OpenAI). 📶 Но для них нужно интернет-соединение (что логично), и деньги (DeepL, например, имеет премиум-акк, на котором нужно платить за объём знаков). Поэтому анонс решения Apple выглядит криптонитом для многих проектов, и одновременно возможностью реализации своих решений. Посмотрим, что будет после выхода в прод, будет ли перевод на платную модель, как с Weather API или оставят все фичи, как есть. 📖 А уже сейчас можно посмотреть на пример создания приложений с новым фреймворком и почитать прекрасный разбор API здесь. 😃 iOS Dev

iOS Dev
8 003
Развёрнутый гайд по работе с App Store Connect API Выполнение действий вручную на сайте App Store Connect, вероятно, наиболее распространенный способ для разработчиков управлять и отслеживать состояние приложений в App Store. Но некоторые задачи могут занимать неоправданно много времени, поскольку для их выполнения нужно постоянно повторять одни и те же действия. Да и не всегда сайт показывает корректное описание ошибок (при заливке скриншотов, например). Вот библиотеки, которые могут помочь при работе с App Store Connect API: 🔗 appstoreconnect-swift-sdk (c её помощью я написал собственное решение для управления отзывами и частичной автоматизации обновлений в аппсторе) 🔗 Bagbutik 🔗 asc-swift Ниже перечислил статьи, демонстрирующие способы создания собственных средств автоматизации с помощью App Store Connect API 1️⃣ Как отправлять запросы к App Store Connect API. 2️⃣ Расчет среднего рейтинга отзывов. 3️⃣ Работа с provisioning profiles. 4️⃣ Создание и удаление сертификатов. Кстати, если вы хотите узнать, что скрывается за сертификатами для Code Signing, в канале есть общий пост, а на бусти большой разбор. ✅Например, вы можете узнать подробнее про понятия .der и .pem, цепочку доверия, Certificate signing request, что происходит при переподписывании кода в App Store и многое другое. 😃 iOS Dev

iOS Dev
8 003
Загрузка UIImage с диска: разбор сценариев и импакт на память 🔼 Конечно, потребление памяти может расти очень быстро, если г
Загрузка UIImage с диска: разбор сценариев и импакт на память 🔼 Конечно, потребление памяти может расти очень быстро, если грузить большое количество изображений. Важно определиться, что именно нам нужно хранить в памяти: насколько часто мы показываем картинки, нужна ли предварительная обработка и так далее. На основе этого уже можно принимать решение, как именно стоит работать с картинками, и нужен ли, например, тут кэш. 📖 Антуан в своей статье описал несколько таких сценариев и привёл пример использования кэширования в этих ситуациях.
📖 А в этом посте вы можете узнать некоторые причины и способы правки out of memory exception при работе с изображениями. 📖 Кстати, вот тут можно почитать про эффективный способ загрузки больших изображений в основном потоке. Больше интересных кейсов и ситуаций доступно здесь.
😃 iOS Dev

iOS Dev
8 003
Async await в Swift: набор инструментов 📖 В блоге Emerge Tools вышла объёмная статья, в которой рассмотрено множество методо
Async await в Swift: набор инструментов 📖 В блоге Emerge Tools вышла объёмная статья, в которой рассмотрено множество методов из Swift Concurrency. Из важного: для каждого инструмента приведены примеры кода и рассмотрена теория.
Больше материалов по Swift Concurrency: 🔗 Практические решения проблем с помощью Swift Concurrency 🔗 Изучение Swift Concurrency за 2 часа 🔗 Task и structured concurrency в swift (серия статей на хабре) 🔗 Swift Concurrency — вещи, о которых вам не говорятВ приложении доступен целый блок вопросов (который будет расширяться). 🧠 А на бусти и в боте вы можете познакомиться с реальными задачами и кейсами использования.
😃 iOS Dev

iOS Dev
8 003
Разбор Grid View в SwiftUI: LazyVGrid, LazyHGrid, Grid, GridRow Для создания нужного лэйаута в SwiftUI можно использовать Laz
Разбор Grid View в SwiftUI: LazyVGrid, LazyHGrid, Grid, GridRow Для создания нужного лэйаута в SwiftUI можно использовать LazyVGrid, если нужно вертикальное отображение, и LazyHGrid (если горизонтальное). Тем самым мы сможем добиться нужного эффекта, при этом адаптируемого к различным ориентациям и размерам экрана. Начиная с iOS 16, нам также доступен вариант создания Grid с использованием GridRow. 📖 В этой статье разбираются не только виды лэйаутов, но и опции кастомизации, включая интервалы, выравнивание и многое другое. 😃 iOS Dev

iOS Dev
8 003
Компилятор Swift: архитектура, оптимизации, флаги, ресурсы Конечно, любой компилятор отвечает за трансляцию исходного кода в
Компилятор Swift: архитектура, оптимизации, флаги, ресурсы Конечно, любой компилятор отвечает за трансляцию исходного кода в эффективный исполняемый машинный код. Но компилятор Swift поддерживает и множество других инструментов (далеко не только подсветка синтаксиса). Я уже писал небольшую статью с разбором. Пришло время расширить её вопросами и дополнить другими важными источниками. ✅Доступ уже можно получить на бусти и в телеграм-боте (можно даже на год).
🧠 Что вы получите, подписавшись сегодня: ➡️Вопросы на чтение кода ➡️Многопоточность ➡️DispatchQueue: практические вопросы ➡️Swift Concurrency ➡️Алгоритмы: терминология и примеры ➡️Память: ARC, side table, флаги, утечки ✅А также доступ в закрытый чат, ранние релизы приложения iOS IQ, тонну теории и многое другое.
Кстати, на хабре есть великолепный разбор устройства компилятора, который стоит добавить в закладки: 📖 Устройство компилятора Swift. Часть 1 (общий обзор компонентов). 📖 Устройство компилятора Swift. Часть 2 (разбор частей, отвечающих за анализ исходного кода). 📖 Устройство компилятора Swift. Часть 3 (разбор Swift Intermediate Language). 📖 Устройство компилятора Swift. Часть 4 (генерация LLVM IR из AST и что выдаёт настоящий фронтенд). 😃 iOS Dev

iOS Dev
8 003
Способы проверки доступности новой версии приложения в AppStore У многих пользователей может быть выключена опция автообновления, но часто нам необходимо как-то сообщить, что наше приложение пора обновлять. Что делать? Пол Пиелла делится двумя популярными способами в своей статье: 1. Использовать iTunes Lookup: Вариант, который можно использовать не только для получения версии, но и для других параметров.
import Foundation struct LookUpResponse: Decodable { let results: [LookUpResult] struct LookUpResult: Decodable { let version: String let minimumOsVersion: String let trackViewUrl: URL } } struct LatestAppStoreVersion { let version: String let minimumOsVersion: String let upgradeURL: URL } final class LookUpAPI { private let session: URLSession private let jsonDecoder: JSONDecoder init(session: URLSession = .shared, jsonDecoder: JSONDecoder = .init()) { self.session = session self.jsonDecoder = jsonDecoder } func getLatestAvailableVersion(for appID: String) async throws -> LatestAppStoreVersion? { let url = URL(string: "https://itunes.apple.com/lookup?appId=\(appID)")! let request = URLRequest(url: url) let (data, _) = try await session.data(for: request) let response = try jsonDecoder.decode(LookUpResponse.self, from: data) print(response) return response.results.first.map { .init(version: $0.version, minimumOsVersion: $0.minimumOsVersion, upgradeURL: $0.trackViewUrl) } } }
2. Использовать App Store Connect API Можно использовать свою обёртку или использовать SDK, которую, например, я применил для Starly. 3. От себя бы я добавил, что весьма популярный способ — держать файл с обновлениями где-то ещё (или иметь собственное API для запроса актуальной версии в сторе). 4. Можно использовать ещё Firebase Remote Config (по сути повторение третьего способа, просто от Google). После того, как мы получим данные приложения, сравнить новую версию можно с локальной:
extension LatestAppStoreVersion { var shouldUpdate: Bool { guard let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return false } let systemVersion = ProcessInfo().operatingSystemVersion let versionString = "\(systemVersion.majorVersion).\(systemVersion.minorVersion).\(systemVersion.patchVersion)" let isRemoteVersionHigherThanLocal = currentVersion.compare(self.version, options: .numeric) == .orderedAscending let isSystemVersionAllowed = versionString.compare(self.minimumOsVersion, options: .numeric) == .orderedDescending return isRemoteVersionHigherThanLocal && isSystemVersionAllowed } }
Если вы знаете другие способы (может быть, более элегантные), поделитесь, пожалуйста, в комментариях. 😃 iOS Dev

iOS Dev
8 003
Миграция проекта на Swift 6: неполное руководство Наверняка, многие проходили несколько итераций апгрейда кодовой базы (кто-то даже с Objective-C, и до сих пор какой-то процент кода может быть написан на нём и в ваших текущих проектах). Задача миграции всегда стоит особняком, это кропотливая, тяжёлая и совсем не быстрая работа, а одна из сложностей при оптимизации — показать ценность для бизнеса. Бывает непросто объяснить, почему нам нужно что-то менять, если и так всё работает. Но иногда это просто необходимо. Конечно, при переходе на Swift 6 могут быть проблемы, да и что говорить, часто мы не всё можем контролить напрямую (те же зависимости CocoaPods или SPM), поэтому приходится искать варианты. 📖 В этом материале есть ответы на вопросы, возникающие при миграции, разбор ошибок и даже описание багов в самом Swift. 📖 А шаги, которые можно предпринять уже сейчас — описаны в этом посте. 😃 iOS Dev