Adapting Mobile Application to New OS Features
Every September Apple releases new iOS — and every year part of applications look outdated next to updated system apps. Dynamic Island, Live Activities, interactive widgets, Stage Manager on iPad, Lock Screen widgets — users notice when your app doesn't use what the platform offers for free.
iOS 16: Lock Screen Widgets and Live Activities
Lock Screen Widgets — widgets right on the lock screen. Technically this is WidgetKit with new families .accessoryCircular, .accessoryRectangular, .accessoryInline. Existing Home Screen widget doesn't work on Lock Screen without explicit support for these families.
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 widget color scheme — .widgetAccentable() for elements that use user's custom lock screen accent color. Without this modifier, widget looks "dead".
Live Activities (ActivityKit) — dynamic chips on Lock Screen and Dynamic Island. Updated via push notifications (ActivityKit pushes) or directly from the app. Typical scenario: delivery, taxi, sports match.
// Starting 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
)
Key point — pushType: .token. Server gets push token of this activity and can update it via APNs without waking main app. Server-side implementation — mandatory part of the task.
iOS 17: Interactive Widgets and TipKit
Interactive Widgets — widgets with buttons and Toggle. Before iOS 17, tap on widget only opened the app. Now Button and Toggle in WidgetKit execute AppIntent directly from the widget:
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 — new requirement iOS 17: widgets must set background through this modifier, otherwise Xcode warns and widget may look wrong on iOS 17.
TipKit — native framework for teaching tips:
struct NewFeatureTip: Tip {
var title: Text { Text("Try voice input") }
var message: Text? { Text("Tap the microphone for quick task addition") }
var image: Image? { Image(systemName: "mic.fill") }
var rules: [Rule] {
#Rule(Self.$hasUsedSearch) { $0.donations.count < 3 }
}
}
TipKit tracks display rules, stores state (shown/closed/action done), and syncs across devices via iCloud. No need to write custom show tracking.
iPadOS: Stage Manager and Multitasking
Adapting to Stage Manager (iPadOS 16+) is primarily about supporting arbitrary window sizes. The app must work correctly at any aspect ratio, not just fixed iPad sizes.
// Check multiple window support
UIApplication.shared.supportsMultipleScenes // true on iPad with Stage Manager
UIWindowScene.sizeRestrictions lets you set min and max window size for Stage Manager:
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 400, height: 300)
windowScene.sizeRestrictions?.maximumSize = CGSize(width: 1200, height: 900)
AutoLayout with correct constraint priorities and UIContentSizeCategoryAdjusting for fonts — mandatory. Hardcoded sizes in code (frame = CGRect(x: 0, y: 0, width: 375, height: 812)) — guaranteed problems on Stage Manager.
Adaptation Process
Audit: list of new features for specific iOS version, analyze which apply to product and give real value to user.
Prioritization: not every novelty is needed for your app. Live Activities make sense for real-time tracking; Lock Screen Widgets — for quick access to frequently used data. Implementing for the sake of it — not our approach.
Development with @available(iOS 16, *) — older iOS should continue working.
Testing on specific iOS versions, not just the latest.
Timeline Benchmarks
| Feature | Timeline |
|---|---|
| Lock Screen Widgets (extending existing) | 1–2 days |
| Live Activities + server integration | 3–5 days |
| Interactive Widgets (iOS 17) | 1–2 days |
| Stage Manager adaptation for iPad | 2–3 days |
| Comprehensive adaptation to new iOS | 3–5 days |







