Интеграция контактов (Contacts framework) в iOS-приложение
Apple переименовала и переписала API контактов начиная с iOS 9 — старый AddressBook framework давно 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 дней. Стоимость рассчитывается индивидуально.







