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

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

#ios #mobile #swift
加入频道
Улучшения для камеры ожидаемы, всё большее влияние отдаётся алгоритмам

Рассказывают о дополнительном режиме оптического зума, формате Apple ProRaw, всё большем влиянии нейросетей на фото (мы догадывались).

🟢 Камера — 48 мегапикселей.

🟢 Более качественная макросъёмка.

🟢 Улучшения при плохом освещении.

🟢 Режим 2x/3x для топовых моделей.

@iOS Dev
Все фишки iPhone 14 Pro в сводной инфографике

🌝 iPhone 14 Pro от $999.

🌚 iPhone 14 Pro Max от $1099.

@iOS Dev
iOS Dev
Новые крутые анимации у чёлочки! Ох, чувствую, надо ждать нового API для работы. Посмотрим, на каком левеле будет доступна кастомизация (и будет ли в целом). @iOS Dev
Новый термин для чёлки, простите, выемки сверху

Dynamic Island — фиксируем, запоминаем, ждём описания, можно ли с этим работать.

@iOS Dev
Хотели бы что-то изменить в своём наборе гаджетов от Apple?
Anonymous Poll
13%
Apple Watch Series 8
22%
Apple Watch Ultra
35%
AirPods Pro (2nd generation)
4%
iPhone 14
53%
iPhone 14 Pro
24%
Оставлю всё как есть
Трансляция Apple подошла к концу!

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

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

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

Совсем скоро пора выкатывать фичи для iOS 16 в прод (запомните дату 12 сентября).

❤️ А пока что хочу сказать спасибо тем, кто читал трансляцию. Если вам понравился формат, поддержите любой реакцией, random() вполне подойдёт.

@iOS Dev
Невероятно, но факт — разрешение Apple Watch Ultra, больше чем у первого iPhone!
Кто бы в это мог поверить несколько лет назад

😳 Часы, показанные на конференции, обладают разрешением 410x502 px, в то время как у первого iPhone разрешение было 320x480 px.

@iOS Dev — следим за прогрессом!
5 способов изменить размер изображения: простые и продвинутые техники

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

📖 Примеры, которые рассматриваются в этой статье, охватывают фреймворки как низкого, так и высокого уровня, от Core Graphics, vImage до Core Image и UIKit:

Использование UIGraphicsImageRenderer.

Использование Core Graphics Context.

Создание миниатюр с помощью Image I/O.

Ресэмплинг Lanczos с помощью Core Image.

Масштабирование изображения с помощью vImage.

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

@iOS Dev
Разбор вариантов рефакторинга в Xcode для async/await
Как с лёгкостью внедрить асинхронные функции в свой код

Xcode может предложить до трех вариантов рефакторинга при щелчке правой кнопкой мыши на функции:

1️⃣ Преобразовать функцию в асинхронную.
Это критическое изменение, то есть сигнатура функции станет другой, и вам нужно обновить все места, в которых функция вызывается!

2️⃣ Добавить асинхронную альтернативу.
Существующая сигнатура функции останется прежней, но реализация функции будет заменена для использования вновь созданной асинхронной функции.

3️⃣ Добавить асинхронную обёртку.
Существующая функция останется неизменной, и добавится новая асинхронная функция, которая использует withCheckedThrowingContinuation для повторного использования существующей функции.

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

@iOS Dev
Создание кастомной UICollectionViewListCell с помощью SwiftUI

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

Прочитав материал, вы узнаете:

1️⃣ Как использовать UIHostingConfiguration (уже был пост здесь).

2️⃣ Как регулировать высоту ячейки.

3️⃣ Как регулировать separator insets.

4️⃣ Как настраивать лэйаут для ячеек.

В конце статьи вы сможете использовать UIHostingConfiguration в таком виде:

let hostingConfiguration = UIHostingConfiguration {
MyFirstSwiftUICell(item: item)
}.margins(.horizontal, 50)


ℹ️ Важно помнить, что UIHostingConfiguration доступен только в iOS 16 и выше. Если вашему приложению по-прежнему необходимо поддерживать версию iOS ниже, чем iOS 16, вы можете подумать об использовании иных способов.

@iOS Dev
Создание калькулятора в стиле Apple на SwiftUI с использованием MVVM

C помощью этих материалов вы сможете калькулятор в стиле Apple с нуля.

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

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

1️⃣ Создание интерфейса.
В этой части рассказывается как наиболее похоже воспроизвести калькулятор Apple, следуя некоторым лучшим практикам создания и управления вьюхами в проекте.

2️⃣ Бизнес-логика.
В этом материале исследуются принципы формирования бизнес-логики для калькулятора в Swift, используя модель MVVM с учетом лучших практик.

🛠 Код для первой части.
🛠 Код для второй части.

🛠 Репозиторий с проектом.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Как использовать UIViewController в SwiftUI?

SwiftUI и UIKit будут сосуществовать еще долгое время.

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

