iOS Dev
7.52K subscribers
942 photos
65 videos
1 file
1.06K links
🍏Канал об iOS-разработке, необычных подходах и решениях.
👨‍💻Автор: Виктор Грушевский (@Viktorianec)
Темы:
⭐️ Подготовка к собеседованиям.
⭐️ Архитектуры и алгоритмы.
⭐️ Код. Много кода.

⚒️База знаний: https://boosty.to/ios_dev

#ios #mobile #swift
加入频道
👨‍💻 Что нового в Swift 5.8: все особенности и пример playground

Недавно состоялся релиз Swit 5.8, который, к слову, включён в Xcode 14.3.

Вкратце основые изменения перечислены ниже:

🔘 Swift 5.8 позволяет начать поэтапную подготовку проектов для Swift 6, используя новые функции. Чтобы включить функцию, нужно передать флаг компилятора -enable-upcoming-feature

🔘 Прокачали реализацию Result builder.

🔘 Обновили экосистему, в том числе Swift-DocC и Swift Package Manager.

🔘 В выпуске SwiftSyntax вместе со Swift 5.8 теперь содержится полностью переписанный синтаксический анализатор, полностью реализованный на Swift. Новый парсер имеет ряд преимуществ.

📖 Детальный разбор новинок можно посмотреть здесь.

📖 А вот тут есть материал с разбором новых атрибутов, например @preconcurrency и hasAttribute.

🛠 Бонуc: пример Playground от Пола Хадсона, демонстрирующий новые фичи.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
AttributedString в Swift: форматирование текста и создание собственных стилей

🧐 Создание красивых приложений зависит не только от изображений — оно также распространяется и на текст.

Различные стили строк с атрибутами могут сделать информацию более выразительной.

📖 В этом руководстве вы узнаете о том, как работать с AttributedString и использовать расширенные возможности, включая форматирование с помощью Markdown.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Книжная подборка для продвинутых разработчиков Swift от легендарного автора

📖 Flight School — это серия книг, в которой рассматриваются основные темы разработки для iOS и macOS с помощью кратких и целенаправленных руководств.

В 2018 году решение о создании такой подборки принял Mattt (без сомнений, легендарный разработчик). Он проработал 3 года в Apple техническим писателем, участвуя в написании языка программирования Swift, Swift Package Manager и Swift.org.

До этого Мэтт основал NSHipster (который лично я поставил бы если не первым, то в топ-3 ресурсов для обязательного ознакомления), еженедельное издание для разработчиков iOS и macOS, и поддерживал несколько библиотек с открытым исходным кодом, включая Alamofire и AFNetworking (думаю, вы не раз слышали о таких).

На данный момент в подборке доступно три бесплатные книги:

1️⃣ Flight School Guide to Swift Strings - полный справочник по работе с текстом в Swift и Foundation.

2️⃣ Flight School Guide to Swift Numbers - все, что вам нужно знать о работе с числами в Swift.

3️⃣ Flight School Guide to Swift Codable - эта книга предлагает всесторонний обзор всех аспектов Codable, начиная с основ и заканчивая изучением множества продвинутых тем с помощью увлекательных примеров проектов.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Выход из зоны комфорта

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

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

💨 Последние пару недель я пробую свои силы в контесте coderun, не ставя цель войти в топ-20, а скорее с целью решить столько задач, сколько получится.

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

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

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

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

🌐 Попробовать свои силы можно здесь. Но пожалуйста, не обсуждайте решения задач с другими, ведь для самурая главное это путь (ещё и правила это запрещают).

😃 iOS Dev - поставьте какую-нибудь реакцию, если вам будет интересно почитать решения самых интересных задач после контеста
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 В 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 Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Оптимизация приложения при использовании Network Reachability

Network Reachability — жизненно важный аспект приложений, работающих с использованием интернета.

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

📖 В этом материале рассматривается несколько важных аспектов:

1️⃣ Почему стоит дожидаться самого подключения вместо предварительной проверки.

2️⃣ timeoutIntervalForRequest и timeoutIntervalForResource, в чём их разница.

3️⃣ Как обрабатывать сетевые ошибки.

4️⃣ Когда именно следует воспользоваться проверкой доступности сети (спойлер, нужен NWPathMonitor).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Создание кастомного компонента на SwiftUI: Segmented Control

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

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

📖 Именно об этом на хабре рассказывает Тёма Загоскин на примере создания Segmented Control.

🛠 А вот здесь пример финального кода.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Как быстро разобраться в основах Swift Concurrency

📖 Идеальная аудитория этого материала — опытный разработчик, знакомый с концепциями параллелизма и заинтересованный в изучении синтаксиса и API Swift Concurrency.

В нём перечислены примеры работы с async/await, интеграции с существующим кодом, а также описано, как работать с группами задач.

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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
CoreData для базовых задач одним методом

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

Как устроить работу с CoreData таким образом, чтобы минимизировать потенциальные лаги при работе с данными?

1️⃣ Чтение должно происходить из main-очереди для достижения отзывчивого и актуального UI.

2️⃣ Запись, изменение и сохранение информации должно производиться вне main-очереди.

3️⃣ Необходимо иметь понимание, когда операция записи закончила свое выполнение и в БД все готово к выполнению дальнейших действий с актуальными данными.

4️⃣ Запись должна происходить синхронно друг за другом, чтобы избежать крешей и неконсистентности данных.

5️⃣ Решение должно предоставлять удобное понятное API для взаимодействия.

6️⃣ Решение должно быть щадящее для новичков и, насколько это возможно, защищено от выстрелов в ногу.

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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Продвинутые переходы в SwiftUI: анимации на примерах с кодом

