I fixed my code and now it works like a charm, My complete code:
- (id)initAddressBook {
self = [super init];
if (self) {
self.addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookRegisterExternalChangeCallback(self.addressBook, addressBookChangeHandler, NULL);
}
return self;
}
- (void)duplicateUserContactsFromAddressBook:(ABAddressBookRef)myAddressBook {
NSLog(@"duplicateUserContacts");
if (myAddressBook != NULL && kWeHaveAccessToContacts) {
// Get all user contacts
CFArrayRef allContactsRef = [self getAllContactsInAddressBook:myAddressBook];
// Delete old group if exists
[self deleteGroupWithName:kGroupNameMobileControl fromAddressBook:myAddressBook];
// Create Mobile Control 'white list' group
self.groupCallBlockRef = [self createGroupWithName:kGroupNameMobileControl fromAddressBook:myAddressBook];
// Copy contacts to new group
for (int i = 0; i < ABAddressBookGetPersonCount(myAddressBook); i++) {
ABRecordRef personFromContacts = CFArrayGetValueAtIndex(allContactsRef, i);
[self addPerson:personFromContacts toGroup:self.groupCallBlockRef fromAddressBook:myAddressBook];
}
}
}
- (void)deleteGroupWithName:(NSString*)groupName fromAddressBook:(ABAddressBookRef)myAddressBook {
if (myAddressBook != NULL && kWeHaveAccessToContacts) {
CFArrayRef allGroups = ABAddressBookCopyArrayOfAllGroups(myAddressBook);
if (allGroups != NULL) {
for (int i = 0; i < CFArrayGetCount(allGroups); i++) {
ABRecordRef group = CFArrayGetValueAtIndex(allGroups, i);
CFStringRef name = ABRecordCopyCompositeName(group);
NSString *currentGroupName = (__bridge NSString*)name;
if ([currentGroupName isEqualToString:groupName]) {
[self deleteGroup:group fromAddressBook:myAddressBook];
}
}
}
}
}
- (ABRecordRef)getGroupReference:(ABAddressBookRef)myAddressBook {
NSLog(@"getGroupReference");
if (myAddressBook != NULL && kWeHaveAccessToContacts) {
CFArrayRef allGroups = ABAddressBookCopyArrayOfAllGroups(myAddressBook);
if (allGroups != NULL) {
for (int i = 0; i < CFArrayGetCount(allGroups); i++) {
ABRecordRef group = CFArrayGetValueAtIndex(allGroups, i);
CFStringRef name = ABRecordCopyCompositeName(group);
NSString *groupName = (__bridge NSString*)name;
NSLog(@"groupName: %@", groupName);
if ([groupName isEqualToString:kGroupNameMobileControl]) {
self.groupCallBlockRef = group;
break;
}
else {
continue;
}
}
}
}
return self.groupCallBlockRef != NULL ? self.groupCallBlockRef : NULL;
}
- (CFArrayRef)getAllContactsInAddressBook:(ABAddressBookRef)myAddressBook {
NSLog(@"getAllContacts");
if (myAddressBook != NULL && kWeHaveAccessToContacts) {
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(myAddressBook);
self.arrayOfAllContacts = people;
}
else {
self.arrayOfAllContacts = NULL;
}
NSLog(@"Total number of contacts: %li", CFArrayGetCount(self.arrayOfAllContacts));
return self.arrayOfAllContacts;
}
- (void)deleteContact:(ABRecordRef)person inAddressBook:(ABAddressBookRef)myAddressBook {
if (myAddressBook != NULL && kWeHaveAccessToContacts) {
CFErrorRef error = NULL;
ABAddressBookRemoveRecord(myAddressBook, person, &error);
ABAddressBookSave(myAddressBook, &error);
CFRelease(error);
CFRelease(person);
}
}
- (void)blockPerson:(ABRecordRef)person inAddressBook:(ABAddressBookRef)myAddressBook {
BOOL hasContact = [self checkIfContactExists:person inAddressBook:myAddressBook];
if (hasContact) {
NSLog(@"Contact exists, delete him.");
[self deleteContact:person inAddressBook:myAddressBook];
}
else {
NSLog(@"Contact not exists.");
}
}
- (BOOL)checkIfContactExists:(ABRecordRef)person inAddressBook:(ABAddressBookRef)myAddressBook {
__block BOOL answer = NO;
if (myAddressBook != NULL && kWeHaveAccessToContacts) {
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(myAddressBook);
for(int i=0; i<ABAddressBookGetPersonCount(myAddressBook); i++) {
ABRecordRef personToCompare = CFArrayGetValueAtIndex(people, i);
if (ABRecordGetRecordID(personToCompare) == ABRecordGetRecordID(person)) {
answer = YES;
CFRelease(people);
CFRelease(personToCompare);
CFRelease(person);
break;
}
}
}
return answer;
}
- (ABRecordRef)createGroupWithName:(NSString*)groupName fromAddressBook:(ABAddressBookRef)myAddressBook {
NSLog(@"createGroup");
ABRecordRef newGroup = ABGroupCreate();
if (myAddressBook != NULL && kWeHaveAccessToContacts) {
ABRecordSetValue(newGroup, kABGroupNameProperty, (__bridge CFStringRef)groupName, NULL);
ABAddressBookAddRecord(myAddressBook, newGroup, NULL);
ABAddressBookSave(myAddressBook, NULL);
self.groupCallBlockRef = newGroup;
}
return newGroup;
}
- (void)addPerson:(ABRecordRef)person toGroup:(ABRecordRef)group fromAddressBook:(ABAddressBookRef)myAddressBook {
NSLog(@"addContactToGroup");
ABGroupAddMember(group, person, NULL);
ABAddressBookSave(myAddressBook, NULL);
}
static void addressBookChangeHandler(ABAddressBookRef addressBook, CFDictionaryRef info, void *context)
{
if (context) {
[(__bridge CallBlockManager*)context handleAddressBookChange:addressBook withInfo:info];
}
}
- (void)handleAddressBookChange:(ABAddressBookRef)myAddressBook withInfo:(CFDictionaryRef)info {
//
}