Sitemap

iOS 27 Deprecation Checklist

13 min readSep 22, 2026

--

Press enter or click to view image in full size

When migrating an existing application to the iOS 27 SDK, don’t treat every compiler warning as a newly introduced iOS 27 deprecation.

Apple’s iOS 27 SDK introduces a number of explicit deprecations and API migrations, while other older APIs become more important because applications are now being built and linked against the iOS 27 SDK.

The following checklist focuses on the APIs and migration requirements that should be reviewed when moving an existing application to iOS 27.

1. UIApplication.canOpenURL(_:) → Attempt open Directly

Old API

if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
}

New API

Attempt to open the URL and handle the result.

UIApplication.shared.open(url) { success in
if success {
print("URL opened successfully")
} else {
print("Unable to open URL")
}
}

For web navigation, prefer Universal Links where appropriate rather than relying on custom URL-scheme validation.

Minimum iOS Version

  • canOpenURL(_:): available before iOS 27 but deprecated in the iOS 27 SDK.
  • open(_:options:completionHandler:): iOS 10.0+
  • Universal Links: iOS 9.0+

Migration Notes

Apple deprecated canOpenURL: in the iOS 27 SDK. The recommended approach is to attempt to open the URL and handle failure instead of validating the URL first. Apple also recommends Universal Links as an alternative to custom URL schemes where applicable.

Migration Checklist

  • Search for canOpenURL
  • Replace validation-first logic
  • Handle the open completion result
  • Review custom URL schemes
  • Consider Universal Links
  • Test URLs when the destination application is not installed

2. UIKit Application Lifecycle → Scene-Based Lifecycle

This is more than a simple API replacement.

Old Pattern

Older applications may rely heavily on the application delegate:

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?    func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// Application startup
return true
}
}

New Pattern

Use UISceneDelegate for scene/window lifecycle responsibilities.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?    func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guard let windowScene = scene as? UIWindowScene else {
return
}
let window = UIWindow(windowScene: windowScene)
window.rootViewController = makeRootViewController()
self.window = window
window.makeKeyAndVisible()
}
}

Minimum iOS Version

  • Scene lifecycle introduced: iOS 13.0
  • For applications built with the latest SDK: scene-based lifecycle is required.

Migration Notes

This is one of the most important iOS 27 migration requirements.

Apple states that applications built with the latest SDK must adopt the scene-based lifecycle or they will fail to launch.

Move responsibilities appropriately:

AppDelegate
│
├── Process-level configuration
├── Push notification registration
└── Application-level services

SceneDelegate
│
├── Window creation
├── UI lifecycle
├── Scene connection
└── Scene state

Migration Checklist

  • Check whether the project has SceneDelegate
  • Check Info.plist scene configuration
  • Move window creation to scene lifecycle
  • Review application(_:configurationForConnecting:)
  • Review deep-link handling
  • Review universal-link handling
  • Review push notification navigation
  • Review state restoration
  • Test cold launch
  • Test background → foreground
  • Test multiple scenes where applicable

3. UIApplication Status Bar Accessors → View Controller / Scene-Based Status Bar Management

The following legacy properties should be removed from application code:

UIApplication.shared.statusBarFrame
UIApplication.shared.statusBarOrientation
UIApplication.shared.statusBarStyle
UIApplication.shared.isStatusBarHidden

Old API

let orientation = UIApplication.shared.statusBarOrientation
let frame = UIApplication.shared.statusBarFrame

or:

UIApplication.shared.statusBarStyle = .lightContent
UIApplication.shared.isStatusBarHidden = true

New API

For UIKit applications, manage status bar appearance through the view controller hierarchy.

override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}

For hiding/showing:

override var prefersStatusBarHidden: Bool {
true
}

For interface orientation, use the appropriate scene/view-controller APIs rather than reading the application’s global status bar orientation.

