Адаптация мобильного приложения под новые возможности ОС
Каждый сентябрь Apple выпускает новую iOS — и каждый год часть приложений выглядит устаревшей рядом с обновлёнными системными приложениями. Dynamic Island, Live Activities, интерактивные виджеты, Stage Manager на iPad, Lock Screen widgets — пользователи замечают, когда ваше приложение не использует то, что платформа предлагает бесплатно.
iOS 16: Lock Screen Widgets и Live Activities
Lock Screen Widgets — виджеты прямо на экране блокировки. Технически это WidgetKit с новым семейством .accessoryCircular, .accessoryRectangular, .accessoryInline. Существующий Home Screen виджет не работает на Lock Screen без явной поддержки этих семейств.
struct LockScreenWidgetView: View {
@Environment(\.widgetFamily) var family
var body: some View {
switch family {
case .accessoryCircular:
Gauge(value: progress, in: 0...1) {
Image(systemName: "star")
}
.gaugeStyle(.accessoryCircular)
case .accessoryRectangular:
VStack(alignment: .leading) {
Text(title).font(.headline)
Text(subtitle).font(.caption)
}
default:
EmptyView()
}
}
}
Цветовая схема Lock Screen виджета — .widgetAccentable() для элементов, которые подхватывают пользовательский акцентный цвет экрана блокировки. Без этого модификатора виджет выглядит «мёртвым».
Live Activities (ActivityKit) — динамические плашки на Lock Screen и в Dynamic Island. Обновляются push-уведомлениями (ActivityKit pushes) или напрямую из приложения. Типичный сценарий: доставка, такси, спортивный матч.
// Запуск Activity
let attributes = DeliveryAttributes(orderId: "12345")
let state = DeliveryAttributes.ContentState(status: .preparing, eta: Date().addingTimeInterval(1800))
let activity = try Activity.request(
attributes: attributes,
content: .init(state: state, staleDate: nil),
pushType: .token
)
Ключевой момент — pushType: .token. Сервер получает push token этой активности и может обновлять её через APNs без пробуждения основного приложения. Реализация серверной части — обязательная часть задачи.
iOS 17: Interactive Widgets и TipKit
Interactive Widgets — виджеты с кнопками и Toggle. До iOS 17 tap на виджете только открывал приложение. Теперь Button и Toggle в WidgetKit выполняют AppIntent прямо из виджета:
struct QuickActionWidget: Widget {
var body: some WidgetConfiguration {
StaticConfiguration(kind: "QuickAction", provider: Provider()) { entry in
QuickActionWidgetView(entry: entry)
.containerBackground(.fill.tertiary, for: .widget)
}
}
}
struct QuickActionWidgetView: View {
var entry: Entry
var body: some View {
Button(intent: ToggleTaskIntent(taskId: entry.taskId)) {
Image(systemName: entry.isCompleted ? "checkmark.circle.fill" : "circle")
}
}
}
containerBackground — новое требование iOS 17: виджеты обязаны задавать фон через этот модификатор, иначе Xcode выдаёт предупреждение, а на iOS 17 виджет может выглядеть неправильно.
TipKit — нативный фреймворк для обучающих подсказок:
struct NewFeatureTip: Tip {
var title: Text { Text("Попробуйте голосовой ввод") }
var message: Text? { Text("Нажмите на микрофон для быстрого добавления задачи") }
var image: Image? { Image(systemName: "mic.fill") }
var rules: [Rule] {
#Rule(Self.$hasUsedSearch) { $0.donations.count < 3 }
}
}
TipKit отслеживает правила показа, хранит состояние (показана/закрыта/выполнено действие) и синхронизирует между устройствами через iCloud. Не нужно писать свой трекинг показов.
iPadOS: Stage Manager и Multitasking
Адаптация под Stage Manager (iPadOS 16+) — это в первую очередь поддержка произвольных размеров окна. Приложение должно корректно работать при любом соотношении сторон, не только при фиксированных iPad-размерах.
// Проверка поддержки множественных окон
UIApplication.shared.supportsMultipleScenes // true на iPad с Stage Manager
UIWindowScene.sizeRestrictions позволяет задать минимальный и максимальный размер окна для Stage Manager:
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 400, height: 300)
windowScene.sizeRestrictions?.maximumSize = CGSize(width: 1200, height: 900)
AutoLayout с правильными constraint priorities и UIContentSizeCategoryAdjusting для шрифтов — обязательны. Жёстко прописанные размеры в коде (frame = CGRect(x: 0, y: 0, width: 375, height: 812)) — это гарантированные проблемы на Stage Manager.
Процесс адаптации
Аудит: список новых фич конкретной iOS-версии, анализ которые применимы к продукту и дают реальную ценность пользователю.
Приоритизация: не каждая новинка нужна вашему приложению. Live Activities имеют смысл для реального-времени отслеживания; Lock Screen Widgets — для быстрого доступа к часто используемым данным. Внедрять ради галочки — не наш подход.
Разработка с @available(iOS 16, *) — старые iOS должны продолжать работать.
Тестирование на конкретных версиях iOS, не только на последней.
Ориентиры по срокам
| Фича | Срок |
|---|---|
| Lock Screen Widgets (расширение существующего) | 1–2 дня |
| Live Activities + серверная интеграция | 3–5 дней |
| Interactive Widgets (iOS 17) | 1–2 дня |
| Stage Manager адаптация для iPad | 2–3 дня |
| Комплексная адаптация под новую iOS | 3–5 дней |







