Інтеграція Contacts Framework в iOS-додаток
Apple переіменувала та переписала API контактів починаючи з iOS 9 — старий AddressBook фреймворк давно deprecated, актуальний — Contacts.framework. Незважаючи на це, у проектах до сих пір зустрічається ABAddressBook, який у iOS 18 вже не компілюється без попереджень та зовсім зникне.
Дозволи: що змінилося в iOS 18
З iOS 18 з'явився новий тип доступу — Limited Access. Користувач тепер може вибрати конкретні контакти, які дозволяє читати додатку, замість того щоб давати доступ до всієї адресної книги. CNAuthorizationStatus отримав новий кейс: .limited.
Якщо додаток не обробляє .limited — він мовчки отримує пустий список контактів у частини користувачів iOS 18 і розробники не розуміють чому. Потрібно додати NSContactsLimitedUsageDescription в Info.plist та обробляти цей кейс явно: показувати UI з поясненням, пропонувати розширити доступ через CNContactStore.requestAccess.
Типові задачі та реалізація
Вибірка контактів з потрібними полями через CNContactFetchRequest:
let store = CNContactStore()
let keysToFetch: [CNKeyDescriptor] = [
CNContactGivenNameKey as CNKeyDescriptor,
CNContactFamilyNameKey as CNKeyDescriptor,
CNContactPhoneNumbersKey as CNKeyDescriptor,
CNContactEmailAddressesKey as CNKeyDescriptor,
CNContactThumbnailImageDataKey as CNKeyDescriptor
]
let request = CNContactFetchRequest(keysToFetch: keysToFetch)
request.sortOrder = .familyName
try store.enumerateContacts(with: request) { contact, stop in
// обробляємо поконтактно, не грузимо все в пам'ять одразу
}
enumerateContacts переважніше unifiedContacts(matching:keysToFetch:) при великій адресній книзі: він не завантажує всі контакти в пам'ять одночасно. На iPhone з 3000+ контактів другий варіант дає помітний spike по пам'яті.
Додавання нового контакту з CNMutableContact та збереження через CNSaveRequest — стандартний шлях. При оновленні існуючого контакту потрібно отримати його mutableCopy() — змінення оригіналу CNContact кидає виняток, тому що він immutable.
Що входить у роботу
- Налаштування дозволів під iOS 17 та iOS 18 (Limited Access)
- Вибірка контактів з потрібними полями, сортування
- Пошук за ім'ям, телефоном, email через
CNContactVCardSerializationабо предикати - Створення та оновлення контактів
- Відображення системного
CNContactPickerViewController - Обробка дублів через унікацію (
unifiedContact)
Графік
1–3 дні залежно від обсягу операцій. Базовий read-only доступ з пошуком — 1 день. Повний CRUD з обробкою Limited Access та тестуванням — до 3 днів. Вартість розраховується індивідуально.