Minimum iOS Version

  • View-controller-based status bar appearance: iOS 7.0+
  • Scene-based UI architecture: iOS 13.0+

Migration Notes

These UIApplication status-bar accessors are legacy APIs. Apple's iOS 27 release notes specifically call out statusBarFrame, statusBarOrientation, statusBarStyle, and isStatusBarHidden in the context of iOS 27 behavior.

Do not use:

UIApplication.shared.statusBarStyle

as a global application-level UI mechanism.

Prefer view-controller-based presentation.

Migration Checklist

  • Search statusBarFrame
  • Search statusBarOrientation
  • Search statusBarStyle
  • Search isStatusBarHidden
  • Review custom navigation controllers
  • Review custom container view controllers
  • Test light/dark appearance
  • Test modal presentation
  • Test navigation transitions

4. MetricKit MXMetricManager → MetricManager

Old API

import MetricKit
final class MetricsManager: NSObject, MXMetricManagerSubscriber {    func didReceive(_ payloads: [MXMetricPayload]) {
print(payloads)
}
func didReceive(_ payloads: [MXDiagnosticPayload]) {
print(payloads)
}
}

Older applications commonly use:

MXMetricManager
MXMetricManagerSubscriber
MXMetricPayload
MXDiagnosticPayload

New API

iOS 27 introduces the Swift-first API:

import MetricKit
let metricManager = MetricManager()for await report in metricManager.metrics {
print(report)
}

MetricKit’s newer API provides:

MetricManager
MetricReport
DiagnosticReport
AsyncStream

Minimum iOS Version

  • Original MetricKit APIs: iOS 13.0+
  • New Swift-first MetricManager API: iOS 27.0+

Migration Notes

Apple’s iOS 27 release notes state that the original MetricKit APIs, including:

MXMetricManager
MXMetricManagerSubscriber
MXMetricPayload
MXDiagnosticPayload

are no longer recommended for new adoption. Apple recommends MetricManager instead.

The new API uses asynchronous sequences to receive reports.

Migration Checklist

  • Search for MXMetricManager
  • Search for MXMetricManagerSubscriber
  • Search for MXMetricPayload
  • Search for MXDiagnosticPayload
  • Introduce MetricManager
  • Convert subscriber callbacks to async processing
  • Review metric persistence
  • Test with Xcode’s MetricKit payload simulation
  • Test on a physical iOS 27 device

Apple’s current MetricKit documentation notes that the new MetricManager delivers reports through asynchronous sequences on iOS 27 and later.

5. ScrollHitchTimeMetric → HitchTimeMetric

This is another MetricKit migration.

Old API

ScrollHitchTimeMetric

and:

MetricResult.scrollHitchTime(...)

New API

Use:

HitchTimeMetric

and:

MetricResult.hitchTime(...)

Minimum iOS Version

  • Old API: MetricKit-era API
  • New HitchTimeMetric Swift MetricKit API: iOS 27+

Migration Notes

Apple states that scrollHitchTime(_:) and ScrollHitchTimeMetric are no longer part of the new Swift MetricKit API.

MetricReport values no longer contain scroll-hitch entries.

Use:

ScrollHitchTimeMetric
↓
HitchTimeMetric

and:

scrollHitchTime(_:)
↓
hitchTime(_:)

Apple also warns that applications referencing the old symbols should be recompiled with the latest SDK to avoid missing-symbol crashes.

Migration Checklist

  • Search for ScrollHitchTimeMetric
  • Search for scrollHitchTime
  • Replace with HitchTimeMetric
  • Replace scrollHitchTime with hitchTime
  • Recompile against the iOS 27 SDK
  • Test performance reporting

6. On-Demand Resources → Background Assets

Old API

let request = NSBundleResourceRequest(
tags: ["level1"]
)
request.beginAccessingResources { error in
// Load resources
}

Old Technology

On-Demand Resources
NSBundleResourceRequest

New Technology

Background Assets

Depending on the use case, this can involve:

