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

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

#ios #mobile #swift
加入频道
Простой доступ к данным симулятора

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

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

Трудности с поиском файлов становятся еще более очевидными при работе в команде.

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

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

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

@iOS Dev
🔥28👍7💯2🏆2
UIStackView: Distribution и Alignment

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

Существует четыре основных свойства UIStackView:

1️⃣ axis

2️⃣ distribution

3️⃣ alignment

4️⃣ spacing

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

Как насчет оставшихся двух: alignment и spacing?

Хотя UIStackView стал настолько популярным и широко используется во многих приложениях, многие могут не понимать его полностью и использовать неправильно.

📖 И как раз о причинах сложностей и свойствах UIStackView рассказывается в этом материале.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍1531❤‍🔥1👏1💯1
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация двунаправленной UICollectionView с использованием orthogonalScrollingBehavior

ℹ️ До iOS 13, если вы хотели реализовать вертикальную UICollectionView с разделами с горизонтальной прокруткой, требовалось встроить scroll view внутрь ячейки, передать модель, обработать тачи, прикрутить делегирование и сложную логику.

С UICollectionViewCompositionalLayout все эти проблемы исчезают.

Всё благодаря orthogonalScrollingBehavior, которую предоставила нам Apple.

📖 В этом материале рассказывает о своём опыте использования и приводит примеры.

👩‍💻 Код доступен на github.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥38👍11🔥4🤩2🏆21👏1
Какими должны быть outlets, weak или всё-таки strong?

Должны ли outlets объявляться слабыми или сильными? Что произойдёт, если использовать weak? Какие здесь подводные камни?

Эти вопросы возникают довольно часто. И чтобы понять, что к чему, нам нужно знать, какие из объектов ссылаются на другие. А подсчет ссылок должен в этом помочь.

📖 В этом материале автор даёт ответ на этот вопрос, приводит аргументы и объясняет свои выводы.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍10👏32🌚2❤‍🔥1
Создание меню отладки в Swift с помощью UIContextMenuInteraction

Меню отладки в iOS — очень эффективный способ повысить продуктивность рабочего дня разработчика.

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

Для этого может пригодиться UIContextMenuInteraction — API контекстного меню.

Он работает аналогично UIAlertController, но на него приятнее смотреть и, что самое важное, гораздо проще реализовать!

А начиная с iOS 14, мы даже можем добавить к нему нужные нам асинхронные действия с помощью UIDeferredMenuElement.

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

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🤯4🔥3🏆2❤‍🔥111😁1
Grand Central Dispatch: от определения к низкоуровневым примитивам

ℹ️ Вместо ручного создания потоков и их последующего контроля мы можем использовать абстрактные очереди и возложить на них всю ответственность по управлению потоками.

В серии статей ниже Alex Shchukin рассматривает основные понятия, как, например, очереди, как с ними работать, иссследует dispatch source и затрагивает DispatchIO (который не является супер популярным инструментом).

⭐️ Плюс статей в примерах, с помощью которых реализуются некоторые основные подходы, которые можно использовать в реальных приложениях.

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

Материалы доступны здесь:

1️⃣ GCD: Очереди и методы.

2️⃣ DispatchWorkItem и Quality of Service (тот самый QoS).

3️⃣ DispatchGroup и concurrentPerform.

4️⃣ Синхронизация: семафоры, барьеры (и не только).

5️⃣ DispatchSource и Target Queue Hierarchy.

👨‍💻 Примитивы GCD в деталях — в этой статье автор использует низкоуровневые примитивы, чтобы разобраться, как на самом деле работает GCD.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥11🏆31❤‍🔥1👏1💯1
Протоколы ошибок, о которых вы могли не знать: Localized​Error, Recoverable​Error, Custom​NSError

Несмотря на то, насколько мы все знакомы с Error, на удивление немногие из нас могут быть знакомы с другими протоколами ошибок, появившимися в SE-0112. Например, когда вы в последний раз сталкивались с LocalizedError в дикой природе? А что насчет RecoverableError?

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

🔘 LocalizedError. Специализированная ошибка, предоставляющая локализованные сообщения с описанием ошибки и причиной ее возникновения.

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

🔘 CustomNSError. Специализированная ошибка, предоставляющая домен, код ошибки и user-info dictionary.

📖 В этом объёмном материале автор разбирает на примерах, что и когда лучше использовать.

