ABAddressBook - How to determine if a particular contact has been changed or deleted from the iPhone address book?

I am working on a chat application. Why do I need to save contacts. Therefore, I save all contacts from ABAddressBook in my main data object. The problem is, how can I know if the contact is changed or deleted from the iPhone address book? . So I will modify or delete this contact from my main data object.

if ABRecordGetRecordID(person) can be used as unique key or not 

This belew is the code for adding contacts to the master data.

 ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, nil); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBookRef ); CFIndex nPeople = ABAddressBookGetPersonCount( addressBookRef ); for ( int i = 0; i < nPeople; i++ ) { ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i ); } NSString* firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty); if ([firstName hasPrefix:@"Protected by True"]) { continue; } else if([firstName hasPrefix:@"Identified As Spam"]) { continue; } NSString* lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonLastNameProperty); NSString *userEmail = nil; ABMultiValueRef emailData = ABRecordCopyValue(person, kABPersonEmailProperty); if(ABMultiValueGetCount(emailData) > 0) { NSLog(@"email is:%@",(__bridge NSString *)ABMultiValueCopyValueAtIndex(emailData, 0)); userEmail = (__bridge NSString *)ABMultiValueCopyValueAtIndex(emailData, 0); } NSString* phone = nil; ABMultiValueRef phoneNumbers = ABRecordCopyValue(person,kABPersonPhoneProperty); if (ABMultiValueGetCount(phoneNumbers) > 0) { for (int i=0; i<ABMultiValueGetCount(phoneNumbers); i++) { phone = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, i); NSString *asciiCharacters = @"0123456789"; NSCharacterSet *nonAsciiCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:asciiCharacters] invertedSet]; NSString *stringPhone = [[phone componentsSeparatedByCharactersInSet:nonAsciiCharacterSet] componentsJoinedByString: @""]; NSString *str = stringPhone; stringPhone = [str stringByReplacingOccurrencesOfString:@"^0+" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, str.length)]; NSLog(@"modified %@", stringPhone); NSString *phoneLabelLocalized; CFStringRef labelStingRef = ABMultiValueCopyLabelAtIndex (phoneNumbers, i); phoneLabelLocalized = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(labelStingRef); if ([[PersistentStore getMyJID] rangeOfString:stringPhone].location != NSNotFound) { NSLog(@"my phone %@",stringPhone); continue; } NSFetchRequest *request = [[NSFetchRequest alloc] init]; request.entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:appDelegate.managedObjectContext]; request.predicate = [NSPredicate predicateWithFormat:@"contactNumber = %@", stringPhone]; NSError *executeFetchError = nil; Contact *contact = [[appDelegate.managedObjectContext executeFetchRequest:request error:&executeFetchError] lastObject]; if (!contact) { contact = (Contact *)[NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:appDelegate.managedObjectContext]; [contact setContactFirstName:firstName]; [contact setContactLastName:lastName]; if (firstName && lastName) { [contact setContactFullName:[NSString stringWithFormat:@"%@ %@",firstName,lastName]]; } else if(firstName) { [contact setContactFullName:firstName]; } else { [contact setContactFullName:lastName]; } [contact setContactType:phoneLabelLocalized]; [contact setContactDate:[NSDate date]]; [contact setContactOriginalNumber:phone]; [contact setContactNumber:stringPhone]; [contact setContactEmail:userEmail]; [arrayContacts addObject:stringPhone]; } } } CFRelease(phoneNumbers); NSError *error; if (![appDelegate.managedObjectContext save:&error]) { // This is a serious error saying the record could not be saved. // Advise the user to restart the application } } 
+7
iphone contacts abaddressbook abrecord abperson
source share
2 answers

ABAddressBookRegisterExternalChangeCallback will give you a callback whenever the address book changes.

ABRecordGetRecordID gives a unique identifier for an address book entry (attached to a device, but not globally unique).

These two things are enough for you to register modified and deleted records.

+1
source share

First set of callbacks

 ABAddressBookRef callBackAddressBook = ABAddressBookCreate(); ABAddressBookRegisterExternalChangeCallback(callBackAddressBook, AddressBookExternalChangeCallback, self); 

When a notification appears, it is called below the callback method

 void AddressBookExternalChangeCallback (ABAddressBookRef callBackAddressBook,CFDictionaryRef info,void *context) { // use callBackAddressBook and get information about the changes } 
0
source share

All Articles