BADownloadManager

and Background Assets extensions.

Minimum iOS Version

  • NSBundleResourceRequest: iOS 9.0+
  • Background Assets: introduced before iOS 27 and available for modern iOS deployments.
  • iOS 27: On-Demand Resources are deprecated.

Migration Notes

Apple explicitly deprecated On-Demand Resources and the NSBundleResourceRequest API starting with iOS 27.

Apple recommends Background Assets as the replacement.

For applications using large downloadable content, the migration should consider:

Old:
App
│
└── On-Demand Resources
└── NSBundleResourceRequest
New:
App
│
└── Background Assets
├── Download management
├── Asset packages
└── Background delivery

Migration Checklist

  • Search for NSBundleResourceRequest
  • Identify On-Demand Resource tags
  • Identify hosted asset packs
  • Identify initial-install resources
  • Design Background Assets equivalent
  • Review asset packaging
  • Review download lifecycle
  • Test interrupted downloads
  • Test background downloads
  • Test fresh installation
  • Test App Store/TestFlight distribution

Apple’s current App Store documentation also explicitly says On-Demand Resources are deprecated starting with iOS 27 and recommends Apple-Hosted Background Assets as an alternative for appropriate use cases.

7. FileDocument → ReadableDocument / Document

Old API

struct MyDocument: FileDocument {  
static var readableContentTypes: [UTType] {
[.plainText]
}
init(configuration: ReadConfiguration) throws {
// Read document
}
func fileWrapper(
configuration: WriteConfiguration
) throws -> FileWrapper {
// Write document
}
}

New API — Read Only

For a read-only document:

struct MyDocument: ReadableDocument {
static var readableContentTypes: [UTType] {
[.plainText]
}
init(
configuration: ReadConfiguration
) throws {
// Read document
}
}

New API — Read + Write

For documents that both read and write:

struct MyDocument: Document {
static var readableContentTypes: [UTType] {
[.plainText]
}
init(
configuration: ReadConfiguration
) throws {
// Read document
}
func fileWrapper(
configuration: WriteConfiguration
) throws -> FileWrapper {
// Write document
}
}

Minimum iOS Version

  • FileDocument: iOS 14+
  • ReadableDocument / WritableDocument / Document: iOS 27 SDK APIs

Migration Notes

Apple deprecated FileDocument in the iOS 27 SDK.

Use:

Read only
FileDocument
↓
ReadableDocument
↓
Read + Write
FileDocument
↓
Document

Apple’s iOS 27 documentation also describes WritableDocument for asynchronous writing and progress reporting, while Document combines readable and writable document functionality.

Migration Checklist

  • Search for FileDocument
  • Identify read-only documents
  • Migrate read-only documents to ReadableDocument
  • Identify read/write documents
  • Migrate read/write documents to Document
  • Review DocumentGroup
  • Review fileImporter
  • Review fileExporter
  • Test document creation
  • Test document opening
  • Test document saving
  • Test document replacement

8. PHAssetResource.originalFilename → filename

Old API

let filename = resource.originalFilename

New API

let filename = resource.filename

Because the new property is nullable:

if let filename = resource.filename {
print(filename)
}

Minimum iOS Version

  • originalFilename: older PhotoKit API
  • filename: iOS 27 SDK replacement

Migration Notes

Apple states that originalFilename incorrectly declares the property as non-nullable.

The new filename property correctly reflects that the value may be nil.

Get ANBU SEKAR’s stories in your inbox

Join Medium for free to get updates from this writer.

Therefore, code such as:

let name: String = resource.originalFilename

may need to become:

let name: String? = resource.filename

or:

let name = resource.filename ?? "Unknown"

Migration Checklist

  • Search for originalFilename
  • Replace with filename
  • Update the type to optional
  • Handle nil
  • Check file upload logic
  • Check image/video export logic
  • Test assets without filenames

9. __PKStrokeRenderState → PKStrokeRenderStateReference

