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

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

#ios #mobile #swift
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Продвинутые анимации в SwiftUI

📖 В цикле статей авторы погружаются в некоторые продвинутые техники создания анимации SwiftUI. Подробно рассказывается о протоколе Animatable, его верном спутнике animatableData, мощном и часто игнорируемом GeometryEffect и протоколе AnimatableModifier.

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

1️⃣ Часть первая — Paths.

2️⃣ Часть вторая — GeometryEffect.

3️⃣ Часть третья — AnimatableModifier.

🛠 Все статьи насыщены примерами, а исходный код можно найти на гитхабе.

@iOS Dev
👍21🔥13
Стратегии обращения к пользователям с просьбой оценить ваше приложение 👏

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

Что НЕ следует делать
🔴 Показывать алерт при запуске.
🔴 Показывать его слишком рано.
🔴 Показывать при любом общем для всех действии.

Стратегии получения максимальной отдачи
🟢 Ориентироваться на уникальное действие в приложении.
🟢 Совмещать оценку с существующими. Например, если пользователь уже что-то положительно оценил в вашем приложении.
🟢 Внедрите систему, основанную на весе, для управления отображением ваших алертов. Например:

— Открытие твита 1 балл.
— Лайк твита 3 балла.
— Создание твита 5 баллов.

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

@iOS Dev
👍12🔥2
На StackOverflow выпустили большой, вернее, ОГРОМНЫЙ отчёт по результатам опроса более 70 000 разработчиков.

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

Для Swift

❤️ 63% любят этот язык,😱 37% считают его неприятным.
💵 Медианная зарплата составляет $ 78 468 в год.

Для Objective-C

❤️ 24% любят, 😱 76% считают его неприятным.
💵 Медианная зарплата $ 83 165 в год.

Может на нём не так приятно писать, но пять тысяч долларов это пять тысяч долларов.

Удовлетворённость средой разработки Xcode равная, 50% считают его годным инструментом, а 50% не очень.

Лидеры по зарплатам Closure и Erlang — разработчикам, пишущим на одном из этих языков, платят в среднем $ 100 000 в год.

@iOS Dev
👍18🔥52😱2
Применение default для подсчёта количества символов в строке

Задача подсчёта символов в строках является одним из потенциальных вопросов во многих алгоритмических секциях.

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

🛠 На скриншоте я показал два способа для подсчёта повторений букв в строке «Hello iOS Devs».

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

@iOS Dev
👍37🔥4
Xcode's Energy Organizer: поиск причин крашей при высокой нагрузке на CPU

Если вы не знаете, что такое CPU Usage termination, вам повезло. Это не только один из самых неприятных крашей в iOS, но он даже не рассматривается системой как сбой.
Об этом не сообщается Firebase, поэтому о сбое вы даже не узнаете. Ну, пока ваши пользователи не начнут сообщать вам об этом. Очень неприятная вещь!

🤔 Что такое CPU Exceptions в iOS?

Согласно Apple, ваше приложение может грузить процессор — до тех пор, пока оно в foreground и не делает это долго.
Однако в фоне вам необходимо сократить использование процессора. Это не то чтобы большая проблема, если задача выполняется единожды.
Но если вы постоянно используете более 80% процессора в течение одной минуты, iOS без предупреждения закроет приложение.

Это называется CPU Exception, или "прекращение работы при высокой нагрузке на процессор".

📖 В статье разбирается это понятие, рассматривается Xcode's Energy Organizer и приводится совет для предотвращения.

@iOS Dev
👍14🔥2
Простой способ подсчитать количество строк в ваших Swift-файлах

Для этого вам понадобится терминал. Нужно перейти в корень вашего проекта и скопировать эту команду (для чистоты эксперимента тут исключено содержимое зависимостей CocoaPods):

find . -path ./Pods -prune -o -name '*.swift' -print0 ! -name '/Pods' | xargs -0 wc -l

Это не всё! Если вы хотите большего, то с помощью этой утилиты можно по фану определить стоимость кода в проекте💰.

@iOS Dev
👍20👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Субботний опенсорс

🛠 Полезный репозиторий с реализацией нескольких сортировок.

Бонусом идёт наглядная демонстрация процесса (в примере для этого показано отображение для Quick Sort).

Используется Swift Playgrounds.

@iOS Dev

#opensource
👍18🔥3
Различные способы перехвата ошибок в Swift при использовании do-catch

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

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

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

@iOS Dev
👍21
Clean Architecture и MVVM в iOS: пример реализации проекта

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

Как мы видим на графике Clean Architecture, у нас есть различные слои в приложении. Главное правило — не иметь зависимостей от внутренних слоев к внешним. Стрелки, указывающие снаружи внутрь, это правило зависимостей. Зависимости могут быть только от внешнего слоя внутрь.

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

🛠 Проект на Github, который может быть использован в качестве шаблона.

@iOS Dev
👍25🔥4🤯32😱1
This media is not supported in your browser
VIEW IN TELEGRAM
Когда скопировал два решения со StackOverflow

На самом деле это решение от изобретателя с ником The Q (подозреваю, тут есть связь с Джеймсом Бондом).

По легенде, автор сломал колесо своего обычного байка. А после этого решил не выбрасывать его и распилил на две равные половины, после чего и собрал новую версию транспорта — «по формуле 1+0,5+0,5=2».

😅 Иногда хочется поделиться не только серьёзными вещами.

