iOS Dev
7.8K subscribers
1.03K photos
92 videos
1 file
1.21K links
👨‍💻Автор: Виктор Грушевский (@Viktorianec)

⚒️ База: https://boosty.to/ios_dev | 🤖 @iOSIQBot | https://iosiq.ru

🍏Канал об iOS-разработке, алгоритмах и архитектурах

⭐️ Подготовка к собесам

⭐️ Код. Много кода.

#ios #mobile #swift
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Путешествие в космосе - новый шейдер на Metal + SwiftUI

🧠 Первое, что видят пользователи в iOS IQ - одну из вариаций гиперпространства, нативно реализованного на Swift.

Но, как известно, технологии постоянно идут вперёд, а мы вместе с ними.

🚀 Хочу поделиться с вами тем, что получилось (результат на гифке).

Для получения доступа к исходному коду, примерам многому другому загляните сюда (или можно прямо вот тут).

Ещё примеры:

🔗 Warp-эффект на metal-шейдере
🔗 Beauty infinite loop
🔗 Огненный шейдер
🔗 Люминофор


Ах да, ещё там множество сложных тем от алгоритмов до решения проблем с производительностью.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥1913🤩5🏆4🆒33👍2❤‍🔥1🤝1
Реализация мема: @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
Please open Telegram to view this post
VIEW IN TELEGRAM
1020🔥12👍9🤯32👏2
Global actor в Swift Concurrency на реальных примерах

ℹ️ Swift Concurrency ввел концепцию глобального актора среди async/await и задач.

Наиболее распространенным из них, вероятно, является @MainActor, про который можно почитать здесь и вот тут.

Однако нам доступна возможность создавать и собственные глобальные акторы.

Глобальный актор обеспечивает ту же изоляцию актора (безопасный, сериализованный доступ к данным), но есть и разница: вместо привязки к одному экземпляру он привязан к чему-то более широкому, например, к функции, свойству или даже целому типу.

📖 А о том, как его использовать (и как не допустить ошибок) можно прочитать в этой статье.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
811🔥105👍4❤‍🔥1🆒1
Огромный обзорный пост по всем изменениям UIKit в iOS 26

Ремарка - несколько месяцев назад целый ряд крупных ресурсов про iOS сообщали о том, что UIKit (и UIApplicationDelegate, в частности) депрекейтнут, но как обычно без какого-либо подкрепления фактов.

С тех пор прошла WWDC, и на практике всё совсем не так, в ближайшем времени фреймворк нам ещё пригодится.

Сегодня делюсь чудесным разбором от Себа Видаля, который он писал несколько последних недель (поблагодарить его можно здесь).

В нашем канале уже есть несколько примеров по важным изменениям во фреймворке (и в экосистеме в целом), но этот пост просто невероятен по объёму и количеству примеров.

📖 В этом посте можно познакомиться и с UIBackgroundExtensionView, и с UICornerConfiguration (шок, что этого не было ранее и я, например, писал кастомное решение с UIBezierPath для большинства проектов). Также есть изменения и в UIResponder, и в UIScrollView, и во многом другом.

🔗 Сохраните пост в закладки (релиз новой оси совсем скоро).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥1411👍9❤‍🔥2👏21🍓1
Карта изучения Swift Concurrency

Последние несколько недель я активно изучал самые интересные моменты в Swift Concurrency и чем-то делился в канале, что-то пробовал в приложениях, а определённую часть выписывал и структурировал.

Пришло время первого роадмапа по изучению Swift Concurrency (постарался пошагово пройтись по самым важным концепциям и доступно разложить по полочкам самое интересное).

В канале уже есть и пример глоссария и разбор доступных нам инструментов в изложении Emerge Tools.

Но я люблю разбираться в сложных темах, а декомпозиция помогает не только в решении задач, но и в разборах таких вещей.

🔗 Файл в большом разрешении в .pdf доступен всем желающим в моём бусти (достаточно просто подписаться даже на бесплатный уровень).

🧠 А в закрытой базе можно получить доступ к разборам каждой секции и пройтись по каждому этапу:

🔘 С чего начать (основны многопоточности, существующие проблемы GCD и нужен ли переход на Swift Concurrency).
🔘 Синтаксис async/await, обработка ошибок, применение @MainActor.
🔘 Tasks (что это, как работать, как отменять и для чего нужен detached).
🔘 Sendable, потокобезопасность на практике.
🔘 AsyncStream и разбор на реальных примерах.
🔘 Работа в реальных проекта (тестирование, отладка и способы избежать ошибок).


И это далеко не всё.

Получите доступ к этому разбору и не только на бусти и прямо здесь уже сегодня.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
616❤‍🔥95💯5👍33🔥1🎉1
Разработчики на Objective-С получают самую высокую зарплату в России

На Хабр Карьере провели очередное крупное исследование (примерно 60 000 специалистов в выборке), и составили несколько отчётов по зарплатам за первое полугодие 2025 года.

Среди интересующих нас результатов:

💰 У разработчиков на Objective-С средняя зарплата 380 000 ₽ (самая высокая в отрасли), а на Swift 292 000 ₽.

Среди компаний лидеры: Авито, Райффайзен Банк, Иннотех и VK.

📖 Сравнить тенденцию изменений можно с этим постом.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
920🔥9👏7👍432❤‍🔥2💯2
4106❤‍🔥43👍2😎2🔥1🎉1💯1🏆1
Защита приложений для iOS: лучшие практики, инструменты и методы

Безопасность - буквально важнейший аспект во многих типах приложений (от мессенджеров до сектора здравоохранения и банковских приложений). К сожалению, периодически в СМИ всплывают истории про утечку персональные данные как вода сквозь песок. И хотя чаще причиной взлома становятся узкие места на сервере, необходимо защищать и наши клиенты от несанкционированного доступа.

Конечно, эта гонка бесконечна - на любую защиту всегда найдётся свой ключ и наоборот, но всегда есть рекомендации, которым можно и нужно следовать.


📖 В этой статье, которую написал наш читатель Сергей, знакомый вам по посту про повышение видимости приложения на устройстве, развёрнуто перечислены основные способы по защите мобильных приложений.

Например, затрагивается и база про SSL pinning, и Secure Enclave, и примеры шифрования персональных данных в целом (а также популярные способы проверки на наличие джейлбрейка).

На моей работе мы регулярно проходим аудит безопасности и стараемся следовать за современными тенденциями, поэтому от себя я бы добавил ещё и эту статью:

🔗 OWASP Mobile Application Security (хотя она скорее всего и так в избранном у команд сбера и не только).

📖 И этот небольшой пример также может оказаться полезен.

А в закрытой базе уже есть специальный раздел, посвященный безопасности, аудиту и защите приложения от несанкционированного доступа.

Чтобы подписаться, загляните сюда (или можно прямо тут).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
815👍13❤‍🔥63🔥2💯1
Как работать с SwiftData в фоновом режиме в Swift 6

Это может пригодиться, например, при работе с новыми LLM API (может быть множество случаев, когда мы хотим сохранить данные в существующие модели SwiftData).

📖 В этом материале можно посмотреть на пример адаптации существующего проекта (спойлер, всё не так сложно, как может показаться).

А вот тут можно чекнуть паттерны и практики при работе со SwiftData в целом.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
616👍9🔥8❤‍🔥31👏1💯1
Приложение от создателей SwiftUI позволяет писать код на айфоне и шарить его в тестфлайт

Bitrig создает нативные приложения Swift через общение с AI.

За считанные минуты и без знания кода (это заявление сильное, конечно) можно создать простое приложение и развернуть его в TestFlight.

🛠 Протестить можно здесь, доступно 5 запросов по умолчанию без подписки.

Отличительная особенность от многих других в том, что его делают люди, которые непосредственно занимались разработкой SwiftUI в Apple, так что тут что-то может получиться.

Результат запроса на написание погодного приложения на экране (а код, который получился, пошарил сюда).