🧑‍💻 Важно понимать, как создавать анимированные переходы. Как их настраивать, комбинировать и проверять работу.

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

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

👨‍💻 А вот здесь есть gist с кодом, который можно попробовать завести и кастомизировать.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🏆 Я прошёл CodeRun, решив все задачи!
Нужно организовать свой буткемп, получается?😅

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

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

Первый большой шаг вперёд был сделан в кажущейся лёгкой задаче про минусы.

Очень много сил ушло и на задачу с разноцветными дорогами.

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

Ровно до момента, пока не наткнулся на салон Health & Sun.
Что может быть плохого в соляриях, спросите вы?

А например, то, что вечера четверга и пятницы могут уйти на изучение:
📖 Раз, два, три, четыре.

Но в итоге и этот узел был распутан.

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

Про буткемп это, конечно же, шутка. 😎

😃 iOS Dev - я уважаю правила, и обязательно поделюсь решениями после окончания контеста, который будет идти до июля.

Буду рад вашей поддержке! 🏆❤️‍🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
Популярность 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 Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Понятное и доступное для поиска логирование в Swift с помощью OSLog

Когда дело доходит до возможности логирования в приложениях Swift и iOS, первым, что приходит на ум, могут быть print и NSLog.

Однако не так давно Apple представила новый стандарт, доступ к которому осуществляется через OSLog.

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

Унифицированное ведение журнала обеспечивает ряд улучшений:

🔘 Каждое сообщение может быть зарегистрировано на соответствующем уровне, включая: default, error, debug и info.

🔘 Сообщения сгруппированы по подсистемам и категориям для эффективного поиска.

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

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

📖 В этом материале более детально разбираются опции и возможности OSLog.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Реализация универсальных ссылок в iOS

Универсальные ссылки позволяют вам ссылаться на контент внутри вашего приложения, когда пользователь открывает определенный URL-адрес.

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

Разница между deeplinks и universal links может быть описана простым примером:

Deeplink: recipeapp://open-recipe?name=recipename
Universal Link: www.recipes.com/recipename

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

📖 Не лишним будет напомнить и про способ реализации автозаполнения паролей.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как создать PDF Reader в iOS без сторонних библиотек

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

📖 Для отображения файла PDF можно использовать использовать класс PDFView из фреймворка PDFKit.

📖 В этом пошаговом материале John Codeos на примерах объясняет все этапы создания несложного ридера.

🛠 Финальный проект доступен на Github.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Слушайте, недавно же Telegram выкатил новую штуку — шаринг папок, и я просто не могу не показать свой список!

🤩 Топовые ресуры по iOS-разработке.

Тут представлены и крутые сообщества (привет Coffee&Code) и авторы книг — все, что нужно для более простого и в то же время широкого изучения iOS.

Выбирайте то, что нужно прямо сейчас, или отфильтруйте потом:

🔗 Всё, что нужно для разработки в одном списке.

UPD. Если по нажатию на ссылку не появляется выбор каналов, то обновите Telegram до последней версии 😎

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация эффекта Parallax в SwiftUI с использованием CoordinateSpace

Хэдеры в Parallax-стиле — это популярный вариант дизайна, который можно использовать для создания визуально привлекательных интерфейсов в мобильных приложениях.

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

📖 Тут есть пример реализации на SwiftUI.
📷 Для гифки использовал эту картинку.

📖 А вот тут можно узнать и другой способ создания такого эффекта.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Тут вот какое дело.

Этот канал был создан более трёх лет назад, но начал развиваться только в 2022. Об этом ниже.

Я Виктор Грушевский — автор этого канала, в iOS-разработке с 2011 года (примерно тогда был переход с iOS 4 на iOS 5).

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

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

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

Можно сказать, что я технарь до мозга костей, но, поверьте, всё куда сложнее.

Одно из качеств, которые считаю своей сильной стороной — упорство (в разумной степени). Например, в CodeRun. В нашей с вами жизни не всегда удаётся побеждать, но главное начать, разве нет?

Иногда я делюсь своими проектами с сообществом: например, решением для управления отзывами (и локализациями) или полузабавным способом посмотреть распределение ваших файлов в проекте. А игроки в спортивное ЧГК скорее всего знают о знатоке.

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

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

Для этого я пишу посты на хабр, делаю подборки из того, что вам пригодится: память, ссылки, side table и огромный пост про многопоточность и добавляю необычные материалы, например, как на самом деле реализовано управление громкостью в ваших наушниках.

Я против токсичности, против обмана и навязанных мнений.

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

Для этого и нужен этот канал.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Измерение производительности приложений 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 Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Реализация мгновенного взаимодействия с pan-жестами

Это сложнее, чем кажется, поскольку UIPanGestureRecognizer не сразу распознает начало жеста.

Если вы просто прикаснетесь пальцем к движущемуся объекту, технически это не «панорамирование», поэтому жест будет проигнорирован. И хоть это ожидаемое поведение согласно докам, в результате может получиться недостаточно отзывчивое взаимодействие.

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

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

Это около 0,75 секунды, что очень долго для жеста (на устройстве с частотой 120 Гц это 90 кадров, отображаемых до того, как ваш ввод будет распознан!).

📖 В этом материале Christian Selig (создатель Apollo — крутого клиента для Reddit) рассказывает о создании собственного распознавателя жестов, который работает поверх остальных и обходит проблему паузы при взаимодействии.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Ranges в Swift: примеры и неочевидные моменты

Ranges позволяют нам писать элегантный код Swift с помощью операторов диапазона.

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

Важно понимать, когда и какой тип оператора диапазона стоит использовать, и как именно можно избежать неприятностей с index is out of range.

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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM