iOS Dev
Kanalga Telegram’da o‘tish
👨💻Автор: Виктор Грушевский (@Viktorianec) ⚒️ База: https://boosty.to/ios_dev | 🤖 @iOSIQBot | https://iosiq.ru 🍏Канал об iOS-разработке, алгоритмах и архитектурах ⭐️ Подготовка к собесам ⭐️ Код. Много кода. #ios #mobile #swift
Ko'proq ko'rsatish7 874
Obunachilar
-124 soatlar
Ma'lumot yo'q7 kun
-5130 kun
Postlar arxiv
7 876
❗️Вышел Xcode 14.3.1 RC с важными фиксами
1️⃣ При сборках с 14.3 девайсы на iOS 13, использующие протоколы Objective-C из Swift, крашились при запуске.
С этой проблемой мы столкнулись и на рабочем проекте.
2️⃣ Исправили краш на iOS 15, связанный со Swift Concurrency.
Кроме этого, избавились от проблем с отображением альтернативных иконок на планшетах и улучшили поведение на макоси.
🔗 Детально весь список обновлений здесь.
🛠 Скачать обновлённый Xcode уже можно на сайте.
😃 iOS Dev
7 876
Ranges в Swift: примеры и неочевидные моменты
Ranges позволяют нам писать элегантный код Swift с помощью операторов диапазона.
Скорее всего в первый раз вы их использовали для выборки символов из строки, но на самом деле возможности куда шире.
Важно понимать, когда и какой тип оператора диапазона стоит использовать, и как именно можно избежать неприятностей с index is out of range.
📖 Antoine (создатель одноимённого сайта) в этой статье разбирает примеры, а также то, что может произойти, когда в вашей строке содержатся, например, эмодзи.
😃 iOS Dev7 876
Реализация мгновенного взаимодействия с pan-жестами
Это сложнее, чем кажется, поскольку
UIPanGestureRecognizer не сразу распознает начало жеста.
Если вы просто прикаснетесь пальцем к движущемуся объекту, технически это не «панорамирование», поэтому жест будет проигнорирован. И хоть это ожидаемое поведение согласно докам, в результате может получиться недостаточно отзывчивое взаимодействие.
🤩 У Натана Гиттера есть отличная статья, в которой показаны примеры кода для многих подобных ситуаций, в том числе с реализацией кастомного жеста.
Некоторое время это работало, но в последней версии iOS были внесены некоторые изменения. Например, снизу экрана может быть задержка между обновлением состояния до .began и уведомлением обработчика жестов.
Это около 0,75 секунды, что очень долго для жеста (на устройстве с частотой 120 Гц это 90 кадров, отображаемых до того, как ваш ввод будет распознан!).
📖 В этом материале Christian Selig (создатель Apollo — крутого клиента для Reddit) рассказывает о создании собственного распознавателя жестов, который работает поверх остальных и обходит проблему паузы при взаимодействии.
😃 iOS Dev7 876
Измерение производительности приложений 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 Dev7 876
Тут вот какое дело.
Этот канал был создан более трёх лет назад, но начал развиваться только в 2022. Об этом ниже.
Я Виктор Грушевский — автор этого канала, в iOS-разработке с 2011 года (примерно тогда был переход с iOS 4 на iOS 5).
На протяжении своего пути мне всегда нравилось создавать приложения, настраивать анимации, проектировать архитектуру и искать неочевидные пути выхода из сложных технических ситуаций.
Эти стремления отразились и в моём аккаунте разработчика, и в попытках участвовать в контестах среди крутых разработчиков.
Я никогда не считал алгоритмы лишними в разработке, улучшение скорости работы вашего приложения на 3 секунды сэкономит несколько тысяч часов, если им пользуются миллионы.
Можно сказать, что я технарь до мозга костей, но, поверьте, всё куда сложнее.
Одно из качеств, которые считаю своей сильной стороной — упорство (в разумной степени). Например, в CodeRun. В нашей с вами жизни не всегда удаётся побеждать, но главное начать, разве нет?
Иногда я делюсь своими проектами с сообществом: например, решением для управления отзывами (и локализациями) или полузабавным способом посмотреть распределение ваших файлов в проекте. А игроки в спортивное ЧГК скорее всего знают о знатоке.
В 2022 году произошли некоторые события в мире, которые заставили смотреть на мир иначе, хотя я и прежде не питал никаких иллюзий.
Я очень хочу, чтобы этот канал стал ресурсом, где без грязи, фальши и сказок о простом попадании в IT вы смогли увидеть примеры собеседований, проектов и настоящих трудностей разработки.
Для этого я пишу посты на хабр, делаю подборки из того, что вам пригодится: память, ссылки, side table и огромный пост про многопоточность и добавляю необычные материалы, например, как на самом деле реализовано управление громкостью в ваших наушниках.
Я против токсичности, против обмана и навязанных мнений.
А для решения задач важно выбрать подходящий инструмент. И если вам нужно забить гвоздь, не спрашивайте помощи у Chat GPT, а берите чёртов молоток.
Для этого и нужен этот канал.
😃 iOS Dev
7 876
Реализация эффекта Parallax в SwiftUI с использованием CoordinateSpace
Хэдеры в Parallax-стиле — это популярный вариант дизайна, который можно использовать для создания визуально привлекательных интерфейсов в мобильных приложениях.
Такой эффект создает иллюзию глубины и движения при использовании скролла пользователем.
📖 Тут есть пример реализации на SwiftUI.
📷 Для гифки использовал эту картинку.
📖 А вот тут можно узнать и другой способ создания такого эффекта.
😃 iOS Dev
7 876
Слушайте, недавно же Telegram выкатил новую штуку — шаринг папок, и я просто не могу не показать свой список!
🤩 Топовые ресуры по iOS-разработке.
Тут представлены и крутые сообщества (привет Coffee&Code) и авторы книг — все, что нужно для более простого и в то же время широкого изучения iOS.
Выбирайте то, что нужно прямо сейчас, или отфильтруйте потом:
🔗 Всё, что нужно для разработки в одном списке.
😃 iOS Dev
7 876
Как создать PDF Reader в iOS без сторонних библиотек
Полезно будет узнать про базовый подход к отображению PDF-файла, а затем усовершенствать реализацию, используя
UIDocumentPickerViewController для более удобного взаимодействия с пользователем.
📖 Для отображения файла PDF можно использовать использовать класс PDFView из фреймворка PDFKit.
📖 В этом пошаговом материале John Codeos на примерах объясняет все этапы создания несложного ридера.
🛠 Финальный проект доступен на Github.
😃 iOS Dev7 876
7 876
Реализация универсальных ссылок в iOS
Универсальные ссылки позволяют вам ссылаться на контент внутри вашего приложения, когда пользователь открывает определенный URL-адрес.
При этом рекомендуется перенаправлять пользователей внутрь, чтобы предоставить им наиболее интегрированный мобильный опыт.
Разница между deeplinks и universal links может быть описана простым примером:
Deeplink:
recipeapp://open-recipe?name=recipename
Universal Link: www.recipes.com/recipename
📖 А вот здесь можно прочесть о том, как корректно поддерживать такие ссылки и как их обрабатывать в вашем приложении.
📖 Не лишним будет напомнить и про способ реализации автозаполнения паролей.
😃 iOS Dev7 876
Понятное и доступное для поиска логирование в Swift с помощью OSLog
Когда дело доходит до возможности логирования в приложениях Swift и iOS, первым, что приходит на ум, могут быть
print и NSLog.
Однако не так давно Apple представила новый стандарт, доступ к которому осуществляется через OSLog.
В настоящее время это рекомендуемый способ, обеспечивающий эффективный способ сбора информации в наших приложениях.
Унифицированное ведение журнала обеспечивает ряд улучшений:
🔘 Каждое сообщение может быть зарегистрировано на соответствующем уровне, включая: default, error, debug и info.
🔘 Сообщения сгруппированы по подсистемам и категориям для эффективного поиска.
🔘 Система предназначена для повышения производительности, а журналы отображаются только при чтении.
🔘 Конфиденциальность пользователей тщательно соблюдается, при этом содержимое динамических строк должно быть явно помечено как public, иначе оно будет отредактировано в любых логах.
📖 В этом материале более детально разбираются опции и возможности OSLog.
😃 iOS Dev7 876
Популярность CocoaPods продолжает расти, несмотря на продвижение Swift Package Manager
Казалось бы, с 2015 года использование CocoaPods должно пойти на спад, ведь именно тогда появился SPM, но именно так и случилось все не совсем так.
Общее количество скачиваний всех репозиториев превысило 70 миллионов, и это несмотря на:
1️⃣ Огромный импакт Apple в продвижение своей экосистемы, и в частности,
Swift Package manager.
2️⃣ Периодические проблемы с совместимостью. В том числе, даже в последнем Xcode 14.3. Хотя для этого и помогает press f (🫡) в прямом смысле.
3️⃣ Недавний вклад Apple в поддержку Swift Package Index.
Конечно, мы не знаем точных цифр и использований SPM на текущий момент, но факт остаётся фактом: cocoapods пока ещё не собирается упускать лидирующие позиции.
😃 iOS Dev7 876
🏆 Я прошёл CodeRun, решив все задачи!
Нужно организовать свой буткемп, получается?😅
В последнем апдейте про это приключение мне оставалось несколько сложных и средних задач, а также одна простая.
Максимум на одну задачу ушло несколько десятков попыток, зато некоторые сложные удалось сдать практически сразу после обработки корнеркейсов.
Первый большой шаг вперёд был сделан в кажущейся лёгкой задаче про минусы.
Очень много сил ушло и на задачу с разноцветными дорогами.
Но после этого хотя бы замаячил горизонт, что с контестом получится справиться.
Ровно до момента, пока не наткнулся на салон Health & Sun.
Что может быть плохого в соляриях, спросите вы?
А например, то, что вечера четверга и пятницы могут уйти на изучение:
📖 Раз, два, три, четыре.
Но в итоге и этот узел был распутан.
На этом пути было сложно, были извилистые повороты, но как известно: у страха глаза велики, и главное - начать.
Про буткемп это, конечно же, шутка. 😎
😃 iOS Dev - я уважаю правила, и обязательно поделюсь решениями после окончания контеста, который будет идти до июля.
Буду рад вашей поддержке! 🏆❤️🔥
7 876
Продвинутые переходы в SwiftUI: анимации на примерах с кодом
🧑💻 Важно понимать, как создавать анимированные переходы. Как их настраивать, комбинировать и проверять работу.
Для этого можно изучить уже существующие виды анимаций, и на их основе попробовать создать что-то своё.
📖 В этой статье наглядно разбираются различные варианты использования переходов, включая создание кастомных эффектов и их комбинаций.
👨💻 А вот здесь есть gist с кодом, который можно попробовать завести и кастомизировать.
😃 iOS Dev
7 876
CoreData для базовых задач одним методом
Системный фреймворк имеет высокий порог входа и много неочевидных моментов, которые обязательно всплывут при масштабировании приложения.
Как устроить работу с CoreData таким образом, чтобы минимизировать потенциальные лаги при работе с данными?
1️⃣ Чтение должно происходить из main-очереди для достижения отзывчивого и актуального UI.
2️⃣ Запись, изменение и сохранение информации должно производиться вне main-очереди.
3️⃣ Необходимо иметь понимание, когда операция записи закончила свое выполнение и в БД все готово к выполнению дальнейших действий с актуальными данными.
4️⃣ Запись должна происходить синхронно друг за другом, чтобы избежать крешей и неконсистентности данных.
5️⃣ Решение должно предоставлять удобное понятное API для взаимодействия.
6️⃣ Решение должно быть щадящее для новичков и, насколько это возможно, защищено от выстрелов в ногу.
📖 В этой статье автор делится своим опытом работы с CoreData, и предлагает решение, упрощающее работу с фреймворком.
😃 iOS Dev
7 876
Как быстро разобраться в основах Swift Concurrency
📖 Идеальная аудитория этого материала — опытный разработчик, знакомый с концепциями параллелизма и заинтересованный в изучении синтаксиса и API Swift Concurrency.
В нём перечислены примеры работы с async/await, интеграции с существующим кодом, а также описано, как работать с группами задач.
🧐 Кроме этого, доступно объясняется, как корректно задавать приоритеты задачам и проверять их при выполнении.
😃 iOS Dev
7 876
Создание кастомного компонента на SwiftUI: Segmented Control
Уверен, что практически каждый, кто пытался создавать свой контрол так, как нужно по дизайну, сталкивался с теми или иными подводными камнями.
Иногда простое на первый взгляд решение в дизайне может заставить углубиться в системную реализацию и окажется, что проще создать своё.
📖 Именно об этом на хабре рассказывает Тёма Загоскин на примере создания Segmented Control.
🛠 А вот здесь пример финального кода.
😃 iOS Dev
7 876
Оптимизация приложения при использовании Network Reachability
Network Reachability — жизненно важный аспект приложений, работающих с использованием интернета.
У пользователей не всегда будет хорошее (и стабильное) подключение, поэтому очень важно оптимизировать приложение для плохих условий.
📖 В этом материале рассматривается несколько важных аспектов:
1️⃣ Почему стоит дожидаться самого подключения вместо предварительной проверки.
2️⃣
timeoutIntervalForRequest и timeoutIntervalForResource, в чём их разница.
3️⃣ Как обрабатывать сетевые ошибки.
4️⃣ Когда именно следует воспользоваться проверкой доступности сети (спойлер, нужен NWPathMonitor).
😃 iOS Dev7 876
🎉 В Foundation открыли исходный код и теперь каждый iOS-разработчик лично может его улучшить
Сегодня произошло важнейшее событие, анонс которого ранее появлялся в нашем канале.
🛠 В Apple выпустили в открытый доступ репозиторий, целью которого является создание унифицированной реализации Swift Foundation для всех платформ.
Многие типы, в том числе
JSONEncoder, Calendar, TimeZone и Locale, являются совершенно новыми реализациями Swift.
🆕 FormatStyle и ParseStyle впервые доступны с открытым исходным кодом.
Качество и производительность - две самые важные цели в проекте.
Позднее в этом году ожидается реализация на Swift дополнительных важных базовых API, таких как URL, Bundle, FileManager, FileHandle, Process, SortDescriptor, SortComparator и других.
Реализация на Swift обеспечивает важные преимущества по сравнению с C и Objective-C.
Например, FormatStyle показал значительное улучшение на 150% в тесте форматирования со стандартным шаблоном даты и времени.
Foundation приветствует вклад сообщества, включая исправления ошибок, тесты, документацию и переносы на новые платформы.
И лично вы тоже можете поучаствовать.
😃 iOS Dev7 876
Последняя возможность попасть на обучение iOS в Школу Мобильной Разработки от Академии Яндекса🔥
За 3 месяца обучения вы прокачаете профессиональные скиллы, пообщаетесь с экспертами и другими увлечёнными студентами, погрузитесь в задачи IT-индустрии. Участие в школах бесплатное, занятия можно совмещать с работой или учёбой.
Обучение состоит из двух этапов:
🔸 Первый этап (8 недель) — онлайн-часть с лекциями, семинарами и практическими занятиями;
🔸 Второй этап (4 недели) — офлайн-часть в офисах Яндекса: непрерывный хакатон и работа в командах над реальными проектами.
Школа абсолютно бесплатная. На втором этапе для студентов из других городов компания оплатит перелет и проживание. После Школы у каждого студента есть возможность пройти отбор на стажировку или в штат по фаст-треку.
🌐 Чтобы попасть в школу, надо подать заявку и сделать тестовое. Прием заявок и тестовых открыт до 27 апреля включительно. Сами занятия начнутся в начале лета.
Этот проект отличная возможность прокачать свои навыки, а уже после этого можно побороться и за призы в соревнованиях.
😃 iOS Dev