Old API

__PKStrokeRenderState

and:

strokeRenderState.asObjCRenderState()

New API

PKStrokeRenderStateReference

and:

PKStrokeRenderStateReference(...)

Minimum iOS Version

  • Existing PencilKit APIs: older iOS versions
  • New PKStrokeRenderStateReference: iOS 27 SDK migration

Migration Notes

Apple renamed:

__PKStrokeRenderState
↓
PKStrokeRenderStateReference

and replaced:

PKStrokeRenderState.asObjCRenderState()

with the initializer on:

PKStrokeRenderStateReference

This mainly affects applications that directly interact with PencilKit’s stroke rendering state rather than ordinary PencilKit drawing code.

Migration Checklist

  • Search for __PKStrokeRenderState
  • Search for asObjCRenderState
  • Replace with PKStrokeRenderStateReference
  • Update Objective-C interoperability code
  • Rebuild PencilKit components
  • Test Apple Pencil input
  • Test stroke rendering
  • Test undo/redo
  • Test saved drawings

10. SwiftUI FileDocument-Based DocumentGroup → Modern Document APIs

This is closely related to the FileDocument deprecation but deserves a separate audit for SwiftUI document applications.

Old

DocumentGroup(newDocument: MyDocument()) { file in
ContentView(document: file.$document)
}

where:

struct MyDocument: FileDocument {
// ...
}

New

Use the modern document protocols:

struct MyDocument: Document {
// read + write
}

or:

struct MyDocument: ReadableDocument {
// read only
}

Minimum iOS Version

  • New document APIs: iOS 27 SDK

Migration Notes

The iOS 27 SDK introduces modern document APIs that integrate more directly with:

  • Swift concurrency
  • Observation
  • asynchronous document reading/writing
  • progress reporting
  • document URLs

Apple recommends ReadableDocument and Document instead of FileDocument.

11. UIApplication Global UI State → Scene/View Controller State

This isn’t one single deprecated method, but it is an important migration audit.

Old

UIApplication.shared.windows.first

or:

UIApplication.shared.keyWindow

or application-global assumptions such as:

UIApplication.shared.statusBarOrientation

New

Resolve UI from the appropriate scene/window hierarchy.

guard let windowScene = view.window?.windowScene else {
return
}
let window = windowScene.windows.first

For application-level code:

let scenes = UIApplication.shared.connectedScenes

and then select the appropriate UIWindowScene.

Minimum iOS Version

  • Scene APIs: iOS 13+

Migration Notes

The important architectural change is:

Old:
UIApplication
↓
Global UI
↓
Window
↓
View
↓
New
↓
UIScene
↓
UIWindowScene
↓
UIWindow
↓
View Controller
↓
View

This becomes particularly important when migrating old applications that assumed there was only one global window.

12. Status Bar Orientation → Scene/View Controller Orientation

Old

let orientation =
UIApplication.shared.statusBarOrientation

New

Use the appropriate window scene:

guard let scene = view.window?.windowScene else {
return
}
let orientation = scene.interfaceOrientation

or use view-controller orientation APIs when the requirement is related to supported orientations.

Minimum iOS Version

  • UIWindowScene.interfaceOrientation: iOS 13+

Migration Notes

Do not use the status bar as the source of truth for application orientation.

This is especially important for iPadOS 27 because window resizing and orientation behavior have changed for applications built with the iOS 27 SDK.

13. iOS 27 SwiftUI Soft Deprecations / API Renames

Not every iOS 27 migration item is a hard deprecation, but these should also be checked.

toolbarMinimizeBehavior → toolbarMinimizationBehavior

Old

.toolbarMinimizeBehavior(.automatic)

New

.toolbarMinimizationBehavior(.automatic)

Minimum iOS Version

iOS 27 SDK.

Migration Notes

Apple introduced toolbarMinimizationBehavior as the replacement for toolbarMinimizeBehavior.

