0

I am trying to fetch multiple phone numbers from the contacts of device.

It's working fine if the contact have only one number, but it's f***** when they have multiple numbers (which means that I'm getting "\U00a" in between the numbers).

I tried every solution I could think of, but it's still not working.

ABMultiValueRef phonesRef = ABRecordCopyValue(person, kABPersonPhoneProperty);
for (int i = 0; i < ABMultiValueGetCount(phonesRef); i++) {
    CFStringRef currentPhoneLabel = ABMultiValueCopyLabelAtIndex(phonesRef, i);
    CFStringRef currentPhoneValue = ABMultiValueCopyValueAtIndex(phonesRef, i);

    if (CFStringCompare(currentPhoneLabel, kABPersonPhoneMobileLabel, 0) == kCFCompareEqualTo) {
        [contactInfoDict setObject:(__bridge NSString *) currentPhoneValue forKey:@"mobileNumber"];
    }

    else if (CFStringCompare(currentPhoneLabel, kABHomeLabel, 0) == kCFCompareEqualTo) {
        [contactInfoDict setObject:(__bridge NSString *) currentPhoneValue forKey:@"homeNumber"];
    }

    CFRelease(currentPhoneLabel);
    CFRelease(currentPhoneValue);
}
John Slegers
  • 38,420
  • 17
  • 182
  • 152
coreDeviOS
  • 1,188
  • 2
  • 12
  • 25

1 Answers1

0

You can use Contacts Framework. Hope this will provide you direct solution for contacts.

#import <Contacts/Contacts.h>

-(void)getContact{
 CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {

    // make sure the user granted us access

    if (!granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            // user didn't grant access;
            // so, again, tell user here why app needs permissions in order  to do it's job;
            // this is dispatched to the main queue because this request could be running on background thread
        });
        return;
    }

    // build array of contacts

    NSMutableArray *contacts = [NSMutableArray array];

    NSError *fetchError;
    CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey]];

    BOOL success = [store enumerateContactsWithFetchRequest:request error:&fetchError usingBlock:^(CNContact *contact, BOOL *stop) {
        [contacts addObject:contact];
    }];
    if (!success) {
        CTLog(@"error = %@", fetchError);
    }
    __weak typeof(self)weakSelf = self;
    [weakSelf parseContactWithContact:contacts];
}];

- (void)parseContactWithContact :(NSMutableArray* )contacts{
for (CNContact *contact in contacts)
{
    NSString * firstName =  contact.givenName;
    NSString * lastName =  contact.familyName;
    NSString *StrContactName = [NSString stringWithFormat:@"%@ %@",firstName,lastName];
    NSArray * arryPhone = [[contact.phoneNumbers valueForKey:@"value"] valueForKey:@"digits"];

    for (int i=0; i<[arryPhone count]; i++)
    {
        NSMutableDictionary *mDictValue = [[NSMutableDictionary alloc]init];
        [mDictValue setValue:firstName forKey:@"firstName"];
        [mDictValue setValue:lastName forKey:@"lastName"];
        [mDictValue setValue:StrContactName forKey:@"contactName"];
        [mDictValue setValue:[arryPhone objectAtIndex:i] forKey:@"Phone"];
        [arrayOfContacts addObject:mDictValue];
    }
}
ManiaChamp
  • 811
  • 7
  • 20
  • I want user to pick the contact not all the contacts for that i have to use ABPeoplePickerNavigationController. – coreDeviOS Feb 18 '16 at 07:47