На мой взгляд, хайп на него спадёт (вернее, более крупные AI-решения попробуют сделать превью у себя), но сама идея пилить приложения на девайсах интересная.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
813🔥75👍21❤‍🔥1🎉1
База знаний iOS IQ

Напомню, что у канала есть и приятное дополнение с большим количеством уникальных тем и авторских разборов.

Вы можете использовать её не только для подготовки, но и для проведения собеседований.

В ней есть не только разборы фундаментальных принципов, но и современные подходы, которые упростят решение многих повседневных задач.

🤩 Ближайшие несколько дней доступ можно получить:

💰 с приятными условиями на бусти

в ⭐️ в телеграме.

🧠 Что вы получите, подписавшись сегодня:
➡️Разбор нескольких сотен вопросов на сложные темы
➡️Вопросы на чтение кода
➡️Многопоточность
➡️DispatchQueue: практические вопросы
➡️Swift Concurrency
➡️Алгоритмы: терминология и примеры
➡️Память: ARC, side table, флаги, утечки
➡️Множество анимаций, шейдеров и не только


А также доступ к ранним релизам приложения iOS IQ, тонну теории и многое другое.

P.S. Многие продукты я делаю на чистом энтузиазме и в качестве экспериментов, а бусти - это ваш способ поддержать автора и будущие разборы.

Подписывайтесь (кстати, с недавних пор база доступна и в офлайне - инструкция уже есть по ссылке).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
512❤‍🔥774👍2🔥2💯1🏆1
Контроль и оптимизация процесса декодирования изображений в iOS

Каждый разработчик так или иначе сталкивается со сложностями при работе с изображениями. Кто-то пытается найти выход через сторонние фреймворки, но многие выбирают сложный путь и ищут подходящие API в доступных нам фреймворках.

Например, на выходных я в одном из своих проектов искал путь к оптимизации генерации кадров для длинных видео (спойлер, решил через длину шага в зависимости от длительности исходного видео и качества самих thumbnails).

Эффективная работа с изображениями стоит на трёх китах: на сколько мы грузим проц, эффективно ли используем оперативку и записи на устройство (кэшировании).

📖 В этой статье основное внимание уделяется использованию процессора, в частности, когда происходит фактический процесс декодирования, а также тому, в каком потоке и на каком этапе рендеринга это происходит.

Кроме очевидных советов на счёт переноса тяжёлой работы с основного потока и использования превьюх, можно почитать и про CVPixelBuffer, и про полезные практики.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
915🔥12🤯8👍4❤‍🔥2💯2
Главный софтскилл

Прав ли тот, кто кричит громче всех?

С моей точки зрения, при обсуждении задач главное не доказать свою правоту, а найти общую истину.

Если в коллективе будет понимание этого принципа, то продукт будет развиваться, а коллективная эмпатия, если такой термин существует - будет только расти.

Часто в больших коллективах встречаются истории, когда два человека, а иногда и больше - настаивают только на своей точке зрения, будто бы она единственно верная, игнорируя доводы и конструктив.

Похожие истории могут встречаться не только в IT, но и в любых дебатах (политических, культурных, да и любых других тоже).

Отличие тех же каналов в телеге (или, например, хабра) от иных ресурсов, что многие авторы в СНГ своей путеводной звездой считают принизить остальных, найти проблемы, указать на ошибки (даже если их нет). Эту историю легко спроецировать и на обсуждения внутри коллективов, внутри вашей компании или стартапа.

При реализации каких-то крутых анимаций или забавных эффектов я всегда поддержу автора, потому что выйти из плоскости, найти необычное применение, понять как можно прокачать привычные вещи - не менее важно, чем наличие технической базы.

Навык общения не менее, а иногда и более важен, чем все ваши знания вместе взятые.


😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
12❤‍🔥25🔥13💯12👍431🏆1😎11
Как проверить, сколько памяти доступно приложению (и как увеличить этот лимит)

Пока все ищут способы снизить потребление памяти и оптимизируют приложение, вкручивая более производительные алгоритмы, тем временем Apple с 15 iOS добавили специальный entitlement.

