Программно связать CNContacts

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

Я просмотрел ссылки CNContact и CNContactStore и не вижу способа связать контакты. Возможно ли это, и если да, то как?


person erdekhayser    schedule 19.06.2015    source источник
comment
Вы нашли способ объединить два контакта, кроме создания нового CNMutableContact и объединения атрибутов вручную без дубликатов? Если удалось объединить два контакта, подскажите как?   -  person Adeel    schedule 15.11.2016
comment
@Adeel Я не нашел решения, но и не искал какое-то время.   -  person erdekhayser    schedule 15.11.2016


Ответы (3)


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

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

Документация, ссылка на которую приведена ниже, дает пример «John Appleseed» в iCloud и Facebook.

https://developer.apple.com/library/watchos/documentation/Contacts/Reference/Contacts_Framework/index.html

person Ray Vahey    schedule 22.07.2016

Ниже приведен код для объединения контакта с уже существующим контактом в хранилище контактов. Просто к вашему сведению, уникальные значения, такие как имя, фамилия, будут заменены, а массивы, такие как числа, электронные письма, адреса, будут добавлены к существующим значениям. Ваше здоровье!!

func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
    picker.dismiss(animated: true, completion: nil)
    let identifier = contact.identifier
    updateContact(contactIdentifier: identifier)
}

func updateContact(contactIdentifier: String){

    let keysToFetch = [CNContactViewController.descriptorForRequiredKeys()]
    let contactStore = CNContactStore()
    do {
        let contactToUpdate =  try contactStore.unifiedContact(withIdentifier: contactIdentifier, keysToFetch: keysToFetch).mutableCopy() as! CNMutableContact
        if contactToUpdate.familyName.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            contactToUpdate.familyName = "your value"
        }
        if contactToUpdate.givenName.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            contactToUpdate.givenName = "your value"
        }
        if contactToUpdate.organizationName.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            contactToUpdate.organizationName = "your value"
        }
        if contactToUpdate.jobTitle.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            contactToUpdate.jobTitle = "your value"
        }
  // here the contact used below is the one that you want to merge with 
     an existing one.

        for i in contact.phoneNumbers {
            contactToUpdate.phoneNumbers.append(i)
        }
        for i in contact.emailAddresses {
            contactToUpdate.emailAddresses.append(i)
        }
        for i in contact.postalAddresses {
            contactToUpdate.postalAddresses.append(i)
        }
        let contactsViewController = CNContactViewController(forNewContact: contactToUpdate)
        contactsViewController.delegate = self
        contactsViewController.title = "Edit contact"
        contactsViewController.contactStore = contactStore
        let nav = UINavigationController(rootViewController: contactsViewController)
        DispatchQueue.main.async {
            self.present(nav, animated: true, completion: nil)
        }

    }
    catch {
        print(error.localizedDescription)
    }
}
person Pranav Gupta    schedule 23.09.2017

Я этого точно не знаю, но подозреваю, что iOS только сливает по разным источникам. И если вы создадите оба контакта в одной адресной книге, они не будут объединены.

В библиотеке контактов очень мало поддержки этой области. Вы можете определить, является ли контакт унифицированным и связанным с другим конкретным контактом, используя CNContact.isUnifiedWithContact(withIdentifier:), и вы можете решить, собираетесь ли вы возвращать унифицированные контакты или нет.

person Peter Johnson    schedule 25.02.2021