К счастью, Apple упрощает перенос кода UIKit в SwiftUI.

📖 В этой статье объясняется, как использовать UIViewController в качестве View в SwiftUI.

@iOS Dev
QUFBRUlRQUFBQ0FBQUFRVUFBQUVQUUFBQkZFQUFBUThBQUFBSUFBQUJCOEFBQVJBQUFBRVBnQUFCRE1BQUFSQUFBQUVNQUFBQkR3QUFBUThBQUFFT0FBQUJFRUFBQVJDQUFBRU1BQUFBQ0FBQUFRK0FBQUVRZ0FBQUNBQUFBQnBBQUFBVHdBQUFGTUFBQUFnQUFBQVJBQUFBR1VBQUFCMkFBQUFMQUFBQUNBQUFBUStBQUFFUndBQUJEVUFBQVE5QUFBRVRBQUFBQ0FBQUFRNkFBQUVRQUFBQkVNQUFBUkNBQUFFUGdBQUFDd0FBQUFnQUFBRVJ3QUFCRUlBQUFRK0FBQUFJQUFBQkVNQUFBQWdBQUFFUWdBQUJEVUFBQVF4QUFBRVR3QUFBQ0FBQUFRL0FBQUVQZ0FBQkRzQUFBUkRBQUFFUndBQUJEZ0FBQVE3QUFBRVBnQUFCRUVBQUFSTUFBQUFJQUFBQkVBQUFBUXdBQUFFTndBQUJETUFBQVF3QUFBRU5BQUFCREFBQUFSQ0FBQUVUQUFBQUNBQUFBUk5BQUFFUWdBQUJENEFBQVJDQUFBQUlBQUFCRG9BQUFRK0FBQUVOQUFBQUNFQUFBQUtBQUFFSHdBQUJENEFBQVJCQUFBRVFnQUFCREFBQUFReUFBQUVUQUFBQUNBQUFmUEdBQUFBSUFBQUJESUFBQUFnQUFBRVRRQUFCRUlBQUFRK0FBQUVQQUFBQUNBQUFBUS9BQUFFUGdBQUJFRUFBQVJDQUFBRU5RQUFBQ3dBQUFBZ0FBQUVSd0FBQkVJQUFBUStBQUFFTVFBQUJFc0FBQUFnQUFBRU5BQUFCRDRBQUFRNkFBQUVNQUFBQkRjQUFBUXdBQUFFUWdBQUJFd0FBQUFzQUFBQUlBQUFCRWNBQUFSQ0FBQUVQZ0FBQUNBQUFBUkRBQUFBSUFBQUJFSUFBQVExQUFBRU1RQUFCRThBQUFBZ0FBQUVQd0FBQkQ0QUFBUTdBQUFFUXdBQUJFY0FBQVE0QUFBRU93QUFCRDRBQUFSQkFBQUVUQUFBQUNrQUFBQWdBQUFBYUFBQUFIUUFBQUIwQUFBQWNBQUFBSE1BQUFBNkFBQUFMd0FBQUM4QUFBQjBBQUFBTGdBQUFHMEFBQUJsQUFBQUx3QUFBR2tBQUFCUEFBQUFVd0FBQUY4QUFBQkRBQUFBWVFBQUFISUFBQUJsQUFBQVpRQUFBSElBQUFBdkFBQUFNZ0FBQURNPQ==

Hint: Стандарт ISO 646 (ECMA-6) предусматривает возможность размещения национальных символов. -> Стандарт ISO 10646 определяет 31-битную форму кодировки, названную UCS-4.
Создание гистограмм с помощью SwiftUI Charts в iOS 16

На WWWDC 2022 Apple представила диаграммы SwiftUI, которые упрощают создание различных графиков в SwiftUI.

📖 В этой статье показано, как быстро создать и настроить диаграммы, содержащие несколько наборов данных.

@iOS Dev

P.S. В посте выше было скрыто поздравление с нашим профессиональным праздником 🎉 (подсказки ASCII и UTF-32, а дальше дело техники).

Кстати, справились с задачей и дошли до последнего шага двое читателей, моё почтение!
Как обновить содержимое ячейки при использовании UIHostingConfiguration

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

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

С появлением UIHostingConfiguration в iOS 16 мы наконец-то можем использовать возможности двустороннего биндинга (связывания), которое существует только в SwiftUI.

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

Это означает, что нам больше не нужно вызывать reloadItems(at:) для обновления ячейки или вызывать reconfigureItems(at:) для обновления снэпшота.

📖 Изменения звучат интригующе, рекомендую прочесть этот материал, или сразу перейти к репозиторию с примерами кода.

@iOS Dev
Отображение данных в реальном времени с помощью Live Activity и Dynamic Island
Материал о том, как создавать интерактивные действия, которые отображают самые последние данные вашего приложения в Dynamic Island и на экране блокировки.

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

Live Activity используют функциональность WidgetKit и SwiftUI для пользовательского интерфейса.