14. SwiftUI Text Field Border Styles

Old

.textFieldStyle(.squareBorder)

or:

.textFieldStyle(.roundedBorder)

New

Use the newer bordered style where appropriate:

.textFieldStyle(.bordered)

Minimum iOS Version

iOS 27 SDK.

Migration Notes

Apple describes .squareBorder and .roundedBorder as soft deprecated and recommends the newer .bordered style. This is not equivalent to a hard removal, so existing applications should evaluate the visual result before changing every occurrence.

15. iOS 27 SwiftUI @State Implementation Change

This is not a deprecation, but it should be part of the migration checklist.

Existing Code

@State private var model = Model()

iOS 27 Behavior

Xcode 27 introduces a new @State implementation using a Swift macro.

The new implementation avoids repeatedly evaluating the initial expression when the view struct is recreated.

Minimum iOS Version

The new implementation back-deploys to iOS 17-aligned OS versions when built appropriately with the new SDK.

Migration Notes

Most existing code remains source compatible, but applications using unusual @State patterns should be tested carefully.

Apple specifically notes that there are some source-compatibility exceptions.

Migration Checklist

  • Search custom @State initialization
  • Check @State with reference types
  • Check custom wrappers around @State
  • Run SwiftUI previews
  • Test view recreation
  • Test navigation
  • Test sheets/popovers

16. SwiftUI AsyncImage — Behavior Change, Not Deprecation

Existing API

AsyncImage(url: imageURL)

iOS 27 Behavior

When built with the iOS 27 SDK, AsyncImage automatically uses HTTP caching behavior.

You can also provide a URLRequest:

AsyncImage(
urlRequest: URLRequest(url: imageURL)
)

Minimum iOS Version

iOS 27 SDK behavior.

Migration Notes

This isn’t a deprecated API.

It is a behavior change that can affect applications that previously implemented their own caching around AsyncImage.

Review:

  • custom image caches
  • memory usage
  • HTTP cache headers
  • cache policies
  • duplicate caching layers

Apple added URLRequest-based initializers and support for controlling the URL session used by child AsyncImage views.

17. SwiftUI Text Selection — Behavior Change

Existing API

Text("Hello")
.textSelection(.enabled)

iOS 27 Behavior

When built against the iOS 27 SDK, selectable Text uses the system's newer interactive text-selection behavior.

Migration Notes

This isn’t a deprecated API.

However, custom gestures attached to selectable text can conflict with the new system selection gestures.

For example:

Text("Tap me")
.textSelection(.enabled)
.onTapGesture {
// Custom action
}

may need gesture priority adjustments.

Apple specifically recommends considering .highPriorityGesture() where custom gestures need to take precedence.

18. SwiftUI TabView Selection — Behavior Change

Existing Pattern

TabView(selection: $selection) {
HomeView()
.tag(Tab.home)
    SettingsView()
.tag(Tab.settings)
}

iOS 27 Change

The iOS 27 SDK enforces that the selected tab is actually visible.

Migration Notes

Applications should not maintain a selection value pointing to a hidden or unavailable tab.

For example:

if shouldHideSettings {
// Make sure selection isn't still .settings
}

Apple notes that TabView can crash when its selection points to a hidden/unavailable tab when built with the iOS 27 SDK.

19. iOS 27 Launch Screen Requirement

This is not a deprecation, but it belongs in an iOS 27 migration checklist.

Required

Applications built with the iOS 27 SDK need a launch screen configuration.

Supported Info.plist keys include:

UILaunchStoryboardName
UILaunchStoryboards
UILaunchScreen
UILaunchScreens

Migration Notes

Apple states that iOS/iPadOS applications built with the 27.0 SDK or later must include a launch screen. Apps without one are rejected when App Store submission begins accepting builds using that SDK.

Migration Checklist

  • Check Info.plist
  • Check UILaunchScreen
  • Check storyboard-based launch configuration
  • Test cold launch
  • Test different device sizes
  • Test dark mode
  • Test iPad