@iOS Dev
🔥9👍71👏1😱1👌1
This media is not supported in your browser
VIEW IN TELEGRAM
⌨️ А у нас интересный факт, посмотрите, как устроен эпловский календарь изнутри!

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

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

Полезно посмотреть на то, как решают типовые проблемы инженеры яблочной компании, и как они, например:

1️⃣ В системном калькуляторе, сетку с кнопками расставили с помощью фреймов.

2️⃣ А вот тут можно прочесть про то, как устроено приложение App Store.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍8😱2👏1🤯1🤩1
Рефакторинг вашего кода на Swift: лучшие практики и советы для достижения успеха

ℹ️ Рефакторинг кода — это часть пути к созданию надежных приложений.

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

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

* в один своих таких рефакторов я переписывал раздел чата (кто работал с любыми чатами меня поймёт), полностью на Texture (он же AsyncDisplayKit), и если не юзать декомпозицию задач, можно было бы говорить «повезло, повезло».

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

В этом процессе он выделил несколько основных этапов:

🔘 Определение цели.

🔘 Создание уверенности в рефакторинге. Наши товарищи здесь это, по возможности, модульные тесты и конечно же, GIT.

🔘 Маленькие шаги к финальной цели.

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

Не стоит пренебрегать помощью Xcode в рефакторинге.

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

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥4💯311👏1🤔1🤩1😍1
Заполнение столбцов градиентом с использованием Swift Charts

🆕 С новыми Swift Charts очень легко создавать простые диаграммы для визуализации данных в наших приложениях.

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

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

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

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

@iOS Dev
🔥15👍8🤩1👌1💯1🏆1
⌨️ Как можно передавать данные между приложениями iOS?
Полегче, посложнее и для хакермэнов.

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

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

🔘 App Groups, пожалуй, самое очевидное из списка, и содержащее свой принцип в названии.

🔘 UIActivityViewController — возможно и не первое, что приходит на ум, но существующее решение. Поддерживается с iOS 6.0+ и реализуется с помощью application:openURL:sourceApplication:annotation:.

🔘 Custom URL Schemes.

Чтобы включить схему URL-адресов в нашем приложении, мы должны добавить пользовательскую схему URL-адресов на вкладку информации. Откройте, например, Safari и введите [URL_scheme]://параметр, чтобы открыть ваше приложение.

🔘 Share Extension. iOS 8.0+. Это тип расширений, как, например Today, Action, Custom Keyboard и так далее.

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

🔘 Shared Keychain Access. iOS 3.0+.

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

🔘 Custom Pasteboards. iOS 3.0+. Другой объект в том же или другом приложении считывает данные из pasteboard и представляет их пользователю в новом месте; обычно это происходит, когда пользователь запрашивает операцию вставки.
В этом твиттер-треде разработчик делится своим опытом использования этого решения.

🔘 Darwin Notification Center (в этой статье есть и пример использования, и даже код).

🟡 iOS Photos! Что? Да! Посмотрите, как в этом репозитории нашли изысканное решение, хотя и может возникнуть два вопроса.

@iOS Dev — шарим данные (и пост 😎).
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28👍13👏2💯211❤‍🔥1🏆1
Архитектура приложения и композиция объектов в Swift

Композиция объектов — это основная концепция объектно-ориентированного программирования.

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

📖 В этой статье автор рассказывает, как спроектировать такую ​​архитектуру.

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

@iOS Dev
🔥8👍41👏1🤩1🕊1
Apple Security Bounty Program: поиск уязвимостей за вознаграждение

⌨️ Apple обновила раздел, посвященный поиску проблем в системе.

Выплаты вознаграждения Apple Security Bounty производятся по собственному усмотрению Apple и зависят от типа проблемы, достигнутого уровня доступа или выполнения, а также качества отчета.

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

🔘 Например, сетевая атака может принести от $ 5 000 до $ 150 000.
Пример: щелкнув ссылку в сообщении iOS Mail, вы можете загрузить удаленный контент, когда этот параметр отключен.

🔘 А в случае, если вы знаете способ, как обойти режим блокировки и определённых уровней защиты, вы сможете получить вплоть до $ 2 000 000.

📖 Подробнее о категориях написано здесь (любопытно узнать, чего Apple боится больше всего).

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😱3👏2💯21🤣1🏆1🍓1🍾1
Разбор различных политик кэширования при работе с URLRequest в Swift

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

В зависимости от выбранной политики поведение может и правила управления контентом изменяются.

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

@iOS Dev
🔥15👍6❤‍🔥2👏2🌚2💯1
Практический опыт работы с UICollectionView: создание приложения для просмотра фотографий с помощью Flickr API

UICollectionView упрощает добавление кастомных лэйаутов и переходов между ними, такими, как в Photos.

Вы не ограничены только стэком или гридом, поскольку UICollectionView настраиваемы. Вы можете использовать их для создания круговых макетов, макетов в стиле cover-flow, макетов в стиле новостей и почти всего, что только можно придумать!

📖 В этом материале вы получите практический опыт работы с UICollectionView, создав приложение для просмотра фотографий на основе сетки. Попутно вы узнаете, как:

😂 Добавлять свои хэдеры к UICollectionView.

😂 Легко перемещать ячейки путем их перетаскивания.

😂 Реализовывать выделение одной ячейки для показа вьюхи с деталями.

😂 Реализовывать выделение нескольких ячеек.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥7❤‍🔥2👏1🏆1
Как добавить маску для изображения в виде многоугольника?

Мы все часто используем свойство cornerRadius в CALayer, чтобы сделать наш UIImageView закруглённым в соответствии с дизайном.

⭐️Но что делать, если дизайнер хочет чего-то большего, например, звезду или многоугольник?

📖 Этот пример подскажет, как использовать UIBezierPath для создания динамического многоугольника, который будет маской для UIImageView, как в примере на картинке.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥7❤‍🔥4👏1💯1🏆1
This media is not supported in your browser
VIEW IN TELEGRAM
Как изменить стиль отступов простым способом?

Для этого можно воспользоваться комбинацией Ctrl+Shift+«Клик мышкой» для создания мультикурсора.

😎 А затем если нужно, уже настраивайте отступы или же используйте Enter по вашему вкусу.

#xcode #shortcuts

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍49🔥16💯72👏1🍓1
Apple Wallet: поддерживаемые типы штрих-кодов и обходные пути

К сожалению, Apple Wallet поддерживает только ограниченный набор типов штрих-кодов.

Конечно, поддержка более современных 2D-штрих-кодов лучше, но ограничения Apple ведут к сложностям.

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

@iOS Dev
👍8🌚4🔥1👏1💯1😐1
Бесконечный скролл в iOS приложении: UITableView + REST API

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

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

📖 В этом руководстве вы узнаете, как добавить бесконечную прокрутку в приложение iOS, которое извлекает данные из REST API.

Кстати, ещё вы познакомитесь с Prefetching API. Это адаптивная технология, которая выполняет оптимизацию, направленную на улучшение производительности прокрутки.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32👍9👏2💯1🏆1
👩‍💻 Xсode, pbxproj, IBoutlet и IBAction

Те, кто давно читают это канал, в курсе, что иногда я пишу о повседневных вещах, названия и предназначение которых не всегда очевидны. Привет камню из Хаблингбо в Швеции!

Сегодня пятница, и поэтому позволю себе в двух предложениях рассказать, почему наша среда разработки называется Xcode, а не iCode или iBuilder (хотя последнее не так далеко от правды).

🕔 Xcode начинал свою жизнь как связка двух приложений: Project Builder и Interface Builder.

Эти инструменты были написаны для NeXT Computer, Inc. Стива Джобса для их операционной системы NeXTSTEP.

После покупки Apple NeXT, компания начала превращать NeXTSTEP в OS X, они также начали адаптировать Project Builder и Interface Builder к своей новой операционной системе.

Первоначально эти два инструмента сохранили свои старые названия, но в OS X Panther (10.3) Apple заменила Project Builder переработанной версией под названием Xcode.

В нескольких версиях Xcode продолжал поставляться вместе с Interface Builder, но связь между этими двумя инструментами всегда была сложной, поэтому в Xcode 4 (выпущенном между 10.6 и 10.7) они наконец объединили Interface Builder с Xcode.

Точно так же, как происхождение OS X как NeXTSTEP выдается префиксами «NS» во многих API, так и происхождение Xcode как Interface Builder и Project Builder выдается аббревиатурами в приложении. «IB» в «IBOutlet» и «IBAction» является аббревиатурой для «Interface Builder», а основной файл информации о проекте в пакете xcodeproj имеет расширение «pbxproj» для «Project Builder X Project».

⌨️ Поэтому X означал написание приложений для OS X. А в будущем, что ж, кто знает, может и появится iCode (когда-нибудь).

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍50🔥10🤯842👏2🎉1💯1🏆1