Получить все контактные телефоны пользователей Swift3 / iOS9 +

Большинство вещей, которые я нахожу, используют AddressBook вместо новых контактов. Я пытаюсь отобразить имена и номера телефонов всех контактов пользователя в виде таблицы в приложении. Затем перенесите все эти числа в API, который перекрестно ссылается на то, есть ли у кого-либо из них уже учетные записи, чтобы я мог отобразить кнопку «добавить друга» рядом с теми, которые есть. Есть ли быстрый и простой способ запросить разрешение, а затем собрать все контакты в массив с помощью Swift3 и совместим с iOS9 и новее?

Я не пытаюсь найти или добавить контакт, мне просто нужны все числа и имена в массиве


person Tommy K    schedule 13.02.2017    source источник
comment
Официальная документация - хорошее начало для такого рода вопросов.   -  person Andy Ibanez    schedule 13.02.2017


Ответы (1)


Два фрагмента ниже должны помочь. Я дважды объявил магазин, что вам не нужно делать, если вы используете оба фрагмента в одной области ...

Чтобы получить разрешение:

    let store = CNContactStore()
    store.requestAccess(for: .contacts) { (isGranted, error) in
        // Check the isGranted flag and proceed if true
    }

Чтобы прочитать адресную книгу (я включил несколько ключей наугад, но вы можете выбрать все, что вам подходит):

    let contactStore = CNContactStore()
    let keys = [CNContactPhoneNumbersKey, CNContactFamilyNameKey, CNContactGivenNameKey, CNContactNicknameKey, CNContactPhoneNumbersKey]
    let request1 = CNContactFetchRequest(keysToFetch: keys  as [CNKeyDescriptor])

    try? contactStore.enumerateContacts(with: request1) { (contact, error) in
        for phone in contact.phoneNumbers {
            // Whatever you want to do with it
        }
    }
person ghostatron    schedule 13.02.2017
comment
Почему вы обнаруживаете ошибку, если само закрытие выдает ошибку, которую нужно проверить? - person Andy Ibanez; 13.02.2017
comment
Ой! Я скопировал это из своего кода и удалил лишний мусор. В моем коде я делаю что-то, что может вызвать закрытие, но забыл сделать / поймать. Отредактирую ответ. - person ghostatron; 13.02.2017
comment
это определенно помогает! вы вызываете второй фрагмент в какой-либо функции или в lazy var contacts: [CNContact] = { /* here */ }(), как показано в этом stackoverflow.com/a/39066564/2868510 - person Tommy K; 14.02.2017
comment
Это действительно ваше дело. Я бы поместил второй фрагмент в закрытие первого фрагмента, чтобы разрешение всегда проверялось перед перечислением. Затем внутри закрытия enumerateContacts заполните необходимую информацию в массиве / словаре / во всем, что вы можете получить в другом месте по мере необходимости. - person ghostatron; 14.02.2017