Network Link Conditioner: Simulating Slow Networking
👀 Если вы не знали как тестировать состояния сетевого соединения, то эта статья для вас.
⌛ Network Link Conditioner позволяет тестировать приложения в условиях медленной сети на macOS и iOS, предлагая профили, такие как 3G и Edge.
⚙️ На iOS Network Link Conditioner доступен в разделе инструментов разработчика в настройках, где можно выбрать предустановленный профиль или создать свой.
⚙️ Чтобы установить Network Link Conditioner на macOS, необходимо загрузить дополнительные инструменты для Xcode через меню Xcode и найти его в папке Hardware.
➡️ Тестирование приложений в условиях медленной сети критически важно для обеспечения хорошего пользовательского опыта, особенно для пользователей с низкой скоростью интернета.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Потоки под капотом: как работают многопоточность и синхронизация в iOS
Если хотели разобраться в многопоточности - статья для вас - все достаточно хорошо и понятно написано.
Ниже приведу пару тезисов.
🕯 Конкурентность подразумевает чередование выполнения задач, в то время как параллелизм требует наличия нескольких процессорных ядер для одновременного выполнения задач.
ℹ️ Процесс — это экземпляр запущенной программы, который может содержать несколько потоков, выполняющихся в одном адресном пространстве, что позволяет эффективно управлять ресурсами.
⚙️ iOS предлагает инструменты, такие как GCD и Swift Concurrency, для управления потоками и задачами, обеспечивая оптимальное распределение ресурсов и упрощая разработку многопоточных приложений.
📊 Закон Амдала описывает, что ускорение программы, достигнутое за счет параллельной обработки, ограничено последовательными участками кода, которые не могут быть распараллелены.
Если хотели разобраться в многопоточности - статья для вас - все достаточно хорошо и понятно написано.
Ниже приведу пару тезисов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
How to create and upload high-quality App Store assets with RocketSim and Helm
👀 Недавно вспоминали RocketSim. Держите статью, про упрощение создания качественных изображений для AppeSrore.
💡 RocketSim предлагает инструменты для создания оптимизированных скриншотов и видео-превью, что помогает выделить уникальные функции вашего приложения.
⭐️ Helm автоматизирует загрузку скриншотов, позволяя перетаскивать их из Finder и автоматически сортируя по устройствам и языкам.
➡️ Поддержка загрузки видео-превью в Helm запланирована на будущее.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Introducing gRPC Swift 2
🔝 gRPC Swift 2: Что нового и зачем это нужно?
Вышла вторая версия gRPC Swift — теперь с нативной поддержкой async/await и глубокой интеграцией в SwiftNIO. Это делает асинхронные RPC-вызовы проще, а код — чище, без ада с коллбэками.
⚡️ gRPC Swift 2 поддерживает все фичи протокола: от стримов до метаданных, плюс кодогенерация из .proto-файлов. Включает в себя умные функции клиента, такие как балансировка нагрузки, механизм разрешения имен и автоматические повторные попытки.
⚙️ gRPC Swift 2 распределен как набор пакетов, позволяя разработчикам выбирать только те компоненты, которые им необходимы.
Вышла вторая версия gRPC Swift — теперь с нативной поддержкой async/await и глубокой интеграцией в SwiftNIO. Это делает асинхронные RPC-вызовы проще, а код — чище, без ада с коллбэками.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Swift 6: What’s New and How to Migrate
⚠️ Статья Antoine van der Lee
— гайд по апдейту проектов и пакетов под Swift 6. Акцент на настройке Xcode, обработке предупреждений и переходе на новую модель конкурентности.
⚙️ Подсветка ключевых параметров: включаем
➡️ Рекомендуется поэтапная миграция проектов, начиная с изолированных частей кода, с поэтапным включением новых функций и строгой проверки параллелизма.
💡 Не спешите, исправляйте предупреждения по мере их появления и открывайте запросы на изменения для небольших изменений, чтобы упростить процесс.
— гайд по апдейту проектов и пакетов под Swift 6. Акцент на настройке Xcode, обработке предупреждений и переходе на новую модель конкурентности.
-strict-concurrency=complete
и фиксим deprecated-методы. Автор советует не откладывать миграцию — Swift 6 ломает обратную совместимость в угоду безопасности.Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
@unknown default usage with enums in Swift
⚠️ Конструкция
❓ Когда использовать?
Если enum может расширяться без вашего контроля (например, серверные модели). Для своих enum хватит обычного
➡️
@unknown default
была введена в Swift 5 для работы с перечислениями и помогает подготовиться к будущим изменениям API от Apple.enum AppState: CaseIterable {
case active, background
@unknown default // На случай, если в Swift 6 добавят новый кейс
}
func handle(state: AppState) {
switch state {
case .active: print("App alive!")
case .background: print("App sleep...")
@unknown default: print("WARNING: New state detected!")
}
}
Если enum может расширяться без вашего контроля (например, серверные модели). Для своих enum хватит обычного
default
— иначе потеряете в читаемости.Frozen
перечисления никогда не получат новых случаев, в то время как non-frozen
перечисления требуют использования @unknown для обработки будущих случаев.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Creating ML models with Create ML
😮
➡️ Сам
❗️ Качество набора данных критично для успешного обучения модели - иначе модель выдаст «мусор на выходе»; можно использовать методы увеличения данных для улучшения результатов. После обучения можно просмотреть результаты точности модели и протестировать её на примерах текста.
Краткий вывод:
✔️ Если нужно быстро внедрить ML в приложение без сложных кастомных моделей -
Create ML
— это инструмент для создания моделей машинного обучения без необходимости написания кода, доступный в Xcode. Интерфейс вместо тысячи строк кода: классификация изображений, текста или тайм-серий. В статье приведены советы по импорту данных и оценке точности без танцев с Python. CreateML
поддерживает различные алгоритмы, включая BERT, который подходит для многоязычных моделей и улучшает понимание контекста.Краткий вывод:
CreateML
отличное решение. Для глубоких экспериментов — всё же используйте более специализированные инструменты.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Using Critical Alerts in iOS applications
Если вы не знал про
⚠️
🖥 Для использования
➡️ При запросе разрешений на уведомления необходимо добавить опцию .
🔈 Для отправки
⚙️ С помощью расширения службы уведомлений можно изменить входящие уведомления на критические, изменив свойство
🚨 Но обращаю внимание: Нужно обосновать необходимость применения таких алертов в личном кабинете разработчика.
Если вы не знал про
Critical Alerts
в iOS - советую ознакомиться. Critical Alerts
в iOS показываются пользователю даже в беззвучном режиме или режиме Не беспокоить
, что делает их очень заметными. Фишка для медприложений, систем безопасности или экстренных оповещений. Critical Alert
необходимо получить специальные разрешения от Apple через портал разработчиков, добавив ключ com.apple.developer.usernotifications.critical-alerts
в файл entitlements.criticalAlert
, чтобы пользователь мог отдельно разрешить или запретить критические уведомления.Critical Alert
необходимо изменить payload, указав звук как критический в формате словаря.sound
в UNMutableNotificationContent
.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2
iOS app setup for remote push notifications
Статья - пошаговый гайд для разработчиков, которые хотят добавить remote push в своё приложение. Вот ключевые моменты:
🖥 Нужно активировать Push-уведомления в настройках App ID и создать специальный сертификат (APNs key). 🔑 Без активного аккаунта разработчика — никак!
⚙️ Добавляем capability
➡️ Запрос на показ уведомлений лучше делать после действия пользователя (например, на кнопку Разрешить). Код на Swift с
✏️ После регистрации получаем токен, конвертируем его в строку и шлём на бекенд. Автор даёт код для обработки в AppDelegate.
✉️ Советуют использовать Push Notifications Console от Apple — можно отправить тестовый пуш, вставив токен устройства. Если всё настроено верно, уведомление придёт даже когда приложение свёрнуто.
Статья - пошаговый гайд для разработчиков, которые хотят добавить remote push в своё приложение. Вот ключевые моменты:
Push Notifications
в проект. Для SwiftUI-приложений понадобится AppDelegate
— автор показывает, как прикрутить его через UIApplicationDelegateAdaptor
.UNUserNotificationCenter
— в статье есть пример асинхронного запроса прав.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Using UIKit's New UITab Class with Sidebar on iOS 18
➕ В iOS 18 добавлен новый класс
Вот несколько шагов для достижения результат, как в анимации:
➡️ Создайте
➡️ Реализуйте
UITab
для управления вкладками и боковыми панелями, что упрощает создание интерфейсов с использованием UIKit
.Вот несколько шагов для достижения результат, как в анимации:
UITabBarController
и добавьте массив объектов UITab
, включая UISearchTab
для поиска, чтобы улучшить навигацию в приложении. Вы можете переключаться между традиционной вкладкой и боковой панелью, изменяя свойство mode у UITabBarController
, что позволяет гибко настраивать интерфейс.UITabBarControllerDelegate
для обработки drag-and-drop, что улучшает пользовательский опыт.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤1
How to Clean Xcode Junk and Reclaim Valuable Disk Space on Your Mac
🖥 Xcode занимает много места из-за файлов сборки, данных индексации, символов отладки, файлов симулятора и кэшей, которые необходимы для оптимизации работы.
🟢 Удаление данных, полученных в процессе сборки, можно выполнить через терминал или Finder, что может освободить значительное пространство на диске.
🟢 Архивы могут занимать много места; важно сохранять только те, которые необходимы для отправки в App Store или важные версии релизов.
🟢 Регулярная очистка кэшей и управление симуляторами через терминал или Xcode поможет поддерживать оптимальную производительность и освободить место на диске.
🟢 Рекомендуется удалять только старые версии iOS, которые больше не поддерживаются, чтобы избежать повторной загрузки актуальных файлов при подключении устройств.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
What is Structured Concurrency?
❓
✔️ С помощью SC задачи создаются и ожидаются в четком порядке, ошибки автоматически передаются, что упрощает обработку ошибок и делает код более читаемым.
⚠️ Неупорядоченные задачи существуют, но они требуют ручного управления отменой и могут привести к проблемам, таким как гонки данных, поэтому рекомендуется использовать структурированные задачи.
Structures Concurrency (SC)
— это модель, которая упрощает чтение, поддержку и понимание асинхронного кода в Swift, устраняя проблемы, связанные с callback hell
.func fetchData() async throws -> String {
try await Task.sleep(for: .seconds(1)) // Simulating network delay
return "Data"
}
func loadData() async throws {
let data1 = try await fetchData()
let data2 = try await fetchData()
let data3 = try await fetchData()
print("Finished loading: \(data1), \(data2), \(data3)")
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Формализация принципа Open/Closed: как сохранить обратную совместимость с помощью SOLID
❓ Система должна быть открыта для расширения, но закрыта для изменения, что позволяет сохранять обратную совместимость при разработке.
✏️ СемВер используется для управления версиями, где мажорные изменения требуют правок у клиентов, а минорные и патч-версии могут добавлять функционал без нарушения совместимости.
⚠️ Частые нарушения включают добавление обязательных методов в протоколы и изменение публичных интерфейсов, что требует повышения мажорной версии.
⚙️ Решения для обратной совместимости включают использование расширений протоколов, создание новых протоколов или добавление опциональных методов для сохранения совместимости.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Result builders in Swift
❓ С помощью аннотации
⚙️ Такие конструкторы могут поддерживать условия и циклы, что позволяет создавать более сложные конструкции, такие как условные предложения и массивы строк.
⏩ Swift 5.4 расширяет функциональность конструкторов результатов, позволяя использовать их в пользовательских представлениях SwiftUI, что упрощает создание интерфейсов.
🔗 Работать может не только со строками, но и с разными типами данных.
@resultBuilder
можно создавать функции, которые автоматически объединяют строки без необходимости добавления запятых. @resultBuilder
struct ValidatorBuilder {
static func buildBlock(_ components: Bool...) -> Bool {
components.allSatisfy { $0 }
}
}
func validate(@ValidatorBuilder _ rules: () -> Bool) -> Bool {
rules()
}
let email = "[email protected]"
let isValid = validate {
email.count >= 5
email.contains("@")
!email.hasSuffix(" ")
}
print(isValid)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Yielding and debouncing in Swift Concurrency
ℹ️ Функция
⌛ Дебаунсинг позволяет игнорировать промежуточные данные при вводе пользователем, начиная выполнение задачи только после того, как данные остаются неизменными в течение определенного времени.
🔴 Swift использует модель кооперативного отмены задач, что позволяет отменять предыдущие задачи при вводе новых данных, не останавливая их принудительно.
yield
позволяет приостановить выполнение задачи и вернуть поток в пул для выполнения других асинхронных задач, что помогает избежать блокировки потоков в пуле.struct DataHandler {
func process(json files: [Data]) async throws -> [Item] {
let decoder = JSONDecoder()
var result: [Item] = []
for file in files {
let items = try decoder.decode([Item].self, from: file)
result.append(contentsOf: items)
await Task.yield()
}
return result
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Performing your app actions with Siri through App Shortcuts Provider
Интеграция Siri с действиями приложения позволяет пользователям выполнять команды голосом, что упрощает взаимодействие в ситуациях, когда руки заняты.
⏩ В статье взаимодействие с Siri происходит в
➕ Создание ярлыков для Siri включает добавление фраз, которые позволяют пользователю открывать книги с помощью голосовых команд, улучшая пользовательский опыт.
🟢 Метод
🖥 Добавление альтернативных названий приложения и параметров сущностей позволяет пользователям взаимодействовать с приложением более эффективно и интуитивно.
Интеграция Siri с действиями приложения позволяет пользователям выполнять команды голосом, что упрощает взаимодействие в ситуациях, когда руки заняты.
BooksShelfAskSiri-Starter
- приложение для управления библиотекой книг, включая функции для добавления, просмотра и открытия книг.updateAppShortcutParameters()
обновляет параметры ярлыков каждый раз, когда добавляется или удаляется книга, обеспечивая актуальность команд.import AppIntents
struct BookShelfShortcutsProvider: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: OpenBookIntent(),
phrases: [
"Open a book in \(.applicationName)"
],
shortTitle: "Open a book",
systemImageName: "book"
)
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Don't rely on BGAppRefreshTask for your app's business logic
⚙️ Использование BGAppRefreshTask для бизнес-логики приложения не гарантирует выполнение фоновых задач, что может привести к устаревшим данным.
⚠️ Автор столкнулся с проблемами после выпуска приложения, когда фоновая задача не выполнялась, несмотря на успешные тесты в TestFlight.
➡️ Вместо фоновых задач автор теперь обновляет данные при каждом открытии приложения, что не идеально для пользователей виджетов.
✔️ Для надежного обновления данных лучше использовать фоновые уведомления, отправляемые с сервера через APNs, хотя это требует наличия бэкенда.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3