iOS Broadcast
3.41K subscribers
1.75K photos
85 videos
995 links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
🍏 Итоги презентации Apple
Спасибо всем кто смотрел вместе с нами на стриме, первый опыт, пишите в комментарии зашел ли вам такой формат, хочется ли трансляции других ивентов?

AirPods Pro 3
🟢 Улучшили шумоподавление до 4 раз
🟢 Новая форма силиконовых накладок и сразу 5 размеров
🟢Новая интеграция с онлайн переводом, по-сути фишка iPhone
🟢Добавили датчик определения пульса

Apple Watch 11
🟢Определение повышенного артериального давления
🟢Научились определять апное сна
🟢Улучшилось время жизни с 18ч до 24ч

iPhone 17
🟢ProMotion 120 Гц
🟢Процессор 3нм
🟢Значительно улучшили фронтальную камеру

iPhone Air
🟢Тонкий, одна камера сзади 48 Мп с кропом X2
🟢iPhone сможет снимать сразу на 2 камеры (не понятно все или только новые)

iPhone Pro
🟢В eSIM-only версии аккумулятор больше
🟢Три 48 Мп камеры

Как вам новинки? 👍 / 🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔18👍7🔥41
Набор советов по дебагу iOS приложений
Название достаточно громкое, "Я потратил 5 лет на неправильный дебаг, вот как нужно". Но советы действительно полезные:

Не эффективно:
🔴Множество print-ов для отладки
🔘Разделяю мнение автора. Но все таки полезно сделать нормальное логирование, а ситуационные print-ы так себе подход
🔴Закомментировать все и постепенно раскомментировать
🔘Точно не лучший способ, сколько раз из-за багов Xcode компиляции я думал что все исправил
🔴Магические константы
🔘Примеры в статье странные, я бы обозначил это так: не чините баги с помощью Dispatch.asyncAfter

Что эффективно:
🟢Conditional Breakpoints.
Эффективно но сложно в настройке, применял только в самых сложных сценариях
🟢LLDB команды для терминала. po, expr, image, thread, frame
🟢Debug View Hierarchy - очень полезно, когда работает
🟢Включайте точки остановки при runtime ошибках

Что еще использую лично я?
🔵Proxy для моккирования сети
🔵Выстраивание архитектуры через UDF
🔵Логирование переходов из состояния в состояние
🔵Автотесты для воспроизведения ошибочного сценария
🔵Форматирование контента логируемых объектов (debugDescription)
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🤔1
Превращение журналов CI в действия
В обзоре дебага я немного коснулся логирования. Но логирование нужно не только для для отлаживания багов, но для CI. Просмотр журналов CI при падении утомителен и неэффективен. Использование скриптов для комментариев и оповещений дублирует логику. Разберемся как использовать специальные строки журнала и оболочку для автоматизации действий.

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

Реализация на Swift
🔵Используется подпроцесс для выполнения команды сборки и анализа журналов.
🔵Подпроцесс удаляет первый аргумент и гарантирует прозрачность stderr.
🔵Вывод стандартного вывода анализируется и обрабатывается.

Добавление комментариев к PR
🔵Лог-коммандер получает переменные окружения для авторизации на GitHub.
🔵Создается клиент GitHubClient для публикации комментариев.
🔵Лог-коммандер анализирует строки журнала в формате JSON и публикует комментарии.

Манипуляция средой
🔵Дочерний процесс не должен знать об авторизации на GitHub.
🔵Среда манипулируется в исходном вызове run для удаления переменной GITHUB_TOKEN.

Преимущества и расширение
🟢Единая оболочка упрощает процесс отладки и уменьшает дублирование логики.
🟢Можно расширить функциональность для создания оповещений Slack, метрик и других действий.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
С праздником, 256 день года!
134👍4
📱 Новый WebView в SwiftUI
Apple представила новый SwiftUI WebView для отображения веб-контента. Веб-просмотр доступен для iOS 26, macOS 26 и других версий. Одна из немногих фич, которую точно стоит прикручивать с бекпортом сразу при релизе. Веб-просмотр является частью фреймворка WebKit, отличий в рендеринге не будет, а вот API сильно приятнее.

Два подхода к отображению веб-контента
🔵Простая загрузка по URL-адресу с помощью инициализатора WebView(url:).
🔴Усовершенствованный контроль с помощью инициализатора WebView(_:), который принимает WebPage object.

