iPhone Programming: Adding a Contact to the iPhone Address Book – January
Adding a contact to the iPhone’s address book isn’t horribly complicated, but it’s not the most straightforward process in the world, either, because the documentation leaves a bit to be desired. There is an
To create a new record, we start out by creating a CFErrorRef variable that will hold any errors that get generated throughout the rest of the process. In my experience, most errors here tend to generate exceptions anyway, but there’s an error parameter, so we may as well use it. Anyway, here’s the line:
CFErrorRef error = NULL;
We then create our reference to the iPhone Address Book with a call to ABAddressBookCreate():
ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate();
And then we create a new person record:
ABRecordRef newPerson = ABPersonCreate();
At this point, we haven’t saved anything to the address book yet, but we can start adding data to the person record. To do this, we use ABRecordSetValue, but some fields need to be formatted differently from others. For some, like first name and last name, we can just pass in a string:
ABRecordSetValue(newPerson, kABPersonFirstNameProper
ABRecordSetValue(newPerson, kABPersonLastNamePropert
kABPersonFirstNameProper
ABRecordSetValue(newPerson, kABPersonOrganizationPro
ABRecordSetValue(newPerson, kABPersonJobTitlePropert
Where it gets a bit trickier is when we want to set our phone, email, or address properties, because these fields use ABMutableMultiValueRef rather than strings to store the data, and the specific data types of the values vary a bit depending on which one we’re talking about. For phone, we would do something like this:
ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutabl
ABMultiValueAddValueAndL
ABMultiValueAddValueAndL
ABMultiValueAddValueAndL
ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone,nil);
CFRelease(multiPhone);
The first two phone types (kABPersonPhoneMainLabel and kABPersonPhoneMobileLabe
kABWorkLabel;
kABHomeLabel;
kABOtherLabel;
Those will file the phone numbers as Work, Home, and Other, respectively. After adding the values to the ABMutableMultiValueRef, we need to call ABRecordSetValue, only this time instead of passing a string in for the third parameter, we pass in multiPhone. Then be sure to free up the memory with CFRelease.
Adding email addresses to the record is pretty similar to adding phone numbers, where we create an ABMutableMultiValueRef of strings:
ABMutableMultiValueRef multiEmail = ABMultiValueCreateMutabl
ABMultiValueAddValueAndL
ABRecordSetValue(newPerson, kABPersonEmailProperty, multiEmail, &error);
CFRelease(multiEmail);
Where it gets a little different is when we go to set the street address values. While we do still use an ABMutableMultiValueRef, we won’t be using kABMultiStringPropertyTy
ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutabl
NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init];
[addressDictionary setObject:@"750 North Orleans Street, Ste 601" forKey:(NSString *) kABPersonAddressStreetKe
[addressDictionary setObject:@"Chicago" forKey:(NSString *)kABPersonAddressCityKey];
[addressDictionary setObject:@"IL" forKey:(NSString *)kABPersonAddressStateKey
[addressDictionary setObject:@"60654" forKey:(NSString *)kABPersonAddressZIPKey];
ABMultiValueAddValueAndL
ABRecordSetValue(newPerson, kABPersonAddressProperty
CFRelease(multiAddress);
kABWorkLabel means that we’re setting this as the contact’s work address. And to add it to the contact record, we call ABRecordSetValue as before, releasing the memory afterward.
The last step is to add the new record to the address book, and save it back to the device:
ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error);
ABAddressBookSave(iPhoneAddressBook, &error);
And then we can check for any errors:
if (error != NULL)
{
NSLog(@”Danger Will Robinson! Danger!”);
}
So that concludes this introduction to creating new records in the address book.