20. iOS 27 iPad Resizing and Orientation

Again, this is a behavior change, not a deprecation, but it should be tested during migration.

Applications built with the iOS 27 SDK can experience changes involving:

  • iPad window resizing
  • supported interface orientations
  • UIScreen behavior
  • iPhone-only applications running on iPad
  • UIRequiresFullScreen
  • iPhone Mirroring

Apple specifically documents multiple iOS 27 changes in these areas.

Migration Checklist

  • Test iPad portrait
  • Test iPad landscape
  • Test window resizing
  • Test split view
  • Test Stage Manager where applicable
  • Test iPhone-only apps on iPad
  • Test UIRequiresFullScreen
  • Test iPhone Mirroring
  • Review direct UIScreen assumptions

21. Quick Search Checklist for an Existing Project

When beginning an iOS 27 migration, search the entire codebase for these symbols.

UIKit

canOpenURL
statusBarFrame
statusBarOrientation
statusBarStyle
isStatusBarHidden
UIApplication.shared.windows
keyWindow

Scene Lifecycle

UIScene
UIWindowScene
UISceneDelegate
configurationForConnecting
didDiscardSceneSessions

MetricKit

MXMetricManager
MXMetricManagerSubscriber
MXMetricPayload
MXDiagnosticPayload
ScrollHitchTimeMetric
scrollHitchTime

On-Demand Resources

NSBundleResourceRequest
beginAccessingResources
endAccessingResources
conditionallyBeginAccessingResources

SwiftUI Documents

FileDocument
ReferenceFileDocument
DocumentGroup
fileImporter
fileExporter

PhotoKit

originalFilename

PencilKit

__PKStrokeRenderState
asObjCRenderState

SwiftUI

toolbarMinimizeBehavior
squareBorder
roundedBorder

22. iOS 27 Deprecation Migration Matrix

#Old API / TechnologyNew API / TechnologyReplacement TargetiOS 27 Action1canOpenURL(_:)open(_:options:completionHandler:)Direct URL openingReplace2Global status-bar accessorsView controller / scene APIsScene-aware UIReplace3Application-only lifecycleScene-based lifecycleUISceneDelegateRequired4MXMetricManagerMetricManagerSwift-first MetricKitMigrate5MXMetricManagerSubscriberMetricManager async APIsAsyncStreamMigrate6MXMetricPayloadMetricReportSwift MetricKitMigrate7MXDiagnosticPayloadDiagnosticReportSwift MetricKitMigrate8ScrollHitchTimeMetricHitchTimeMetricApp animation hitch metricsReplace9scrollHitchTime(_:)hitchTime(_:)MetricResultReplace10On-Demand ResourcesBackground AssetsAsset downloadsPlan migration11NSBundleResourceRequestBackground Assets APIsAsset downloadsReplace12FileDocumentReadableDocumentRead-only documentsReplace13FileDocumentDocumentRead/write documentsReplace14PHAssetResource.originalFilenamefilenameNullable filenameReplace15__PKStrokeRenderStatePKStrokeRenderStateReferencePencilKitReplace16asObjCRenderState()PKStrokeRenderStateReference(...)PencilKitReplace17toolbarMinimizeBehaviortoolbarMinimizationBehaviorSwiftUI toolbarRename18.squareBorder.borderedSwiftUI text fieldsReview19.roundedBorder.borderedSwiftUI text fieldsReview

Apple’s iOS 27 release notes are the authoritative source for the iOS 27-specific deprecations in this table.

23. Recommended Migration Order

Don’t fix these randomly.

For an existing production application, use this order:

Step 1
Update Xcode
↓
Step 2
Build with iOS 27 SDK
↓
Step 3
Fix compiler errors
↓
Step 4
Fix hard migration requirements
↓
Step 5
Fix deprecation warnings
↓
Step 6
Review iOS 27 behavior changes
↓
Step 7
Update third-party SDKs
↓
Step 8
Run unit/UI tests
↓
Step 9
Test physical iOS 27 devices
↓
Step 10
Test TestFlight build

24. Final iOS 27 Deprecation Checklist

UIKit

  • Remove canOpenURL
  • Review status-bar accessors
  • Remove global window assumptions
  • Confirm scene-based lifecycle
  • Test orientation behavior
  • Test iPad resizing

MetricKit

  • Remove MXMetricManager where migration is appropriate
  • Remove MXMetricManagerSubscriber
  • Replace MXMetricPayload
  • Replace MXDiagnosticPayload
  • Replace ScrollHitchTimeMetric
  • Replace scrollHitchTime
  • Adopt MetricManager
  • Adopt MetricReport
  • Adopt DiagnosticReport
  • Test asynchronous metric collection

Asset Downloads

  • Search for NSBundleResourceRequest
  • Identify On-Demand Resources
  • Plan Background Assets migration
  • Review asset packaging
  • Test background downloads
  • Test interrupted downloads

SwiftUI Documents

  • Search for FileDocument
  • Identify read-only documents
  • Migrate to ReadableDocument
  • Identify read/write documents
  • Migrate to Document
  • Review DocumentGroup
  • Test import/export

PhotoKit

  • Search for originalFilename
  • Replace with filename
  • Handle optional values

PencilKit

  • Search for __PKStrokeRenderState
  • Search for asObjCRenderState
  • Replace with PKStrokeRenderStateReference
  • Test Apple Pencil rendering

SwiftUI

  • Review toolbarMinimizeBehavior
  • Review .squareBorder
  • Review .roundedBorder
  • Review @State initialization
  • Review AsyncImage caching
  • Review selectable Text
  • Review TabView selection

App Configuration

  • Confirm launch screen configuration
  • Check Info.plist
  • Check scene configuration
  • Test cold launch
  • Test background/foreground
  • Test deep links
  • Test notifications
  • Test iPad resizing

Important: Deprecation vs Migration Requirement

A good iOS 27 migration document should not put everything into one “deprecated APIs” list.

There are three different categories:

Category 1 — Explicit iOS 27 deprecations

Examples:

canOpenURL
MetricKit legacy APIs
ScrollHitchTimeMetric
On-Demand Resources
NSBundleResourceRequest
FileDocument
PHAssetResource.originalFilename
PencilKit render-state API

Category 2 — iOS 27 migration requirements

Examples:

Scene-based lifecycle
Launch screen requirement

Category 3 — iOS 27 behavior changes

Examples:

iPad resizing
Orientation handling
SwiftUI TabView selection
AsyncImage caching
Text selection
@State implementation

Keeping these categories separate makes the migration guide much more accurate and prevents developers from assuming that every iOS 27 behavior change represents a deprecated API.

Final Takeaway

For an existing application, the most important code searches before and immediately after switching to the iOS 27 SDK are:

canOpenURL
statusBarFrame
statusBarOrientation
statusBarStyle
isStatusBarHidden
MXMetricManager
MXMetricManagerSubscriber
MXMetricPayload
MXDiagnosticPayload
ScrollHitchTimeMetric
scrollHitchTime
NSBundleResourceRequestFileDocumentoriginalFilename__PKStrokeRenderState
asObjCRenderState
toolbarMinimizeBehavior
squareBorder
roundedBorder

Then separately audit:

Scene lifecycle
Launch screen
iPad resizing
Orientation
TabView selection
AsyncImage
Text selection
@State

This gives you a much more complete iOS 27 migration audit than simply searching for compiler warnings.

--

--

ANBU SEKAR
ANBU SEKAR

Written by ANBU SEKAR

iOS developer with 8+ years experience building scalable apps using Swift & SwiftUI, with strong focus on AI/ML integration and performance optimization.