Простая загрузка по URL-адресу
🔵Подходит для быстрого отображения веб-контента без сложного взаимодействия.
🔵Автоматически выполняет загрузку и предоставляет базовые навигационные жесты.
🔵Легко интегрируется с системой управления состоянием SwiftUI.

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

Преимущества WebView
🟢Встроенная интеграция решает проблемы управления памятью и синхронизации состояний.
🟢Упрощенный API упрощает сложные операции, такие как внедрение JavaScript.
🟢Возможность использования модификаторов для настройки поведения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🐥 Swift 6.2 зарелижен!
Пока все радуются iOS 26, давайте вспомним, что же нам стало доступно вместе с релизом Swift 6.2.

Approachable Concurrency

Swift 6.2 упрощает параллельное программирование:
🟢Запуск в главном потоке по-умолчанию без указания @MainActor
🟢Упрощенные async функции: можно писать асинхронный код без доступа к мутации состояния
🟢Явное обозначение многопоточности через @concurrent

Safe Systems Programming
Новые фичи по написанию низкоуровневого быстрого кода безопасно:
🟢InlineArray - новый массив с фиксированным количеством элементов
🟢Span - безопасный и простой способ обращаться напрямую к памяти
🟢В Embedded Swift теперь доступна работа с типом String
🟢Интероп C++ и Swift так же может использовать безопасные абстракции из Swift для обеспечения безопасности C++
🟢Повышенная безопасность памяти - флаг позволяющий ограничивать небезопасные конструкции типа unsafe pointer

Swift расширение для VS Code официально в релизе:
🟢Индексация в фоновом потоке
🟢Встроенная поддержка LLDB дебага
🟢Панель по работе с проектом
🟢Интерактивное preview DocC

Точный контроль над "ворнингами"
Предупреждениями компилятора теперь можно гранулярно управлять через установку diagnostic group идентифицируемой именем. Например, теперь можно выставить "считать все предупреждения ошибками" кроме предупреждений о депрекейтах API.
.target(
name: "MyLibrary",
swiftSettings: [
.treatAllWarnings(as: .error),
.treatWarning("DeprecatedDeclaration", as: .warning),
]
)


Улучшили дебаг многопоточки:
🟢Надежный async: пошаговый режим для асинхронных функций в LLDB, даже если асинхронный вызов требует переключения потоков.
🟢Контекст задачи: Узнайте, в какой задаче выполняется фрагмент кода, когда он останавливается на точке останова или при просмотре трассировки стека для текущего потока.
🟢Именованные задачи: при создании задач присваивайте им понятные имена, которые будут отображаться в контексте задачи в инструментах отладки и профилирования.

Подпроцесс
В Swift 6.2 представлен новый пакет Subprocess с оптимизированным API для запуска внешних процессов и управления ими.
import Subprocess

let swiftPath = FilePath("/usr/bin/swift")
let result = try await run(
.path(swiftPath),
arguments: ["--version"]
)
let swiftVersion = result.standardOutput


Foundation
Библиотека Foundation включает современный NotificationCenter API, который использует конкретные типы уведомлений вместо строк и нетипизированных словарей. Типы уведомлений также указывают, отправляются ли они синхронно на основной актор или асинхронно через соответствие MainActorMessage или AsyncMessage.

Observation
Swift 6.2 позволяет транслировать изменения состояния наблюдаемых типов в рамках транзакций с помощью нового типа асинхронной последовательности Observations . Это позволяет избежать избыточных обновлений пользовательского интерфейса, повышает производительность и гарантирует, что ваш код будет реагировать на согласованный снапшот изменения.

Тестирование
Новые API для повышения выразительности тестов и результатов тестирования.
🟢Exit testing позволяет убедиться, что код завершает работу при определённых условиях, например при невыполнении предварительного условия.
🟢Attachments позволяют добавлять в результаты тестирования дополнительный контекст, в том числе строки, изображения, логи и другие артефакты
🟢Raw identifier display names - позволяют настраивать имена тестовых функций
  -@Test("square() returns x * x")