Роль ActivityKit заключается в управлении жизненным циклом каждого Live Activity: мы можем использовать его API для запроса, обновления и завершения Live Activity.

📖 В официальной документации Apple рассматриваются следующие аспекты:

🔘 Требования и ограничения Live Activity.

🔘 Как добавить поддержку Live Activity в свое приложение.

🔘 Как определить набор статических и динамических данных.

🔘 Создание конфига для вашей Live Activity.

🔘 Создание Lock Screen view.

🔘 Создание compact, minimal и expanded views.

🔘 Как стартовать и обновлять Live activity.

ℹ️ Важно! Live Activity в настоящий момент доступны только на iPhone.

ℹ️ Размер обновленных динамических данных как для обновлений ActivityKit, так и для push-уведомлений не может превышать 4 КБ.

@iOS Dev
Как 5 приложений для iOS могут сократить время запуска в среднем на 28%

📖 Занимательное исследование от Emerge tools поможет разобраться в этом.
Ведь важна каждая миллисекунда (или нет?).

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

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

Lyft сообщила об увеличении количества пользовательских сеансов на 5% благодаря сокращению времени запуска их приложения для водителей на 21%.

Apple сделала время запуска предметом многочисленных презентаций #WWDC (раз, два, три).

Плюс статьи в том, что это настоящие оптимизации, которые применяются к публичным сборкам App Store без участия разработчиков.

😳 Интересный факт!

Приложение Zoom фактически тратит 41 мс на usleep в основном потоке во время запуска.

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

@iOS Dev
Знали ли вы, что первоначально Swift назывался Shiny?
Так почему же мы называем его свифтом? Я решил поискать причины, и ниже расскажу вам короткую, но интересную историю, а поможет нам Крис Латтнер (создатель Swift, LLVM и компилятора Clang). Далее, с его слов.

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

⭐️ Shiny было кодовым именем. Многие вещи в Apple тогда, да и вообще во многих компаниях, когда вы начинаете, имели временное название. Если быть более точным, то в 2010 году даже был каталог на ноутбуке Криса.
И когда вам нужно выбирать имя проекта, вы понятия не имели, во что оно превратится в итоге.

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

📺 Это была отсылка к «Светлячку» — телесериалу, который очень хорош (лично я подтверждаю, сериал смотрится легко даже спустя столько времени).

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

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

🤔 Оказалось, что есть еще один язык под названием Swift — маленький исследовательский язык, по сути. Как и в случае с именованием в компьютерных API, именование продуктов - это сложно, потому что все хорошие имена уже заняты, и это действительно очень, очень сложная проблема.

В итоге они остановились на слове Swift, так как оно подразумевает правильные вещи. Кроме того, оно оказалось точно такой же длины, как Shiny, так что это значительно упростило пересмотр истории в системе контроля версий!

Ещё один интересный факт со слов Джордан Роуз, магическое число для модулей Swift это блестящий (shiny) или сверкающий эмодзи. Крис Латтнер добавил, что магические числа это старая школа Unix и, конечно, Swift будет использовать эмодзи.

Так что shiny всегда будет где-то там, вместе с нами.

@iOS Dev❤️, если вы смотрели «Светлячка»
Что означает ключевое слово «any»? Разбор Type Erasure в Swift

Концепция Type Erasure сама по себе не нова для Swift, но она была радикально улучшена в Swift 5.7 с помощью добавления ключевого слова с префиксом anyе путать с написанным с заглавной буквы Any!) и апгрейдом уже существующего ключевого слова some непрозрачного типа (Opaque Type).

📖 В этой статье автор разбирает концепцию Type Erasure: как это происходило раньше, что нового появилось в Swift 5.7 и как эти изменения работают.

Материал содержит следующие основные блоки:

Что, черт возьми, представляет Type Erasure на самом деле?

Swift 5.7: новое ключевое слово any.

Вспомогательные функции и расширение возможностей: opaque parameters, primary associated types.

@iOS Dev
Как изменить значение переменной с помощью брейкпоинта?

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

1️⃣ Добавьте брейкпоинт.

2️⃣ После установки выберите Edit Breakpoint.

3️⃣ Установите Action со значением Debugger command.

4️⃣ Укажите требуемое действие.

5️⃣ Выберите Automatically continue after evaluating actions для того, чтобы приложение не остановилось на нашем брейкпоинте после выполнения указанного действия.

👨‍💻 Тем самым мы вполне можем сэкономить время при тестировании или воспроизведении ошибки, не перезапуская приложение.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Объяснение взаимоблокировок (deadlocks) в Swift: обнаружение проблем и их способы их решения

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

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

Хотя такие функции, как акторы, уменьшают количество потенциальных дэдлоков, с которыми вы столкнетесь, вероятность их появления по-прежнему высока.

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

📖 Антуан Ван Дер Ли с помощью своего 10-летнего опыта рассказал о причинах взаимоблокировок и поделился, как можно сузить радиус поиска.

@iOS Dev