Telegram Web Link
Главный софтскилл

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

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

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

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

Похожие истории могут встречаться не только в 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🔥2217❤‍🔥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🔥3212❤‍🔥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❤‍🔥15👍128🔥43🍓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🔥37🤯1810👍6🆒331🎉1💯1🏆1
This media is not supported in your browser
VIEW IN TELEGRAM
5😁46🤣23🔥6🫡42👍1🤩1🤝11
Что там по Swift Concurrency да и вообще по целям?

Или как говорится, у меня была какая-то практика, и я её придерживался.

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

Кстати, совсем скоро выйдет и новая версия приложения, которое в бете уже месяц.

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

🤖 Ботом воспользовалось уже около тысячи человек, и вот первые выводы.

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

Подпишитесь 💰 на бусти и ⭐️ прямо здесь и получите доступ к эсклюзивному и качественному контенту.

С вас подписка по специальному офферу - с меня все нижеперечисленное (и даже больше).

Что можно получить сегодня?
➡️Несколько десятков пройденных алгоритмических задач с боевых конкурсов.
➡️Вопросы на чтение кода
➡️Многопоточность
➡️DispatchQueue: практические вопросы (две части)
➡️Swift Concurrency
➡️Память: ARC, side table, флаги, утечки
➡️UIKit (теория + практика, две части)
➡️Компилятор Swift
➡️Основы: URLSession, UICollectionView и многое другое.

А также:
➡️Множество необычных подходов к анимации (включая шейдеры).
➡️Разбор популярных архитектур (и их недостатков).
➡️Несколько кайфовых и интересных фактов об истории прототипирования в Apple.
➡️Как на самом деле работает Code Signing.
➡️Несколько трюков и фишек при работе c Xcode.


😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1116🔥12👏6👍3🍓21
SwiftUI WebView: настройка, навигация, кастомные схемы

На WWDC 2025 был анонсирован WebView для SwiftUI, но код из видео не работал, более того, он даже не компилился.

📖 В этой статье можно посмотреть на основные аспекты работы, пример навигации и работу с JavaScript-функциями.

🛠 Код проекта доступен и на GitHub.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥1814👍84👏2💯1🏆1🤝1
Что нового в Swift 6.2 (помимо обновлений, связанных с параллелизмом)

📺 Неплохой разбор нововведений, которые появятся в iOS 26 и Xcode 26.

И хотя основное внимание все уделяют concurrency, есть и много других фич, о которых можно узнать.

Среди разобранных пропозалов:

➡️ Default Value in String Interpolations
➡️ Raw identifiers
➡️ Collection conformances for enumerated()
➡️ InlineArray, a fixed-size array
➡️ InlineArray Type Sugar
➡️ Integer Generic Parameters
➡️ Span: Safe Access to Contiguous Storage

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
512👍8🔥7❤‍🔥3👏2🎉1🏆1
Быть инженером

Прочитал кайфовую историю, как Вадим интегрировал себе PassKit за несколько часов разработки, чтобы вместо 47 секунд тратить 3 на вход в тренажёрку 💪

Разве не в этом смысл быть разработчиком вообще? Упрощать жизнь, делать привычные действия быстрее или вообще автоматизированными.

В своём приложении Starly я также бился с возможностью упрощения и экономии личного времени. У меня сейчас порядка 20 пет-проектов, из которых я поддерживаю около 7. И представьте, что в каждом по 15 локализаций. Сколько времени надо на переводы?

Ну по классике: прикрутил SDK для работы с AppStore Connect, лупанул туда движок DeepL (и есть ещё кое-какой хак, как в телеге). Хотя можно подумать сейчас и над чем-то более весёлым в современных реалиях)

Так вот, вместо 1.5 часов просто на то, чтобы вбить переводы, я трачу около 2 минут - пишу текст обновления на русском или английском, а алгоритм под капотом делает всё остальное за меня.

Или вот надо было зарефакторить большой проект (всё еще надо) - сделал себе подсчёт строк в каждом файле, чтобы понять, с чего вообще начать.

А ещё когда-то пилил скрипт на питоне, чтобы спарсить все оценки с кинопоиска и перенести на letterboxd автоматически (киноманы поймут, о чём речь, когда у вас просмотренных тысяча фильмов). Думал даже выложить его в открытый доступ, но решил, что слишком маленькая аудитория.

А что для вас быть инженером? Используете ли вы свои навыки вне работы?

Может у вас есть пет-проект, о котором вы бы хотели рассказать - поделитесь!

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
419❤‍🔥12🔥9👍62👏1👌1🍓11
This media is not supported in your browser
VIEW IN TELEGRAM
🚪 Превращаем макбук в скрипящую дверь с помощью датчика наклона (есть звук)

Оказывается, есть специальное (непубличное API), доступное аж с 2019. Впервые появилось в 16-дюймовом макбук про и если ваш ноут более новый, то оно скорее всего также доступно.

