ar
Feedback
iOS Dev

iOS Dev

الذهاب إلى القناة على Telegram

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

إظهار المزيد
7 880
المشتركون
-224 ساعات
-17 أيام
-5230 أيام
أرشيف المشاركات
iOS Dev
7 880

iOS Dev
7 880
А вы знали, что системный UIDatePicker (даже в напоминаниях и часах) - на самом деле не бесконечная лента? Иногда в работе всем приходится решать баги, прилетающие от отдела QA, которые встречаются у пары пользователей или при определённой фазе Луны. Что делает в таком случае Apple? Ответ - решают проблемы остальных 99.99% пользователей. Да и вообще это что, в первый раз? 😃 iOS Dev

iOS Dev
7 880
Four Corners: первая игра, целиком написанная на Swift для Playdate В канале я часто пишу про необычные решения, а ещё немног
Four Corners: первая игра, целиком написанная на Swift для Playdate В канале я часто пишу про необычные решения, а ещё немного коллекционирую самые разные игровые приставки (ха-ха, про это можно было даже написать в посте про Японию). Например, из последней поездки притащил Game Boy Micro Anniversary Edition, пусть и немного потрёпанную временем). Одна из приставок в коллекции - Playdate (и она как раз на фотке к этому посту). И для неё с недавних пор можно писать на Swift! Нашёл интересное интервью со Стивеном Чипманом, который рассказал о плюсах о всей боли, которая сопутствовало процессу переписывания приложения с Lua. Например, недоступен Foundation, а ещё нет Codable, что превратило работу с JSON в нетривиальный таск. Особое внимание пришлось на процесс отладки. Например, в рантайме если приложение крашится - то мы не можем даже получить стектрейс. 📖 В общем, рекомендую почитать, особенно если вам интересен и embedded swift, в частности. 📺 А тут можно посмотреть и доклад на тему. 😃 iOS Dev

iOS Dev
7 880
🍾 Бот для проверки знаний по iOS и подготовке к собеседованиям У меня отличная новость! Открываю бета-тестирование бота по i
🍾 Бот для проверки знаний по iOS и подготовке к собеседованиям У меня отличная новость! Открываю бета-тестирование бота по iOS. Есть несколько режимов, бесконечный и режим собеса. И реализована таблица лидеров (не переживайте, ваши результаты для всех анонимны). Реализовал на firestore+cloud functions+telegram bot api на node.js. Сейчас крутится один инстанс, посмотрю как будет по нагрузке в дальнейшем. 🤖 Запустить и проверить себя можно здесь: @iOSIQBot Для трибьюта и телеги я реализовал кроссчек подписок (бусти по чату) и выкатил бонусный премиум-режим. Не забудьте подписаться и вы 💰 с приятными условиями на бусти в ⭐️ в телеграме. Ах да, специальный бонус тому, кто наберёт больше всех очков в конце недели: будет пасхалка от меня в буквальном смысле. 🎁 Поддержать разработку. 😃 iOS Dev

iOS Dev
7 880
Как мигрировать UIKit-интерфейс на scene-based в iOS Для iOS 18.4 и выше уже сейчас вы можете видеть сообщение в консоли для старых неадаптированных проектов:
This process does not adopt UIScene lifecycle. This will become an assert in a future version.
А кто ставил бетку Xcode и пробовал собрать для 26 оси, наверняка видели и сообщения пострашнее:
UIScene lifecycle will soon be required. Failure to adopt will result in an assert in the future.
В следующем за 26 осью мажорном релизе приложение, основанное не на сценах вообще не запустится. Сейчас я работаю над большим проектом, в котором до сих пор не только многое на Objective-C, но и одна из задач в текущих релизах - заадоптить саппорт для CarPlay, так что здесь без корректного перехода на сцены ничего бы не получилось. На самом деле всё довольно просто, для этого вам нужно всего лишь: 1. Добавляем саппорт сцен в plist:
<key>UIApplicationSceneManifest</key> <dict> <key>UIApplicationSupportsMultipleScenes</key> <false/> <key>UISceneConfigurations</key> <dict> <key>UIWindowSceneSessionRoleApplication</key> <array> <dict> <key>UISceneConfigurationName</key> <string>Default Configuration</string> <key>UISceneDelegateClassName</key> <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string> <key>UISceneStoryboardFile</key> <string>Main</string> </dict> </array> </dict> </dict> // Скорее всего, в небольших проектах достаточно будет одной сцены, но если у вас mac catalyst, например - то поддержка мультисцен буквально мастхэв для многих кейсов.
2. Кроме этого, нужно задать конфиг для каждой из использующихся в проекте сцен:
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application( _ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions ) -> UISceneConfiguration { // Each UISceneConfiguration have a unique configuration name. // The configuration name is a app-specific name // you use to identify the scene, and it corresponds to entries // in the `Info.plist` scene manifest. var configurationName: String! switch options.userActivities.first?.activityType { case UserActivity.GalleryOpenInspectorActivityType: // Create a photo inspector window scene. configurationName = "Inspector Configuration" default: // Create a default gallery window scene. configurationName = "Default Configuration" } return UISceneConfiguration( name: configurationName, sessionRole: connectingSceneSession.role ) } }
3. И запилить метод willConnectTo:
import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene( _ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions ) { // Confirm the scene is a window scene in iOS or iPadOS. guard let windowScene = scene as? UIWindowScene else { return } window = UIWindow(windowScene: windowScene) window?.rootViewController = YourRootViewController() window?.makeKeyAndVisible() } }
Сама логика останется буквально той же, за небольшой поправкой, что ваш код из applicationDidBecomeActive(_:) надо перенести в sceneDidBecomeActive(_:), и так далее. Целиком разбор и советы от Apple можно посмотреть здесь (в TN3187). 😃 iOS Dev

iOS Dev
7 880
Реализация шейдера с события Apple 9 сентября (Metal + SwiftUI) Признаюсь, в этот раз было непросто, сначала думать идти через путь svg-path для яблока + последующая работа с кривыми, но в итоге остановился на чистой математике с отрисовкой в коде. Также добавил эффект затухания в зависимости от временной метки и небольшой эффект морфинга с объектами. На гифке используются жесты для управления позицией и все вышеперечисленное вместе. ✅Конечно же, код уже доступен на бусти (там объясняю, как это можно реализовать у себя и настроить хоть радиус откуса 🍏, хоть эффект перехода для нашего heatmap, и на девайс можно накатить тоже, попробовать). А ещё в трибьют-боте (условия приятнее).
📖 А стартовые посты для изучения Metal: вот этот, этот и этот. А вот тут, например, можно чекнуть как реализовать хитмап на шейдертое, без затухания и без временных меток, но как стартовая точка вполне подойдёт.
😃 iOS Dev

iOS Dev
7 880
Как проверить, сколько памяти доступно приложению (и как увеличить этот лимит) Пока все ищут способы снизить потребление памя
Как проверить, сколько памяти доступно приложению (и как увеличить этот лимит) Пока все ищут способы снизить потребление памяти и оптимизируют приложение, вкручивая более производительные алгоритмы, тем временем Apple с 15 iOS добавили специальный entitlement. С помощью этого разрешения можно сообщить, что некоторые основные фичи приложения могут работать лучше, если превысить стандартный лимит памяти приложения на поддерживаемых устройствах. Кто-то его использовал? 📖 Кстати, чтобы проверить, сколько вообще доступно - можно чекнуть метод os_proc_available_memory (предварительно импортнув os). 😃 iOS Dev

iOS Dev
7 880
Главный софтскилл Прав ли тот, кто кричит громче всех? С моей точки зрения, при обсуждении задач главное не доказать свою пра
Главный софтскилл Прав ли тот, кто кричит громче всех? С моей точки зрения, при обсуждении задач главное не доказать свою правоту, а найти общую истину. Если в коллективе будет понимание этого принципа, то продукт будет развиваться, а коллективная эмпатия, если такой термин существует - будет только расти. Часто в больших коллективах встречаются истории, когда два человека, а иногда и больше - настаивают только на своей точке зрения, будто бы она единственно верная, игнорируя доводы и конструктив. Похожие истории могут встречаться не только в IT, но и в любых дебатах (политических, культурных, да и любых других тоже). Отличие тех же каналов в телеге (или, например, хабра) от иных ресурсов, что многие авторы в СНГ своей путеводной звездой считают принизить остальных, найти проблемы, указать на ошибки (даже если их нет). Эту историю легко спроецировать и на обсуждения внутри коллективов, внутри вашей компании или стартапа. При реализации каких-то крутых анимаций или забавных эффектов я всегда поддержу автора, потому что выйти из плоскости, найти необычное применение, понять как можно прокачать привычные вещи - не менее важно, чем наличие технической базы.
Навык общения не менее, а иногда и более важен, чем все ваши знания вместе взятые.
😃 iOS Dev

iOS Dev
7 880
Контроль и оптимизация процесса декодирования изображений в iOS Каждый разработчик так или иначе сталкивается со сложностями
Контроль и оптимизация процесса декодирования изображений в iOS Каждый разработчик так или иначе сталкивается со сложностями при работе с изображениями. Кто-то пытается найти выход через сторонние фреймворки, но многие выбирают сложный путь и ищут подходящие API в доступных нам фреймворках. Например, на выходных я в одном из своих проектов искал путь к оптимизации генерации кадров для длинных видео (спойлер, решил через длину шага в зависимости от длительности исходного видео и качества самих thumbnails). Эффективная работа с изображениями стоит на трёх китах: на сколько мы грузим проц, эффективно ли используем оперативку и записи на устройство (кэшировании). 📖 В этой статье основное внимание уделяется использованию процессора, в частности, когда происходит фактический процесс декодирования, а также тому, в каком потоке и на каком этапе рендеринга это происходит. Кроме очевидных советов на счёт переноса тяжёлой работы с основного потока и использования превьюх, можно почитать и про CVPixelBuffer, и про полезные практики. 😃 iOS Dev

iOS Dev
7 880
База знаний iOS IQ Напомню, что у канала есть и приятное дополнение с большим количеством уникальных тем и авторских разборов
База знаний iOS IQ Напомню, что у канала есть и приятное дополнение с большим количеством уникальных тем и авторских разборов. Вы можете использовать её не только для подготовки, но и для проведения собеседований. В ней есть не только разборы фундаментальных принципов, но и современные подходы, которые упростят решение многих повседневных задач. 🤩 Ближайшие несколько дней доступ можно получить: 💰 с приятными условиями на бусти в ⭐️ в телеграме. 🧠 Что вы получите, подписавшись сегодня:
➡️Разбор нескольких сотен вопросов на сложные темы ➡️Вопросы на чтение кода ➡️Многопоточность ➡️DispatchQueue: практические вопросы ➡️Swift Concurrency ➡️Алгоритмы: терминология и примеры ➡️Память: ARC, side table, флаги, утечки ➡️Множество анимаций, шейдеров и не только
✅А также доступ к ранним релизам приложения iOS IQ, тонну теории и многое другое. P.S. Многие продукты я делаю на чистом энтузиазме и в качестве экспериментов, а бусти - это ваш способ поддержать автора и будущие разборы. Подписывайтесь (кстати, с недавних пор база доступна и в офлайне - инструкция уже есть по ссылке). 😃 iOS Dev

iOS Dev
7 880

iOS Dev
7 880
Приложение от создателей SwiftUI позволяет писать код на айфоне и шарить его в тестфлайт Bitrig создает нативные приложения S
Приложение от создателей SwiftUI позволяет писать код на айфоне и шарить его в тестфлайт Bitrig создает нативные приложения Swift через общение с AI. За считанные минуты и без знания кода (это заявление сильное, конечно) можно создать простое приложение и развернуть его в TestFlight. 🛠 Протестить можно здесь, доступно 5 запросов по умолчанию без подписки. Отличительная особенность от многих других в том, что его делают люди, которые непосредственно занимались разработкой SwiftUI в Apple, так что тут что-то может получиться. Результат запроса на написание погодного приложения на экране (а код, который получился, пошарил сюда). На мой взгляд, хайп на него спадёт (вернее, более крупные AI-решения попробуют сделать превью у себя), но сама идея пилить приложения на девайсах интересная. 😃 iOS Dev

iOS Dev
7 880
Как работать с SwiftData в фоновом режиме в Swift 6 Это может пригодиться, например, при работе с новыми LLM API (может быть
Как работать с SwiftData в фоновом режиме в Swift 6 Это может пригодиться, например, при работе с новыми LLM API (может быть множество случаев, когда мы хотим сохранить данные в существующие модели SwiftData). 📖 В этом материале можно посмотреть на пример адаптации существующего проекта (спойлер, всё не так сложно, как может показаться). А вот тут можно чекнуть паттерны и практики при работе со SwiftData в целом. 😃 iOS Dev

iOS Dev
7 880
Защита приложений для iOS: лучшие практики, инструменты и методы Безопасность - буквально важнейший аспект во многих типах пр
Защита приложений для iOS: лучшие практики, инструменты и методы Безопасность - буквально важнейший аспект во многих типах приложений (от мессенджеров до сектора здравоохранения и банковских приложений). К сожалению, периодически в СМИ всплывают истории про утечку персональные данные как вода сквозь песок. И хотя чаще причиной взлома становятся узкие места на сервере, необходимо защищать и наши клиенты от несанкционированного доступа.
Конечно, эта гонка бесконечна - на любую защиту всегда найдётся свой ключ и наоборот, но всегда есть рекомендации, которым можно и нужно следовать.
📖 В этой статье, которую написал наш читатель Сергей, знакомый вам по посту про повышение видимости приложения на устройстве, развёрнуто перечислены основные способы по защите мобильных приложений. Например, затрагивается и база про SSL pinning, и Secure Enclave, и примеры шифрования персональных данных в целом (а также популярные способы проверки на наличие джейлбрейка). На моей работе мы регулярно проходим аудит безопасности и стараемся следовать за современными тенденциями, поэтому от себя я бы добавил ещё и эту статью: 🔗 OWASP Mobile Application Security (хотя она скорее всего и так в избранном у команд сбера и не только). 📖 И этот небольшой пример также может оказаться полезен. А в закрытой базе уже есть специальный раздел, посвященный безопасности, аудиту и защите приложения от несанкционированного доступа. ✅Чтобы подписаться, загляните сюда (или можно прямо тут). 😃 iOS Dev

iOS Dev
7 880
С помощью чего вы работаете с Git?
Anonymous voting

iOS Dev
7 880
Разработчики на Objective-С получают самую высокую зарплату в России На Хабр Карьере провели очередное крупное исследование (
Разработчики на Objective-С получают самую высокую зарплату в России На Хабр Карьере провели очередное крупное исследование (примерно 60 000 специалистов в выборке), и составили несколько отчётов по зарплатам за первое полугодие 2025 года. Среди интересующих нас результатов: 💰 У разработчиков на Objective-С средняя зарплата 380 000 ₽ (самая высокая в отрасли), а на Swift 292 000 ₽. Среди компаний лидеры: Авито, Райффайзен Банк, Иннотех и VK. 📖 Сравнить тенденцию изменений можно с этим постом. 😃 iOS Dev

iOS Dev
7 880
Карта изучения Swift Concurrency Последние несколько недель я активно изучал самые интересные моменты в Swift Concurrency и ч
Карта изучения Swift Concurrency Последние несколько недель я активно изучал самые интересные моменты в Swift Concurrency и чем-то делился в канале, что-то пробовал в приложениях, а определённую часть выписывал и структурировал. Пришло время первого роадмапа по изучению Swift Concurrency (постарался пошагово пройтись по самым важным концепциям и доступно разложить по полочкам самое интересное). В канале уже есть и пример глоссария и разбор доступных нам инструментов в изложении Emerge Tools. Но я люблю разбираться в сложных темах, а декомпозиция помогает не только в решении задач, но и в разборах таких вещей. 🔗 Файл в большом разрешении в .pdf доступен всем желающим в моём бусти (достаточно просто подписаться даже на бесплатный уровень). 🧠 А в закрытой базе можно получить доступ к разборам каждой секции и пройтись по каждому этапу:
🔘 С чего начать (основны многопоточности, существующие проблемы GCD и нужен ли переход на Swift Concurrency). 🔘 Синтаксис async/await, обработка ошибок, применение @MainActor. 🔘 Tasks (что это, как работать, как отменять и для чего нужен detached). 🔘 Sendable, потокобезопасность на практике. 🔘 AsyncStream и разбор на реальных примерах. 🔘 Работа в реальных проекта (тестирование, отладка и способы избежать ошибок).
И это далеко не всё. ✅ Получите доступ к этому разбору и не только на бусти и прямо здесь уже сегодня. 😃 iOS Dev

iOS Dev
7 880
Огромный обзорный пост по всем изменениям UIKit в iOS 26 Ремарка - несколько месяцев назад целый ряд крупных ресурсов про iOS
Огромный обзорный пост по всем изменениям UIKit в iOS 26 Ремарка - несколько месяцев назад целый ряд крупных ресурсов про iOS сообщали о том, что UIKit (и UIApplicationDelegate, в частности) депрекейтнут, но как обычно без какого-либо подкрепления фактов. С тех пор прошла WWDC, и на практике всё совсем не так, в ближайшем времени фреймворк нам ещё пригодится. Сегодня делюсь чудесным разбором от Себа Видаля, который он писал несколько последних недель (поблагодарить его можно здесь). В нашем канале уже есть несколько примеров по важным изменениям во фреймворке (и в экосистеме в целом), но этот пост просто невероятен по объёму и количеству примеров. 📖 В этом посте можно познакомиться и с UIBackgroundExtensionView, и с UICornerConfiguration (шок, что этого не было ранее и я, например, писал кастомное решение с UIBezierPath для большинства проектов). Также есть изменения и в UIResponder, и в UIScrollView, и во многом другом. 🔗 Сохраните пост в закладки (релиз новой оси совсем скоро). 😃 iOS Dev

iOS Dev
7 880
Global actor в Swift Concurrency на реальных примерах ℹ️ Swift Concurrency ввел концепцию глобального актора среди async/awai
Global actor в Swift Concurrency на реальных примерах ℹ️ Swift Concurrency ввел концепцию глобального актора среди async/await и задач. Наиболее распространенным из них, вероятно, является @MainActor, про который можно почитать здесь и вот тут. Однако нам доступна возможность создавать и собственные глобальные акторы. Глобальный актор обеспечивает ту же изоляцию актора (безопасный, сериализованный доступ к данным), но есть и разница: вместо привязки к одному экземпляру он привязан к чему-то более широкому, например, к функции, свойству или даже целому типу. 📖 А о том, как его использовать (и как не допустить ошибок) можно прочитать в этой статье. 😃 iOS Dev

iOS Dev
7 880
Реализация мема: @escaping @Sendable @MainActor @autoclosure () async -> Void Каждый раз, когда мы встречаем сложные термины,
Реализация мема: @escaping @Sendable @MainActor @autoclosure () async -> Void Каждый раз, когда мы встречаем сложные термины, может казаться - что это поймут не только лишь все, но с помощью разбора теории и пары практических примеров почти всегда изначальная сложность исчезает или хотя бы кратно уменьшается. 📖 Статья Джейкоба Бартлетта посвящена реализации мема, который изначально заставил автора почувствовать синдром самозванца. В ней последовательно разбираются атрибуты от escaping до MainActor, и в итоге Джейкоб приходит к варианту:
Task { await allTheAttributes(await helloWorld()) } func allTheAttributes( _ then: @escaping @Sendable @MainActor @autoclosure () async -> Void ) async { Task { await then() } } @MainActor func helloWorld() { print("Hello, world!") }
😅 Как говорится, не пробуйте это дома (или на продакшне без должных навыков). Кстати, напомню, что в канале был пост с огромным глоссарием по Swift Concurrency. ✅ А вот тут есть примеры тем, вопросов - и несколько разборов подводных камней в Swift Concurrency. 😃 iOS Dev