Search code examples
iosobjective-ciphonecocoa-touchios9

Error in Exporting Contacts Using Address Book Framework iOS 9?


Contacts are not getting added in the address book. Error Saving person to AddressBook in iOS 9 but working in iOS 6. When i add the contact then the if block is executed with Log Error Saving person to AddressBook.

-(void)addContactToPhoneBook{

ABPeoplePickerNavigationController *peoplePicker=[[ABPeoplePickerNavigationController alloc] init];
addressBook = [peoplePicker addressBook];

// create person record
person = ABPersonCreate();

cfError = nil;


if (firstName) {
    ABRecordSetValue(person, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName) , nil);
}

if (jobTitle) {
    ABRecordSetValue(person, kABPersonJobTitleProperty,(__bridge CFTypeRef)(jobTitle), nil);
}

if (personEmail)
{
    ABMutableMultiValueRef emailMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    ABMultiValueAddValueAndLabel(emailMultiValue, (__bridge CFStringRef) personEmail, kABWorkLabel, NULL);
    ABRecordSetValue(person, kABPersonEmailProperty, emailMultiValue, nil);
    CFRelease(emailMultiValue);
}

if (phoneNo)
{
    ABMutableMultiValueRef phoneNumberMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    NSArray *venuePhoneNumbers = [phoneNo componentsSeparatedByString:@" or "];
    for (NSString *venuePhoneNumberString in venuePhoneNumbers)
        ABMultiValueAddValueAndLabel(phoneNumberMultiValue, (__bridge CFStringRef) venuePhoneNumberString, kABPersonPhoneMainLabel, NULL);
    ABRecordSetValue(person, kABPersonPhoneProperty, phoneNumberMultiValue, nil);
    CFRelease(phoneNumberMultiValue);
}

// add address

ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init];

ABMultiValueAddValueAndLabel(multiAddress, (__bridge CFDictionaryRef) addressDictionary, kABWorkLabel, NULL);
ABRecordSetValue(person, kABPersonAddressProperty, multiAddress, NULL);
CFRelease(multiAddress);


//Add person Object to addressbook Object.
ABAddressBookAddRecord(addressBook, person, &cfError);

if (ABAddressBookSave(addressBook, nil))
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Success" message:@"Contact added sucessfully" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
    [alert show];
    NSLog(@"\nPerson Saved successfuly");
} else
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Failed" message:@"Failed to add contact" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
    [alert show];
    NSLog(@"\n Error Saving person to AddressBook");
}  
 }

Solution

  • Try this

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        arrContactName = [[NSMutableArray alloc]init];
        arrPhoneNumber = [[NSMutableArray alloc]init];
        arrAddContact = [[NSMutableArray alloc]init];
    
    }
    -(void)viewWillAppear:(BOOL)animated
    {
        ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
    
        if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
        {
            ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
                if (granted) {
                    [self dismissViewControllerAnimated:YES completion:nil];
                } else {
                    [self dismissViewControllerAnimated:YES completion:nil];
                }
            });
        }
        else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
        {
            [self getAllContacts];
        }
        else
        {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Unable to Access!" message:@"Grant us access now! Change privacy setting in settings app." delegate:self cancelButtonTitle:@"Not now" otherButtonTitles:@"OK", nil];
            [alert show];
        }
    }
    #pragma mark -
    #pragma mark - Get All Contacts
    -(void)getAllContacts
    {
        CFErrorRef error = NULL;
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
    
        if (addressBook != nil)
        {
            NSArray *allContacts = (__bridge_transfer NSArray    *)ABAddressBookCopyArrayOfAllPeople(addressBook);
    
            NSUInteger i = 0;
            for (i = 0; i < [allContacts count]; i++)
            {
                ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
                NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
                NSString *lastName =  (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
                if (lastName == nil) {
                    strLastname = @"";
                }
                else
                    strLastname = lastName;
    
                NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, strLastname];
                NSString *phone=nil;
                ABMultiValueRef phoneNumbers = ABRecordCopyValue(contactPerson,                                                                                kABPersonPhoneProperty);
                if (ABMultiValueGetCount(phoneNumbers) > 0) {
                    phone = (__bridge_transfer NSString*)
                    ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
                } else {
                    phone = @"[None]";
                }
                [arrContactName addObject:fullName];
                [arrPhoneNumber addObject:phone];
                NSLog(@"Full Name =%@",fullName);
                NSLog(@"Phone Number =%@",phone);
            }
            CFRelease(addressBook);
        }
    }
    

    Hope this helps.