Миграція мобільної програми на нову версію iOS SDK
Apple щорічно підвищує мінімальний iOS для нових фіч і посилює вимоги до SDK на App Store Connect. З 2024 року програми зібрані під iOS SDK 17+ повинні використовувати Privacy Manifests. У 2023 році Apple вимагала мінімум iOS 16 SDK для App Store submissions. Затримка з оновленням SDK — спочатку попередження в App Store Connect, потім блокування сабмішена.
Що реально ломається при смені SDK
Deprecated API — найбільша частина роботи. UIWebView видалений починаючи з iOS 15 SDK, програми з його використанням отримують rejection з ITMS-90809. UIAlertView, UIActionSheet, shouldAutorotateToInterfaceOrientation — в iOS 16 SDK ці методи вже не компілюються. Пошук по кодовій базі через Xcode #available + список deprecated з release notes конкретної версії.
Privacy Manifests (iOS 17 SDK) — нове з 2024. Кожна стороння залежність і сама програма повинні мати файл PrivacyInfo.xcprivacy з декларацією використовуваних API категорій (NSPrivacyAccessedAPITypes): NSUserDefaults, NSFileManager, NSProcessInfo, UIDevice.systemBootTime. Якщо файл відсутній — ITMS-91053 попередження при сабміті. Стало помилкою з травня 2024.
Приклад 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) — конкретні коди з документації Apple. CA92.1 для UserDefaults означає «зберігання налаштувань, безпосередньо управляємих користувачем». Неможливо просто написати будь-який код — потрібно вибрати з затвердженого списку. Якщо немає підходящого — писати в Apple через App Review, що саме по собі квест.
Swift Concurrency та Sendable — в iOS 16+ SDK включені розширені перевірки Sendable та actor isolation. Проект, який збирався без попереджень на старому SDK, на новому видає десятки warnings вида Capture of non-Sendable type 'SomeModel'. З iOS 17 SDK частина з них стала помилками при strict concurrency checking: complete. На великих кодових базах це серйозна робота.
Порядок роботи з міграцією
Починаємо з аудиту через 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
Це дає кількісну картину: скільки помилок, які категорії, топ-50 за частотою. На 300k строках коду типова картина при стрибку з iOS 14 SDK на iOS 17 SDK — 15–40 errors та 100–300 warnings.
Сторонні залежності — друга проблема. Бібліотека, не оновлювана 2 роки, може не підтримувати новий SDK. Чеклист:
- CocoaPods:
pod outdatedдля списку застарілих залежностей - SPM: перевіряємо
Package.resolved, ищемо бібліотеки без свіжих тегів на GitHub - Залежності з застарілим
deployment target— конфлікт з новим мінімальним iOS програми
Особливий випадок — залежності без Privacy Manifest. З травня 2024 Apple вимагає manifests від популярних SDK (Firebase, Crashlytics, Amplitude, Adjust та інші оновили свої пакети). Але для менш відомих бібліотек манісеста може не бути, і тоді потрібно або форкнути та додати, або позбавитися залежності.
Миграція по рівнях складності:
| Категорія змін | Трудомісткість |
|---|---|
Заміна UIWebView → WKWebView |
Середня (змінюється API делегатів) |
| Privacy Manifests для кастомного коду | Мала (конфігурація) |
| Privacy Manifests для сторонніх SDK | Залежить від підтримки авторів |
| Sendable/actor isolation warnings | Висока (архітектурні правки) |
| Видалені API (UIAlertView тощо) | Мала (пряма заміна) |
Тестування після міграції
Smoke-тести на реальному пристрої з новим iOS — обов'язково. Simulator і реальне пристрій можуть вести себе по-різному при смені SDK, особливо в частині URLSession timeouts, push notifications, background execution.
Crashlytics або Firebase Crash Reporting — після релізу моніторимо нові crash-сигнатури в перші 24–48 годин. SDK-миграція іноді приносить крахи у edge cases, не покритих тестами.
Ориентири по срокам
Терміни залежать від розміру кодової бази, кількості deprecated API та стану залежностей:
| Проект | Срок |
|---|---|
| Невелике приложение (< 50k строк, мало залежностей) | 1–2 дні |
| Середній проект (50–150k строк) | 3–5 днів |
| Великий проект з legacy Obj-C кодом | 1–2 тижні |







