iosemailaddressbookabperson

iOS : Can't get the user email address


I want to get the user mail address, as shown in this thread : Getting user's default email address in Cocoa

But when I tried :

NSString *theEmailAddressWeWantToObtain = @"";
ABPerson *aPerson = [[ABAddressBook sharedAddressBook] me];
ABMultiValue *emails = [aPerson valueForProperty:kABEmailProperty];
if([emails count] > 0)
        theEmailAddressWeWantToObtain = [emails valueAtIndex:0];

I have these errors :

I've linked AddressBook and AddressBookUI, and imported AddressBook/AddressBook.h

What's wrong ?


Solution

  • These are the corrections to your code

    NSString *theEmailAddressWeWantToObtain = @"";
    ABPerson *aPerson = [[ABAddressBook sharedAddressBook] me];
    ABMultiValueRef *emails = [aPerson valueForProperty:kABEmailProperty]; //No such thing as ABMultiValue; it's ABMultiValueRef
    if(ABMultiValueGetCount(emails) > 0) //"emails" is not an array, so you can't use the "count" method
        theEmailAddressWeWantToObtain = [emails valueAtIndex:0];
    

    I'm not so familiar with Key Value Coding, so I'm not sure about your methods related to that.

    This is the way I would do it

    There are three email address stored in the email ABMultiValueRef: home, work, and other emails. Try this code to get the home email:

    NSString *email;
    
    ABRecordRef currentPerson = (__bridge ABRecordRef)[[PSAddressBook arrayOfContacts] objectAtIndex:identifier];
    ABMultiValueRef emailsMultiValueRef = ABRecordCopyValue(currentPerson, kABPersonEmailProperty);
    
    NSUInteger emailsCount;    
    //Goes through the emails to check which one is the home email
    for(emailsCount = 0; emailsCount <= ABMultiValueGetCount(emailsMultiValueRef);emailsCount++){ 
        NSString *emailLabel = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex (emailsMultiValueRef, emailsCount);
    
        if([emailLabel isEqualToString:@"Home"]){
    
            if ((__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(emailsMultiValueRef, emailsCount) != NULL){
    
                email = (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonEmailProperty);
            }   
    
            //If the last name property does not exist
            else{
    
                email = @"NULL";
            }
        }
    }
    
    CFRelease(emailsMultiValueRef);
    

    If you have any questions about the code, just ask in the comments. Hope this helps!

    EDIT:

    The PSAddressBook class mentioned in the code can be found here: https://github.com/pasawaya/PSAddressBook