📖 В этой репе можно посмотреть на пример тестового проекта.

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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥6615👍115🤩4🍓2😎2🤝1
Что изменилось в работе со строками в Swift 6.2

Если раньше для опционального значения и использования в коде ниже было предупреждение String interpolation produces a debug description for an optional value; did you mean to make this explicit?:

let age: Int? = nil
print("Your age: \(age)")


И компилятор предлагал юзать String(describing:), чтобы избавиться от ворнинга, то теперь все стало проще.

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

let age: Int? = nil
print("Your age: \(age, default: "missing")")
// Prints "Your age: missing"


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

Расширенный список принятых пропозалов - в этом посте.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥3315👍9💯83❤‍🔥1👌1
iOS-разработчики получают самую высокую зарплату в России согласно исследованию хабра. Так ли это на самом деле?

Я проверил это с помощью масштабного опроса и поделился выводами.

Кроме аналитики, есть и сравнение с реальными европейскими зарплатами в нашей и смежных сферах, а также отслеживание динамики изменений.

Подпишитесь, чтобы посмотреть результаты на бусти и в телеграме (действует специальное предложение).

🧠 А ещё вы сможете получить:

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


😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
1218👍9🤯5🔥4💯3❤‍🔥2👏21🍓11
685🤯4👍2🔥2💯2🍓2
Утечки памяти в Swift: что с ними делать, как предотвратить?

Возможно, одна из самых неприятных, но в то же время часто встречающихся в практике историй - поиск утечек памяти.

Даже у нас на проекте сейчас одна из тасок - поиск вещей, связанных с экранами звонков и лайвкитом, в частности.

Кроме классических вариантов с циклическими ссылками (когда у нас есть дочерний контроллер, который хранит ссылку на своего владельца/родителя), может быть куча других проблем: от казалось бы очевидных вещей с таймерами до замыканий и делегатов.

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

Есть несколько полезных задач на подумать: при работе с сетью, что не так с NotificationCenter и многое другое.

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

А пока можно вспомнить и про эти истории:

📖 Утечка памяти: детектив в Xcode
📖 Как автоматически обнаруживать утечки памяти с помощью UI-тестов
📖 Управление памятью в Swift

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
616🔥65👍2👏2❤‍🔥1💯1🏆1🍓1
This media is not supported in your browser
VIEW IN TELEGRAM
Пошаговая визуализация алгоритма LLM, лежащего в основе ChatGPT

В канале пару месяцев назад я уже выкладывал шикарный материал от FT (можно посмотреть, что вообще значат токены, как LLM работает с контекстом, и посмотреть на ключевые концепции).

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

📖 Можно посмотреть на большое интерактивное руководство о том, как работает GPT под капотом. В частности, рассматривают модель nano-gpt, имеющую всего 85 000 параметров.

На каждом шаге рассматривается, что происходит внутри, когда ставят простую задачу:

Отсортировать по алфавиту входящую последовательность CBABBC в алфавитном порядке, чтобы на выходе получить ABBBCC.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
7208🤯5🔥4❤‍🔥3👍3💯22
Анатомия работы с записью видео в iOS

Работа с AVFoundation не относится к тем вещам, по которым достаточно посмотреть на доки и просто собрать всё воедино.

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

📖 В этой статье разбирается несколько неочевидных моментов и что не так с примерами кода от Apple.

➡️Также можно чекнуть официальный пример от Apple и скачать исходный код.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
917🔥9👍5❤‍🔥3💯21🤯1🤝1
Сегодня выходит iOS 26 - что можно обновить в рабочих проектах?

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

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

Xcode

➡️ Все изменения Xcode 26 RC
➡️ Автогенерация Playground
➡️ Сессия на WWDC об изменениях в Xcode 26
➡️ Разбор двух фич в новом Xcode: установка global actor isolation в MainActor.self, включение Approachable concurrency.

Swift

➡️ Обзорный пост по WWDC25 (Swift, Память, Инструменты)
➡️ Изучение изменений concurrency в Swift 6.2
➡️ Использование памяти в Swift 6.2 и возможности для повышения производительности
➡️ Что нового в Swift 6.2 (помимо обновлений, связанных с параллелизмом)
➡️ Что изменилось в работе со строками в Swift 6.2
➡️ Default Actor Isolation in Swift 6.2

Стоит обратить внимание

➡️ Карта изучения Swift Concurrency
➡️ Как мигрировать UIKit-интерфейс на scene-based в iOS
➡️ Огромный обзорный пост по всем изменениям UIKit в iOS 26
➡️ Global actor в Swift Concurrency на реальных примерах
➡️ Все новые фреймворки iOS 26

Когда шутка зашла слишком далеко

➡️ Реализация мема: @escaping @Sendable @MainActor @autoclosure () async -> Void

Ах да, пора ли переходить на Swift 6 в 2025 году?

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
32247💯7❤‍🔥4👍3🔥1🏆1
2025/09/16 07:22:44
Back to Top
HTML Embed Code: