1

I want to email & phone number values programmatically from addressbook in iOS 5 +. I tried following code. It changes the first name & last name but not the email & phone number. Here is my code

ABAddressBookRef addressBook=ABAddressBookCreate();
ABRecordRef record = ABAddressBookGetPersonWithRecordID(addressBook, [userInfo.userId intValue]);
NSNumber *recordId = [NSNumber numberWithInteger:ABRecordGetRecordID(record)];
NSLog(@"recordId:- %d",[recordId intValue]);

// First & Last name
ABRecordSetValue(record, kABPersonFirstNameProperty, (__bridge void*)userInfo.firstName , nil); 
ABRecordSetValue(record, kABPersonLastNameProperty, (__bridge void*)userInfo.lastName, nil);

//Phone number is a list , so create a multivalue    
ABMutableMultiValueRef phoneNumberMultiValue =
ABMultiValueCreateMutable(kABPersonPhoneProperty);
ABMultiValueAddValueAndLabel(phoneNumberMultiValue ,(__bridge void*)userInfo.phoneNumbers,(__bridge void*)userInfo.phoneNumberLabel, NULL);

// Email address is a list , so create a multivalue
ABMutableMultiValueRef emailMultiValue =
ABMultiValueCreateMutable(kABPersonEmailProperty);
ABMultiValueAddValueAndLabel(emailMultiValue ,(__bridge void*)userInfo.emailAddress,(__bridge void*)userInfo.emailAddressLabel, NULL);

// Save Address Book
BOOL isContactEdited = ABAddressBookSave(addressBook, nil);
CFRelease(addressBook);
return isContactEdited;

In my above code phonenumberlabel & emailAddressLabel are label values of phone number & email address . e.g "Mobile" or "Home" etc.

I can't find method to set multivaluerefs like used for first name & lastname. Any kind of help is appreciated. Thanks.

AstroCB
  • 12,337
  • 20
  • 57
  • 73
iOSAppDev
  • 2,755
  • 4
  • 39
  • 77

1 Answers1

1

First, when you select the contact from the PeoplePickerNavigationController:

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {    

    self.selectedPerson = ABRecordGetRecordID(person);

    (...)

}

Then on my .h

@property (nonatomic) ABRecordID selectedPerson;

// adding email to native contacts

Then go back to .m

ABAddressBookRef addressBook = ABAddressBookCreate();
CFErrorRef error = nil;
ABMutableMultiValueRef emailMultiValue = ABMultiValueCreateMutable(kABPersonEmailProperty);
bool didAddEmail = ABMultiValueAddValueAndLabel(emailMultiValue, (__bridge CFTypeRef)(email), kABOtherLabel, NULL);

if(didAddEmail){
    ABRecordSetValue(ABAddressBookGetPersonWithRecordID(addressBook, self.selectedPerson),
                     kABPersonEmailProperty,
                     emailMultiValue,
                     nil);
} else {
    NSLog(@"Error adding email: %@", error);
    error = nil;
}

Then somewhere you have to save the address book somewhere in your code...

bool bSuccess = ABAddressBookSave(addressBook, &error);
if (!bSuccess) {
    NSLog(@"Could not save to address book: %@", error);
}
Andre Cytryn
  • 2,506
  • 4
  • 28
  • 43