iOS Dev
Open in Telegram
👨💻Автор: Виктор Грушевский (@Viktorianec) ⚒️ База: https://boosty.to/ios_dev | 🤖 @iOSIQBot | https://iosiq.ru 🍏Канал об iOS-разработке, алгоритмах и архитектурах ⭐️ Подготовка к собесам ⭐️ Код. Много кода. #ios #mobile #swift
Show more8 000
Subscribers
-124 hours
+467 days
+7930 days
Posts Archive
8 001
Performance Trace Profiles: отладка проблем производительности, которые сложно воспроизвести
Одна из самых сложных частей нашей работы — поиск багов, которые встречаются у единичных пользователей, но команда разработчиков не может их повторить.
Среди них: фризы пользовательского интерфейса, проблемы с многопоточностью/параллелизм, проблемы ЦП/памяти и так далее.
Как следует из названия,
Performance Trace Profiles предоставляют возможности отслеживания производительности вашего устройства.
Более того, с их помощью можно запускать системную трассировку всего, что в данный момент работает на телефоне, которую вы можете позже извлечь и открыть в «Инструментах».
📖 В этом материале рассматриваются нужные шаги для работы с профилями, инструкция для анализа и несколько советов.
Но будьте осторожны, ведь трассировка будет фиксировать и избыточную информацию.
😃 iOS Dev8 001
О чистоте кода и японских урнах
Даже плохой код может работать. Но с течением времени скорость разработки начнет снижаться и в какой-то момент может потребоваться активизация огромных ресурсов для того, чтобы все это починить и вернуться к нормальным темпам.
🇯🇵 Находясь в Японии, многие туристы обратят внимание на невероятную чистоту, а еще на практически полное отсутствие урн на улицах и это неспроста.
Дело в том, что с ранних лет японцев учат воспринимать уборку не как наказание, а скорее как некую игру для формирования привычек.
☕️ Например, в «Книге о чае» Окакуры Какузо, классическом труде о чайной церемонии есть такая цитата «…всё абсолютно чисто. Ни пылинки в самом темном углу. Потому что если найти пылинку, то хозяин — не чайный мастер».
В нашей разработке также стоит учитывать чистоту кода, и не стоит недооценивать правило трех.
Но не нужно слишком рьяно относиться к этому, так как в гонке за бесконечными улучшениями кода бизнес не будет ждать. Поэтому как и в чайной церемонии, в разработке должен быть баланс.
А куда будет склоняться чаша весов, можно определить в будущих спринтах.
😃 iOS Dev
8 001
Реализация эффекта адаптивного блюра
Многие пользователи iOS обращали внимание на необычный стиль блюра на системной шторке.
Оказывается, его можно повторить с помощью приватного апи, используя
CAFilter.
🛠Janum Trivedi, автор опенсорсного Wave, поделился тонкостями реализации в своем репозитории.
В комментариях к посту заметили, что это можно сделать и комбинацией SceneKit + Metal, и с помощью visual effect view.
Кстати, в своей реализации я использовал маску для градиентного блюра.
😃 iOS Dev8 001
Как связаны все репозитории об iOS-разработке на Github
Оказывается, пользователь с ником @anvaka задумался об этом и создал интерактивную карту.
На ней представлен целый остров под названием Swiftoria, на котором можно найти все репозитории, относящиеся к iOS, а еще кроме этого можно посмотреть на их взаимосвязи.
📖 Об идее и используемых технологиях для создания можно прочесть здесь.
🌐 А вот тут доступна интерактивная версия.
😃 iOS Dev
8 001
Необычный способ найти причину проблемы из-за нехватки свободного места на девайсе
Пока я нахожусь в отпуске (и делаю очень много фотографий), задумался над тем, как корректно обработать ситуации, когда на айфоне уже не остаётся доступного пространства и что с этим можно сделать при работе над мессенджером или каким-нибудь редактором.
Оказывается, эту проблему можно воспроизвести и на симуляторе.
Для этого нужно:
1️⃣ Обратиться к hdutil
hdiutil create -size 1m -fs HFS+ /tmp/app-storage-test.dmg
2️⃣ Использовать созданный образ для симулятора, предварительно получив адрес documentsdirectory.
hdiutil attach /tmp/app-storage-test.dmg -mountpoint “полученный путь”
3️⃣ Добавить контент как обычно.
4️⃣ После выявления проблемного кейса удалить тестовый образ, используя команду для получения списка
diskutil list.
И избавиться от него с помощью hdiutil detach.
🔗 Хороший разбор сценария целиком доступен тут.
😃 iOS Dev8 001
🎈Сегодня мой День Рождения
В нашей жизни каждый день приходится решать задачи разной степени важности.
Когда-то, только попав в школу, в своем родном поселке я ждал после уроков, чтобы в единственном компьютерном классе в радиусе 10 км попросить запустить Dune 2000, чтобы посмотреть на этот дивный новый мир! Получалось далеко не всегда, но до своего домашнего пк было очень далеко.
Вообще у всех разный старт. И когда говорят, что Билл Гейтс бросил универ и стал миллиардером, уделите внимание его родителям: известному адвокату и члену совета директоров банка. Ах да, его дед был главной нацбанка США, но это мелочи.
Для меня же образование было единственным способом пробиться куда-то, поэтому я до сих пор продолжаю учиться, и одно из следствий этого – канал, который вы читаете.
Возвращаясь к истории с дюной, намного проще было собраться и поиграть в квадрат где-нибудь рядом. Кто-то сейчас знает, что это?
Прошло много времени и сейчас среди рабочих тасок управление многопоточкой, шифрованием, анимациями и поддержание всего этого в нормальном состоянии. Для меня кажется обыденным постоянно быть на связи и решать что-то в срочном порядке, например, проблемы с эпловским ревью.
Но знаете, через 10-20 лет о наших переработках будут помнить только близкие люди. А о рабочих подвигах только мы (возможно).
Я не очень люблю отмечать день рождения. Для меня важнее не символическая дата, а то, что мы можем сказать о своих поступках в прошлом, настоящем и в будущем.
❤️ Спасибо, что читаете этот канал. Как и прежде, здесь я продолжу делиться своим опытом и знаниями.
👩🎓 И вы можете помочь мне сделать его лучше (обещаю прочесть каждый ваш ответ).
🌐 Сделать канал лучше.
😃 iOS Dev
8 001
🇯🇵 Apple Marunouchi в Токио
Сейчас я в отпуске, и наконец получилось добраться до страны восходящего солнца. Несмотря на невероятное количество достопримечательностей, невозможно было не зайти в крупнейший эпл стор в мегаполисе.
Он открылся в 2019 году и более чем половина из 130 сотрудников приехали сюда из разных районов Японии. А если сложить их знания, окажется, что работники могут помочь вам аж на 15 разных языках.
Внутри оконные проемы отделаны бамбуком, чтобы интегрировать высокий темп жизни снаружи и отдать дань уважения традициям страны. Атриум в центре выступает сердцем магазина и соединяет оба этажа.
В отличие от моих прошлых постов о двух магазинах в Нью-Йорке и в Лос-Анджелесе можно сказать, что здесь торжествует минимализм. Но знаете, здесь это как нельзя кстати.
😃 iOS Dev
8 001
Рендеринг сцены Моаны (мультфильма Диснея) менее чем за 10 000 строк кода Swift
После того, как Walt Disney выпустила описание сцены острова в Моане, были предприняты некоторые усилия по его визуализации помимо Диснеевского Hyperion.
Энтузиаст пошёл ещё дальше и выпустил собственный рендерер на Swift (с несколькими строками на C++ для вызова OpenEXR и Ptex).
📖 В большом исследовании он пишет, как пришёл к этому, какие оптимизации принял, и почему Swift оказался предпочтительным выбором.
📖 А в текущей версии он рассказывает, как он смог ускорить процесс рендеринга с 26 часов в начале до 78 минут.
🛠 Вы не поверите, но есть даже исходный код.
😃 iOS Dev — а что вы сможете делать с помощью Swift?
8 001
Почему Apple запретила своим сотрудникам использовать ChatGPT и другие нейросети
Некоторое время назад я писал, почему использование ChatGPT мешает жить StackOverflow и не только.
Буквально сегодня в сторе появился официальный iOS-клиент, который уже на подступах к первым позициям во всех чартах. И как нельзя кстати появилась вот эта новость на базе информации от The Wall Street Journal.
Мартовская ошибка позволяла пользователям видеть историю чатов других пользователей ChatGPT, и только после этого инцидента ChatGPT добавил возможность разрешить пользователям отключать историю чатов и не участвовать в обучении модели ИИ.
Если инженеры Apple используют эти платформы, нет никакой гарантии, что их код (или ваш) не попадёт к кому-то другому или даже не будет использован конкурентами.
То же самое относится и к другой конфиденциальной информации, поскольку сотрудники могут использовать ChatGPT, например, для составления электронных писем.
Apple не единственная компания, запретившая ChatGPT. Например, JPMorgan Chase и Verizon также ограничили использование таких платформ.
Кстати, в отчете упоминается, что Apple также работает над собственной моделью ИИ.
Так оно или нет, узнаем совсем скоро, WWDC приближается.
😃 iOS Dev
8 001
❗️Вышел Xcode 14.3.1 RC с важными фиксами
1️⃣ При сборках с 14.3 девайсы на iOS 13, использующие протоколы Objective-C из Swift, крашились при запуске.
С этой проблемой мы столкнулись и на рабочем проекте.
2️⃣ Исправили краш на iOS 15, связанный со Swift Concurrency.
Кроме этого, избавились от проблем с отображением альтернативных иконок на планшетах и улучшили поведение на макоси.
🔗 Детально весь список обновлений здесь.
🛠 Скачать обновлённый Xcode уже можно на сайте.
😃 iOS Dev
8 001
Ranges в Swift: примеры и неочевидные моменты
Ranges позволяют нам писать элегантный код Swift с помощью операторов диапазона.
Скорее всего в первый раз вы их использовали для выборки символов из строки, но на самом деле возможности куда шире.
Важно понимать, когда и какой тип оператора диапазона стоит использовать, и как именно можно избежать неприятностей с index is out of range.
📖 Antoine (создатель одноимённого сайта) в этой статье разбирает примеры, а также то, что может произойти, когда в вашей строке содержатся, например, эмодзи.
😃 iOS Dev8 001
Реализация мгновенного взаимодействия с pan-жестами
Это сложнее, чем кажется, поскольку
UIPanGestureRecognizer не сразу распознает начало жеста.
Если вы просто прикаснетесь пальцем к движущемуся объекту, технически это не «панорамирование», поэтому жест будет проигнорирован. И хоть это ожидаемое поведение согласно докам, в результате может получиться недостаточно отзывчивое взаимодействие.
🤩 У Натана Гиттера есть отличная статья, в которой показаны примеры кода для многих подобных ситуаций, в том числе с реализацией кастомного жеста.
Некоторое время это работало, но в последней версии iOS были внесены некоторые изменения. Например, снизу экрана может быть задержка между обновлением состояния до .began и уведомлением обработчика жестов.
Это около 0,75 секунды, что очень долго для жеста (на устройстве с частотой 120 Гц это 90 кадров, отображаемых до того, как ваш ввод будет распознан!).
📖 В этом материале Christian Selig (создатель Apollo — крутого клиента для Reddit) рассказывает о создании собственного распознавателя жестов, который работает поверх остальных и обходит проблему паузы при взаимодействии.
😃 iOS Dev8 001
Измерение производительности приложений iOS в Uber: техники и советы
Для запуска приложения инженеры специально измеряют продолжительность холодного запуска приложения, которая состоит из создания первого процесса приложения, инициализации main.swift, различных сетевых вызовов для получения контента в реальном времени и первого прохода рендеринга для отрисовки экрана.
Это отличается от горячего запуска, когда приложение уже инициализировано в памяти и просто выведено на передний план из фона.
В дополнение к вышеперечисленному команда Uber создала конвейер данных для получения метрик частоты задержек и зависаний от Apple, что обеспечивает более глубокое понимание того, что происходит на уровне ОС.
📖 В этой исследовательской статье инженеры рассказывают, какие показатели производительности и какие инструменты и процессы были созданы.
Например, для измерения времени до
main() в приложении после создания процесса используется вызов ядра Mach:
C/C++
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()};
struct kinfo_proc kp;
size_t size = sizeof (kp);
// Time in Microseconds
kp.kp_proc.p_starttime.tv.sec * 1000000 + kp.kp_proc.p_starttime.tv_usec
Из интересных решений: данные MetricKit не обрабатываются на клиенте, а отправляются в полуструктурированном формате JSON на серверную часть.
Грамотное исследование этих метрик позволяет определять, что сотни изменений кода и десятки функций не замедлят запуск приложения.
Кроме того, эти данные используются для оценки импакта тех или иных фич на скорость запуска, и, как следствие, непосредственного влияния на бизнес.
😃 iOS Dev8 001
Тут вот какое дело.
Этот канал был создан более трёх лет назад, но начал развиваться только в 2022. Об этом ниже.
Я Виктор Грушевский — автор этого канала, в iOS-разработке с 2011 года (примерно тогда был переход с iOS 4 на iOS 5).
На протяжении своего пути мне всегда нравилось создавать приложения, настраивать анимации, проектировать архитектуру и искать неочевидные пути выхода из сложных технических ситуаций.
Эти стремления отразились и в моём аккаунте разработчика, и в попытках участвовать в контестах среди крутых разработчиков.
Я никогда не считал алгоритмы лишними в разработке, улучшение скорости работы вашего приложения на 3 секунды сэкономит несколько тысяч часов, если им пользуются миллионы.
Можно сказать, что я технарь до мозга костей, но, поверьте, всё куда сложнее.
Одно из качеств, которые считаю своей сильной стороной — упорство (в разумной степени). Например, в CodeRun. В нашей с вами жизни не всегда удаётся побеждать, но главное начать, разве нет?
Иногда я делюсь своими проектами с сообществом: например, решением для управления отзывами (и локализациями) или полузабавным способом посмотреть распределение ваших файлов в проекте. А игроки в спортивное ЧГК скорее всего знают о знатоке.
В 2022 году произошли некоторые события в мире, которые заставили смотреть на мир иначе, хотя я и прежде не питал никаких иллюзий.
Я очень хочу, чтобы этот канал стал ресурсом, где без грязи, фальши и сказок о простом попадании в IT вы смогли увидеть примеры собеседований, проектов и настоящих трудностей разработки.
Для этого я пишу посты на хабр, делаю подборки из того, что вам пригодится: память, ссылки, side table и огромный пост про многопоточность и добавляю необычные материалы, например, как на самом деле реализовано управление громкостью в ваших наушниках.
Я против токсичности, против обмана и навязанных мнений.
А для решения задач важно выбрать подходящий инструмент. И если вам нужно забить гвоздь, не спрашивайте помощи у Chat GPT, а берите чёртов молоток.
Для этого и нужен этот канал.
😃 iOS Dev
8 001
Реализация эффекта Parallax в SwiftUI с использованием CoordinateSpace
Хэдеры в Parallax-стиле — это популярный вариант дизайна, который можно использовать для создания визуально привлекательных интерфейсов в мобильных приложениях.
Такой эффект создает иллюзию глубины и движения при использовании скролла пользователем.
📖 Тут есть пример реализации на SwiftUI.
📷 Для гифки использовал эту картинку.
📖 А вот тут можно узнать и другой способ создания такого эффекта.
😃 iOS Dev
8 001
Слушайте, недавно же Telegram выкатил новую штуку — шаринг папок, и я просто не могу не показать свой список!
🤩 Топовые ресуры по iOS-разработке.
Тут представлены и крутые сообщества (привет Coffee&Code) и авторы книг — все, что нужно для более простого и в то же время широкого изучения iOS.
Выбирайте то, что нужно прямо сейчас, или отфильтруйте потом:
🔗 Всё, что нужно для разработки в одном списке.
😃 iOS Dev
8 001
Как создать PDF Reader в iOS без сторонних библиотек
Полезно будет узнать про базовый подход к отображению PDF-файла, а затем усовершенствать реализацию, используя
UIDocumentPickerViewController для более удобного взаимодействия с пользователем.
📖 Для отображения файла PDF можно использовать использовать класс PDFView из фреймворка PDFKit.
📖 В этом пошаговом материале John Codeos на примерах объясняет все этапы создания несложного ридера.
🛠 Финальный проект доступен на Github.
😃 iOS Dev8 001
8 001
Реализация универсальных ссылок в iOS
Универсальные ссылки позволяют вам ссылаться на контент внутри вашего приложения, когда пользователь открывает определенный URL-адрес.
При этом рекомендуется перенаправлять пользователей внутрь, чтобы предоставить им наиболее интегрированный мобильный опыт.
Разница между deeplinks и universal links может быть описана простым примером:
Deeplink:
recipeapp://open-recipe?name=recipename
Universal Link: www.recipes.com/recipename
📖 А вот здесь можно прочесть о том, как корректно поддерживать такие ссылки и как их обрабатывать в вашем приложении.
📖 Не лишним будет напомнить и про способ реализации автозаполнения паролей.
😃 iOS Dev8 001
Понятное и доступное для поиска логирование в Swift с помощью OSLog
Когда дело доходит до возможности логирования в приложениях Swift и iOS, первым, что приходит на ум, могут быть
print и NSLog.
Однако не так давно Apple представила новый стандарт, доступ к которому осуществляется через OSLog.
В настоящее время это рекомендуемый способ, обеспечивающий эффективный способ сбора информации в наших приложениях.
Унифицированное ведение журнала обеспечивает ряд улучшений:
🔘 Каждое сообщение может быть зарегистрировано на соответствующем уровне, включая: default, error, debug и info.
🔘 Сообщения сгруппированы по подсистемам и категориям для эффективного поиска.
🔘 Система предназначена для повышения производительности, а журналы отображаются только при чтении.
🔘 Конфиденциальность пользователей тщательно соблюдается, при этом содержимое динамических строк должно быть явно помечено как public, иначе оно будет отредактировано в любых логах.
📖 В этом материале более детально разбираются опции и возможности OSLog.
😃 iOS Dev
Available now! Telegram Research 2025 — the year's key insights 
