My iOS application checks the contacts from time to time and imports a new one to its own database.
I checked that contact and it already exists by the identifier
field, that is usually filled by UUID:
CNContactStore *store = [CNContactStore new];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError *error) {
if (granted) {
NSArray *keys = @[CNContactNamePrefixKey,
CNContactGivenNameKey,
CNContactMiddleNameKey,
CNContactFamilyNameKey,
CNContactInstantMessageAddressesKey];
NSString *containerId = store.defaultContainerIdentifier;
NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId];
NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&err];
for (CNContact *contact in cnContacts) {
...
NSString *contactId = [contact identifier];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"uuid == %@", contactId]];
...
}
Sometimes, the identifier excepts UUID that contains the :ABPerson
string (eg 9326A125-3C0A-494F-9E50-BBFCF1140EF0:ABPerson
), and such contact appears only one time. Next time, the same contact appears, but with another UUID and without the :ABPerson
string.
So, my contacts importer considers that they are 2 different contacts and saves them 2 times.
What is the :ABPerson
string in CNContact identifier?
I know about AddressBook framework with ABPerson
class, but I'm using the Contacts
framework to work with device contacts, why is the :ABPerson
string appearing here?
Can I just filter or check this string in the identifier for preventing contacts duplicates?
Are there other strings that may be contained in CNContact
identifiers?
unifiedContactsMatchingPredicate:predicate:
method. I'm updated my code, so you can look this.UUID
and unlike contacts does not change them between application sessions