-func squareIsXTimesX() {
+@Test func `square() returns x * x`() {
#expect(square(4) == 4 * 4)
}


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

Что из этого вы больше всего ждали?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2
🐥 Фичефлаги в Swift
Фичефлаги - простая пятничная тема на обсудидить. Флаги позволяют включать и выключать определенные функциональные возможности в зависимости от условий. Если вы используете trunk-based подход, то вы точно активно пользуетесь фичефлагами. В статье разбирается базовая реализация фичефлагов, которую можно значительно улучшить. Что бы я заложил, если передо мной стояла задача реализовать фичефлаги в новом приложении:
🟢Фичефлаги бывают локальные и ремоут. Локальные не должно быть возможности переопределять в production конфигурации
🟢Гораздо эффективнее предоставлять API, позволяющее сразу получить значение и подписаться на обновление, тогда экран будет котов к тому что новая конфигурация прилетит в процессе lifecycle
🟢В Debug конфигурации должен быть простой способ управлять фичефлагами
🟢Если управление флагами находится в DEBUG меню, это должно при компиляции исключаться из Production конфигурации
🟢Состояние фичефлагов в каждый момент времени очень важна для отладки и тестирования и должена быть заложена возможнотсь получить снапшот что включено
🟢Критически важно следить за фичефлагами и своевременно их удалять.

Вы используете фичефлаги в своем прилоежнии? Если да, то что бы вы еще отметили? Если нет, то почему?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42
⚠️ Как использовать [weak self] в задачах параллелизма Swift?
Навалим немного базы:[weak self] используется для предотвращения утечек памяти в замыканиях. В обработчиках завершения [weak self] и guard let self используются для проверки существования self перед продолжением выполнения. Но SE-0269 позволяет использовать неявные self-захваты в ситуациях, когда замыкания не сохраняются, что снижает вероятность утечек памяти.

Проблемы с [weak self] в Task
🟢Task начинает выполняться сразу после создания, что уменьшает вероятность освобождения self.
🟢Использование guard let self else { return } в начале Task не предотвращает утечку памяти, так как Task удерживает strong ссылку на self до завершения.

Предотвращение утечек памяти в Task
🟢Можно использовать nil проверку или guard let self else { return } внутри Task для проверки существования self.
🟢Для длительных задач можно перемещать guard let self else { return } внутрь цикла, чтобы захватывать strong ссылку на self только при необходимости.

Рекомендации по использованию [weak self] в Task:
⚠️ Большинство Task замыканий не требуют [weak self], так как Task обычно существует недолго
⚠️ Если необходимо избежать утечек памяти, не используйте guard let self else { return } в первой строке Task
⚠️ Разворачивайте self только тогда, когда это нужно, и храните его как можно короче
⚠️ Используйте self? для избежания полного разворачивания self
⚠️ Если возможно, захватывайте только необходимые свойства, а не весь self
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤔2
🐥 Как Swift Runtime влияет на производительность iOS-приложений
Я помогаю с подготовками статей и это официально самая сложная из них, как в плане материала, так и по доработке подачи. Постарался помочь найти баланс между хардкором и капитаном очевидностью. Комментариев не много, так что либо все понятно, либо вообще ничего не понятно.
Суть рассказа - метод swift_conformsToProtocolMaybeInstantiateSuperclasses который значительно замедляет запуск приложения, а используется повсеместно - as?, as!, String(describing:) и String(reflecting:).
🟢Начинать оптимизацию приложения стоит с более простых вещей
🟢Советы из статьи помогут уменьшить негативное влияния Swift Runtime
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍3
🐥 Отмена асинхронных задач в SwiftUI
Неустаревающая классика, ручное и автоматическое завершение задач в Swift, сколько провожу собесы, столько разработчики валятся на этом вопросе. Если с NSOperations и GCD еще были нюансы, то в Swift Concurrency, мне казалось, все очевидно. База:
🟢SwiftUI привязывает задачи к жизненному циклу View, что часто приводит к автоматической отмене.
🟢В некоторых случаях может потребоваться явный контроль или запрет отмены.

Использование модификатора .task
🟢Модификатор .task запускается при появлении View и отменяется при его исчезновении.
🟢Пример 1: загрузка элементов при появлении ContentView.

Повторение работы с модификатором .task(id:)
🟢Модификатор .task(id:) запускается при появлении представления и повторяется при изменении идентификатора.
🟢Пример 2: обработка поиска или фильтрации в SearchView.

Проверка отмены в коде
🟢Для длительных циклов или множественных ожиданий полезно явно проверять наличие отмены с помощью try или Task.checkCancellation().
🟢Пример 3: загрузка элементов с проверкой отмены.

Долгоживущие задачи
🟢Задачи, не привязанные к представлению, не отменяются автоматически.
🟢Пример 4: загрузка данных в общий кэш в DataService.

Ручная отмена задач
🟢Можно сохранить ссылку на задачу и вызвать task.cancel() для ручной отмены.
🟢Пример 5: отмена загрузки данных при выходе из системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM