В данной статье мы рассмотрим основы взаимодействия с фреймворком Contacts.

Contacts

Фреймворк Contacts обеспечивает Swift и Objective-C API для получения доступа к контактной информации пользователей. Поскольку большинство приложений считывают контактную информацию без внесения изменений, этот фреймворк оптимизирован для потокобезопасного и read-only использования.

Подключение Contacts

Данный фрэймворк включён в список в встроенных библиотек в xCode, поэтому вам не нужно скачивать подов. Для его подключения необходимо лишь добавить его в список подключаемых библиотек и фреймворков. И затем включить его директивой #import <Contacts/Contacts.h> в нужные вам классы. В данной статье мы рассмотрим следующие классы:

  • CNContactStore — класс, позволяющий извлекать и сохранять контакты, группы.
  • CNContactFetchRequest — класс, который отвечает за извлекаемые свойства контактов.
  • CNContact — класс, хранящий данные о контакте, такие как имя, номер телефона и т.д.

Not found

CNContact

Это потокобезопасный класс, который содержит неизменные значения объекта для свойств контакта, таких как имя и номер телефона. Для изменения свойств контакта есть подкласс CNMutableContact, в котором вы можете менять их.

Ниже приведен список основных свойств контакта, которые вы можете получить. Весь список вы можете найти в описании класса CNContact.h.

  • CNContactNamePrefixKey — префикс имени.
  • CNContactGivenNameKey — имя.
  • CNContactMiddleNameKey — отчество
  • CNContactNicknameKey — псевдоним.
  • CNContactBirthdayKey — дата рождения.

Пример использования.

В качестве примера рассмотрим извлечение данных контактов уже содержащихся на устройстве. Все действия в качестве демонстрации будут выполнены в классе AppDelegate.

Для начала нам необходим массив, который будет хранить наши контакты после их извлечения.


@property (strong, nonatomic) NSMutableArray* groupsOfContacts;

NOTE: Для получения доступа к пользовательским данным в iOS 10 необходимо прописать ключ в файле info.plist
Privacy — Contacts Usage Description и его значение $(PRODUCT_NAME) contact use

 

Получение доступа к контактам

Прежде чем извлечь какие-то данные из ваших контактов, необходимо получить к ним доступ. Так давайте сделаем это. В методе didFinishLaunchingWithOptions напишем следующее.


self.groupsOfContacts = [[NSMutableArray alloc] init]; // необходимо инициализировать массив прежде чем делать какие-то действия
if([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusNotDetermined) //проверяем статус доступа, если не определен, то запрашиваем его
{
    CNContactStore * contactStore = [[CNContactStore alloc] init];
    [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if(granted){ //если вы разрешили доступ, то вызовем метод getAllContact, который рассмотрим далее
            [self getAllContact];
        }
    }];
} else {// Если доступ уже дан, то получаем контакты сразу
    [self getAllContact];
}

Если мы всё правильно написали, то должно появиться окно с предоставлением доступа к вашим контактам.

Not found

Получение всех контактов

Для получения контактов напишем следующий метод getAllContact


- (void) getAllContact {

    CNContactStore* addressBook = [[CNContactStore alloc] init]; //объект при помощи которого мы можем извлекать и сохранять данные
    NSArray* keysToFetch = @[CNContactNamePrefixKey, //Ключи объектов, которые хотим извлечь
        CNContactGivenNameKey,
        CNContactMiddleNameKey,
        CNContactNicknameKey,
        CNContactBirthdayKey];

    CNContactFetchRequest* fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch]; //Выгружаем наши контакты, с заданными ключами

    [addressBook enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
        [self.groupsOfContacts addObject:contact]; //Добавляем контакты, которые выгрузили ранее в наш массив, который создали в начале
    }];
}

Отображение извлеченных данных

Вернемся в метод didFinishLaunchingWithOptions и после предоставления доступа напишем следующее


for(CNContact* contact in self.groupsOfContacts) {
    NSLog(@"NamePrefix = %@,\n GivenName = %@,\n MiddleName = %@,\n Nickname = %@,\n Birthday = %@ \n\n\n",
        contact.namePrefix,
        contact.givenName,
        contact.middleName,
        contact.nickname,
        [contact.birthday date]);
}

Пробегаемся по массиву и печатаем, извлеченные нами данные.  В итоге у нас должно получиться что-то такое.

Not found

Заключение

В данной статье мы рассмотрели основы фреймворка Contacts. Разобрали пример, в котором извлекли контакты, которые содержатся на устройстве.

Автор фото: @madeawkward

Спасибо за внимание.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.