Зауважте: коли ви зібрали чергову збірку для App Store, через годину прийшов лист: «ITMS-91053: Missing Privacy Manifest». З кожною новою версією iOS SDK Apple відключає старі API і вводить обов'язкові вимоги. Без планової міграції ви ризикуєте залишитись без сабмішенів. Ми часто стикаємося з такими ситуаціями і пропонуємо міграцію під ключ — з аудитом, оновленням та гарантією.
Що реально ламається при зміні SDK
Deprecated API — найоб'ємніша частина роботи. UIWebView видалено починаючи з iOS 15 SDK, додатки з його використанням отримують rejection по ITMS-90809. UIAlertView, UIActionSheet, shouldAutorotateToInterfaceOrientation — в iOS 16 SDK ці методи вже не компілюються. Пошук по кодовій базі через Xcode #available + список deprecated з release notes конкретної версії.
Privacy Manifest (iOS 17 SDK) — нове з останніх версій. Кожна стороння залежність і сам додаток повинні мати файл PrivacyInfo.xcprivacy з декларацією використовуваних API категорій (NSPrivacyAccessedAPITypes): NSUserDefaults, NSFileManager, NSProcessInfo, UIDevice.systemBootTime. Якщо файл відсутній — ITMS-91053 попередження при сабміті, що стало помилкою.
Приклад 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> </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. На великих кодових базах це серйозна робота.
Як проходить процес міграції?
-
Аудит через
xcodebuildxcodebuild -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. Наш підхід з автоматичним аудитом швидший за ручний перегляд коду в 10–15 разів.
Аналіз сторонніх залежностей Друга проблема — бібліотеки, які не оновлювалися два роки. Чеклист:
- CocoaPods:
pod outdatedдля списку застарілих залежностей - SPM: перевіряємо
Package.resolved, шукаємо бібліотеки без свіжих тегів на GitHub - Залежності з застарілим
deployment target— конфлікт з новим мінімальним iOS додатка
Особливий випадок — залежності без Privacy Manifest. Apple вимагає manifests від популярних SDK (Firebase, Crashlytics, Amplitude, Adjust та інші оновили свої пакети). Але для менш відомих бібліотек маніфесту може не бути, і тоді потрібно або форкнути і додати, або позбутися залежності.
Міграція за рівнями складності
Категорія змін Трудомісткість Заміна UIWebView→WKWebViewСередня (змінюється API делегатів) Privacy Manifests для кастомного коду Мала (конфігурація) Privacy Manifests для сторонніх SDK Залежить від підтримки авторів Sendable/actor isolation warnings Висока (архітектурні правки) Видалені API (UIAlertView та ін.) Мала (пряма заміна) - CocoaPods:
Що входить в роботу
- Повний аудит кодової бази з xcodebuild та виявлення всіх blocked API
- Налаштування Privacy Manifest для додатка та всіх залежностей
- Оновлення сторонніх SDK до версій, сумісних з новим iOS SDK
- Виправлення Sendable/actor isolation warnings
- Тестування на реальних пристроях з новим iOS
- Документація змін та рекомендації щодо подальшої підтримки
- Гарантована підтримка протягом 30 днів після здачі
Як ми тестуємо після міграції?
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 тижні |
Вартість розраховується індивідуально, але ви економите на ранньому виявленні проблем — витрати на міграцію завжди нижчі, ніж наслідки блокування релізів. Зв'яжіться з нами для точної оцінки. Досвід міграції більше 50 проєктів гарантує, що ми врахуємо всі підводні камені. Отримайте консультацію по вашій кодовій базі — ми проведемо аудит за один день.
Apple App Store Review Guidelines