@iOS Dev
😁34👍3🤩2😱1
PhotosPicker: инструмент выбора фотографий с помощью SwiftUI и Transferable

📖 В этой статье рассказывается, как использовать новый SwiftUI PhotosPicker API, о котором было объявлено на одной из сессий #WWDC.

Новый SwiftUI PhotosPicker API доступен на всех платформах:

iOS (16.0+)
iPadOS (16.0+)
macOS (13.0+)
watchOS (9.0+)

Больше не нужно использовать UIViewControllerRepresentable для обертывания PHPickerViewController или его старой версии UIImagePickerController.

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

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

Для внедрения нужны два шага:

1️⃣ Использовать PhotosPicker для получения одного или нескольких экземпляров PhotosPickerItem.
2️⃣ Загрузить данные об объекте с помощью PhotosPickerItem.loadTransferable.

@iOS Dev
👍12🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
Использование StoreKit для продвижения ваших приложений

💡Поделюсь советом для тех, у кого есть несколько пет-проектов или для компаний, которые интересуются возможностью кросс-промо😉.

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

Есть целый ряд опций, как это сделать — получить список продуктов, кастомный лейаут для каждого, вбить название и добавить кнопку со ссылкой, например. Можно сделать проще со StoreKit, а точнее, с SKOverlay.

Ниже пример (можете написать свой):

func displayOverlay() {
guard let scene = view.window?.windowScene else { return }

let config = SKOverlay.AppConfiguration(appIdentifier: "APP_ID", position: .bottom)
let overlay = SKOverlay(configuration: config)
config.userDismissible = false
overlay.present(in: scene)
}


В этом коде APP_ID — числовой идентификатор в аппстор.

One more thing, если баннер не должен скрываться по свайпу:

config.userDismissible = false

Специально для @iOS Dev.
👍18🔥6
Продолжаю делиться находками с #WWDC и iOS 16

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

🙂 Теперь мы можем получать пути к системным папкам непосредственно из свойств URL.

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

@iOS Dev
👍42🔥8😱1
Семантика версионирования для Swift Package и не только

Представьте, что мы используем библиотеку из популярного пакета Swift. Что случится, если выпустят новую версию с огромными изменениями в ее публичном API? Наш код может сломаться. Чтобы избежать этой проблемы, мы могли бы полагаться на единственную версию. Хуже, если каждый владелец пакета имеет свой способ работы с версиями. Такие сценарии называются адом зависимостей (dependency hell).

Семантическое версионирование - это спецификация, призванная положить конец аду зависимостей. Она разделяет версии на три числа: major, minor и patch (например, 1.5.8). Вот что означает каждый номер:

🔵 Major — публичный API изменился, что требует обновления нашего кода.
🔵 Minor — в общедоступный API был добавлен новый код, который не нарушает существующие интеграции (обратная совместимость).
🔵 Patch — были исправлены ошибки без изменения публичного API.

📖 Здесь понятно объясняется, почему нужно делать именно так на примерах.

@iOS Dev
👍23
Как отменить асинхронную задачу в Swift?

💡Один из возможных способов — использование DispatchWorkItem.

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

@iOS Dev
👍26🤔3👏1
‼️ Сегодня 30 июня, а значит, что пора наконец уже реализовать в ваших приложениях удаление профиля, если вы этого ещё не сделали.

В целом, ситуация не выглядит сложной, если вы используете решения, в которых нет Sign In от Apple или же у вас собственный сервер для этого 😅.

Например, в одном из моих приложений используется как раз связка Sign In + Firebase, и, как оказывается, разработчики ещё не реализовали отзыв токена. К слову, iOS тоже такого инструмента не предоставляет, нужно генерить JWT и отзывать его только с помощью сервера.

Вероятно, в будущем или Google, или Apple уже упростят нам жизнь. А пока что можно воспользоваться решением из треда Firebase, или же от Ивана:

👏 Вот пост, который может пригодиться (как минимум, натолкнёт на правильный ход мыслей).

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

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

❤️ Слежу за развитием событий, ваш @iOS Dev
15👍7🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
RoomPlan в iOS 16 — 3D-планы этажей в ваших приложениях

Это новый API Swift, работающий на базе ARKit, использует камеру и сканер LiDAR на iPhone и iPad. Теперь ваши приложения могут создавать трехмерные планы этажей, включая ключевые характеристики, такие как размеры и типы мебели.

Фреймворк использует датчики устройства, ML-модели и RealityKit для захвата физического окружения. Например, фреймворк просматривает записи с камеры устройства и показания LiDAR и определяет стены, окна, проемы и двери. RoomPlan распознает особенности помещения, мебель и технику, например, камин, кровать или холодильник, и передаёт данные в приложение.

Для захвата используется RoomCaptureView. Есть виртуальные подсказки по мере перемещения по комнате:

Графические наложения в реальном времени отображаются поверх объектов в комнате, чтобы передать ход сканирования.

Если фреймворк требует определенного вида движения или ракурса, UI покажет инструкции, как расположить устройство.

🛠 Пример кода (нужен Xcode 14).

@iOS Dev
👍18🔥11🤯2
Полное руководство по использованию таймеров в Swift
О создании, повторениях и не только.

Класс Timer в Swift - это гибкий способ планирования будущих задач, как однократно, так и многократно.

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

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

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

@iOS Dev
🔥16👍52