Migrating Mobile Application to New iOS SDK Version
Apple raises the minimum iOS for new features and tightens SDK requirements on App Store Connect every year. Since 2024, apps built with iOS SDK 17+ must use Privacy Manifests. In 2023, Apple required minimum iOS 16 SDK for App Store submissions. Delaying SDK update — first warnings in App Store Connect, then submission blocking.
What Actually Breaks When SDK Changes
Deprecated API — the largest part of the work. UIWebView removed starting with iOS 15 SDK, apps using it get rejection with ITMS-90809. UIAlertView, UIActionSheet, shouldAutorotateToInterfaceOrientation — on iOS 16 SDK these methods don't compile. Search through codebase via Xcode #available + deprecated list from release notes of specific version.
Privacy Manifests (iOS 17 SDK) — new in 2024. Every third-party dependency and the app itself must have PrivacyInfo.xcprivacy file with declaration of used API categories (NSPrivacyAccessedAPITypes): NSUserDefaults, NSFileManager, NSProcessInfo, UIDevice.systemBootTime. If file is missing — ITMS-91053 warning at submission. Became an error since May 2024.
Example PrivacyInfo.xcprivacy:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</dict>
</array>
</dict>
</plist>
Reasons (Reasons) — specific codes from Apple documentation. CA92.1 for UserDefaults means "storing user-managed settings". Can't just write any code — must choose from approved list. If no suitable one — write to Apple through App Review, which is itself a quest.
Swift Concurrency and Sendable — iOS 16+ SDK includes extended Sendable checks and actor isolation. A project that compiled without warnings on old SDK produces dozens of warnings on new one: Capture of non-Sendable type 'SomeModel'. With iOS 17 SDK some became errors under strict concurrency checking: complete. On large codebases this is serious work.
Order of Migration Work
Start with audit through xcodebuild:
xcodebuild -workspace MyApp.xcworkspace \
-scheme MyApp \
-destination 'generic/platform=iOS' \
-sdk iphoneos17.0 \
build 2>&1 | grep -E "error:|warning:" | sort | uniq -c | sort -rn | head -50
This gives quantitative picture: how many errors, what categories, top-50 by frequency. On 300k lines of code typical picture when jumping from iOS 14 SDK to iOS 17 SDK — 15–40 errors and 100–300 warnings.
Third-party dependencies — second issue. A library not updated in 2 years may not support new SDK. Checklist:
- CocoaPods:
pod outdatedfor list of outdated dependencies - SPM: check
Package.resolved, look for libraries without fresh tags on GitHub - Dependencies with outdated
deployment target— conflict with new app minimum iOS
Special case — dependencies without Privacy Manifest. Since May 2024 Apple requires manifests from popular SDKs (Firebase, Crashlytics, Amplitude, Adjust and others updated their packages). But less known libraries may not have manifest, then either fork and add, or drop the dependency.
Migration by complexity level:
| Category of Changes | Effort |
|---|---|
Replace UIWebView → WKWebView |
Medium (delegate API changes) |
| Privacy Manifests for custom code | Low (configuration) |
| Privacy Manifests for third-party SDK | Depends on author support |
| Sendable/actor isolation warnings | High (architectural fixes) |
| Removed API (UIAlertView, etc.) | Low (direct replacement) |
Testing After Migration
Smoke tests on real device with new iOS — mandatory. Simulator and real device can behave differently after SDK change, especially in URLSession timeouts, push notifications, background execution.
Crashlytics or Firebase Crash Reporting — after release monitor new crash signatures in first 24–48 hours. SDK migration sometimes brings crashes in edge cases not covered by tests.
Timeline Benchmarks
Timelines depend on codebase size, amount of deprecated API, and dependency state:
| Project | Timeline |
|---|---|
| Small app (< 50k lines, few dependencies) | 1–2 days |
| Medium project (50–150k lines) | 3–5 days |
| Large project with legacy Obj-C code | 1–2 weeks |







