Without memory leak & crashing.
#pragma mark - get address book - (NSArray *)getAllContacts{ CFErrorRef *error = nil; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); __block BOOL accessGranted = NO; if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6 dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { accessGranted = granted; dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); } else { // we're on iOS 5 or older accessGranted = YES; } if (accessGranted) { #ifdef DEBUG NSLog(@"Fetching contact info ----> "); #endif ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error); ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName); CFIndex nPeople = CFArrayGetCount(allPeople); NSMutableArray* items = [NSMutableArray arrayWithCapacity:nPeople]; for (int i = 0; i < nPeople; i++) { ContactsData *contacts = [ContactsData new]; ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); //get First Name and Last Name contacts.firstNames = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); contacts.lastNames = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty); if (!contacts.firstNames) { contacts.firstNames = @""; } if (!contacts.lastNames) { contacts.lastNames = @""; } // get contacts picture, if pic doesn't exists, show standart one // NSData *imgData = (__bridge NSData *)ABPersonCopyImageData(person); // contacts.image = [UIImage imageWithData:imgData]; // if (!contacts.image) { // contacts.image = [UIImage imageNamed:@"NOIMG.png"]; // } // //get Phone Numbers // // NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init]; // // ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhoneProperty); // for(CFIndex i=0;i<ABMultiValueGetCount(multiPhones);i++) { // // CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i); // NSString *phoneNumber = (__bridge NSString *) phoneNumberRef; // [phoneNumbers addObject:phoneNumber]; // // //NSLog(@"All numbers %@", phoneNumbers); // // } // [contacts setNumbers:phoneNumbers]; //get Contact email NSMutableArray *contactEmails = [NSMutableArray new]; ABMultiValueRef multiEmails = ABRecordCopyValue(person, kABPersonEmailProperty); for (CFIndex i=0; i<ABMultiValueGetCount(multiEmails); i++) { CFStringRef contactEmailRef = ABMultiValueCopyValueAtIndex(multiEmails, i); NSString *contactEmail = (__bridge_transfer NSString *)contactEmailRef; [contactEmails addObject:contactEmail]; // NSLog(@"All emails are:%@", contactEmails); } CFBridgingRelease(multiEmails); [contacts setEmails:contactEmails]; //---- if no mail id found then dont add contact if (contactEmails && contactEmails.count != 0) { [items addObject:contacts]; } #ifdef DEBUG // NSLog(@"Person is: %@ # %@", contacts.firstNames,contacts.lastNames); // NSLog(@"Phones are: %@", contacts.numbers); // NSLog(@"Email is:%@", contacts.emails); #endif } CFBridgingRelease(addressBook); CFBridgingRelease(allPeople); CFBridgingRelease(source); return items; } else { #ifdef DEBUG NSLog(@"Cannot fetch Contacts :( "); #endif return nil; } }
No comments:
Post a Comment