diff --git a/Classes/Utils/FastAddressBook.m b/Classes/Utils/FastAddressBook.m index 6cdd65227..f30442ba4 100644 --- a/Classes/Utils/FastAddressBook.m +++ b/Classes/Utils/FastAddressBook.m @@ -147,8 +147,8 @@ static void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef inf - (FastAddressBook*)init { if ((self = [super init]) != nil) { - addressBookMap = [[NSMutableDictionary alloc] init]; - addressBook = nil; + addressBookMap = [NSMutableDictionary dictionary]; + addressBook = nil; [self reload]; } return self; @@ -163,22 +163,28 @@ static void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef inf } - (void)reload { - if(addressBook != nil) { - ABAddressBookUnregisterExternalChangeCallback(addressBook, sync_address_book, (__bridge void *)(self)); - CFRelease(addressBook); - addressBook = nil; - } - NSError *error = nil; + CFErrorRef error; - addressBook = ABAddressBookCreateWithOptions(NULL, NULL); - if(addressBook != NULL) { - ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { - ABAddressBookRegisterExternalChangeCallback (addressBook, sync_address_book, (__bridge void *)(self)); - [self loadData]; - }); - } else { - LOGE(@"Create AddressBook: Fail(%@)", [error localizedDescription]); - } + // create if it doesn't exist + if( addressBook == nil ){ + addressBook = ABAddressBookCreateWithOptions(NULL, &error); + } + + if(addressBook != nil) { + __weak FastAddressBook* weakSelf = self; + ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { + if( !granted ) { + LOGE(@"Permission for address book acces was denied: %@", [(__bridge NSError*)error description]); + return; + } + + ABAddressBookRegisterExternalChangeCallback(addressBook, sync_address_book, (__bridge void *)(weakSelf)); + [weakSelf loadData]; + + }); + } else { + LOGE(@"Create AddressBook failed, reason: %@", [(__bridge NSError*)error localizedDescription]); + } } - (void)loadData { @@ -186,18 +192,24 @@ static void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef inf @synchronized (addressBookMap) { [addressBookMap removeAllObjects]; - NSArray *lContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); - for (id lPerson in lContacts) { + CFArrayRef lContacts = ABAddressBookCopyArrayOfAllPeople(addressBook); + CFIndex count = CFArrayGetCount(lContacts); + for(CFIndex idx = 0; idx < count; idx++){ + ABRecordRef lPerson = CFArrayGetValueAtIndex(lContacts, idx); // Phone { - ABMultiValueRef lMap = ABRecordCopyValue((__bridge ABRecordRef)lPerson, kABPersonPhoneProperty); + ABMultiValueRef lMap = ABRecordCopyValue(lPerson, kABPersonPhoneProperty); if(lMap) { for (int i=0; i