С помощью этого разрешения можно сообщить, что некоторые основные фичи приложения могут работать лучше, если превысить стандартный лимит памяти приложения на поддерживаемых устройствах.

Кто-то его использовал?

📖 Кстати, чтобы проверить, сколько вообще доступно - можно чекнуть метод os_proc_available_memory (предварительно импортнув os).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥2011🤯72👍21🫡1
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация шейдера с события Apple 9 сентября (Metal + SwiftUI)

Признаюсь, в этот раз было непросто, сначала думать идти через путь svg-path для яблока + последующая работа с кривыми, но в итоге остановился на чистой математике с отрисовкой в коде.

Также добавил эффект затухания в зависимости от временной метки и небольшой эффект морфинга с объектами.

На гифке используются жесты для управления позицией и все вышеперечисленное вместе.

Конечно же, код уже доступен на бусти (там объясняю, как это можно реализовать у себя и настроить хоть радиус откуса 🍏, хоть эффект перехода для нашего heatmap, и на девайс можно накатить тоже, попробовать).

А ещё в трибьют-боте (условия приятнее).

📖 А стартовые посты для изучения Metal: вот этот, этот и этот.

А вот тут, например, можно чекнуть как реализовать хитмап на шейдертое, без затухания и без временных меток, но как стартовая точка вполне подойдёт.



😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥2216❤‍🔥1032👍2🤩2💯2
Как мигрировать 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
Please open Telegram to view this post
VIEW IN TELEGRAM
824💯9👏6🔥52❤‍🔥22👍1🤯1🫡1
🍾 Бот для проверки знаний по iOS и подготовке к собеседованиям

У меня отличная новость! Открываю бета-тестирование бота по iOS.

Есть несколько режимов, бесконечный и режим собеса. И реализована таблица лидеров (не переживайте, ваши результаты для всех анонимны).

Реализовал на firestore+cloud functions+telegram bot api на node.js.

Сейчас крутится один инстанс, посмотрю как будет по нагрузке в дальнейшем.

🤖 Запустить и проверить себя можно здесь: @iOSIQBot

Для трибьюта и телеги я реализовал кроссчек подписок (бусти по чату) и выкатил бонусный премиум-режим.

Не забудьте подписаться и вы 💰 с приятными условиями на бусти в ⭐️ в телеграме.

Ах да, специальный бонус тому, кто наберёт больше всех очков в конце недели: будет пасхалка от меня в буквальном смысле.

🎁 Поддержать разработку.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥3112❤‍🔥10👍62
Four Corners: первая игра, целиком написанная на Swift для Playdate

В канале я часто пишу про необычные решения, а ещё немного коллекционирую самые разные игровые приставки (ха-ха, про это можно было даже написать в посте про Японию).

Например, из последней поездки притащил Game Boy Micro Anniversary Edition, пусть и немного потрёпанную временем).

Одна из приставок в коллекции - Playdate (и она как раз на фотке к этому посту).

И для неё с недавних пор можно писать на Swift!

Нашёл интересное интервью со Стивеном Чипманом, который рассказал о плюсах о всей боли, которая сопутствовало процессу переписывания приложения с Lua.

Например, недоступен Foundation, а ещё нет Codable, что превратило работу с JSON в нетривиальный таск.

Особое внимание пришлось на процесс отладки. Например, в рантайме если приложение крашится - то мы не можем даже получить стектрейс.

📖 В общем, рекомендую почитать, особенно если вам интересен и embedded swift, в частности.

📺 А тут можно посмотреть и доклад на тему.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
15❤‍🔥13👍107🔥33🍓2
This media is not supported in your browser
VIEW IN TELEGRAM
А вы знали, что системный UIDatePicker (даже в напоминаниях и часах) - на самом деле не бесконечная лента?

Иногда в работе всем приходится решать баги, прилетающие от отдела QA, которые встречаются у пары пользователей или при определённой фазе Луны.

Что делает в таком случае Apple?

Ответ - решают проблемы остальных 99.99% пользователей.

Да и вообще это что, в первый раз?

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥34🤯119👍6🆒331🎉1💯1🏆1