Я получаю контакт с несколькими адресами, но хочу только домашний адрес

Кто-нибудь знает, как получить домашний адрес из multiaddress в iOS? У меня есть разрешение от пользователя и всего остального, но проблема в том, что мне нужен только домашний адрес.

ABAddressBookRef addressBook = ABAddressBookCreate();
__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);
 dispatch_release(sema);
}
else { // we're on iOS 5 or older

 accessGranted = YES;
}

if (accessGranted) {

 CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);

 CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

 NSMutableArray *array = [[NSMutableArray alloc] init];

 for( int i = 0 ; i < nPeople ; i++ )

 {
 NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];

 ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i );

 // First Name
 NSString *fName = (__bridge NSString*)ABRecordCopyValue(ref, kABPersonFirstNameProperty);

 // Last Name
 NSString *lName = (__bridge NSString*)ABRecordCopyValue(ref, kABPersonLastNameProperty);

 // Phone
 ABMultiValueRef phoneMultiValue = ABRecordCopyValue(ref, kABPersonPhoneProperty);
 CFArrayRef allPhones = ABMultiValueCopyArrayOfAllValues(phoneMultiValue);
 NSMutableArray *phoneData = [NSMutableArray arrayWithArray:(__bridge NSArray*) allPhones];

 // Email
 ABMultiValueRef emailMultiValue = ABRecordCopyValue(ref, kABPersonEmailProperty);
 CFArrayRef allEmails = ABMultiValueCopyArrayOfAllValues(emailMultiValue);
 NSMutableArray *emailData = [NSMutableArray arrayWithArray:(__bridge NSArray*) allEmails];

 // Address
 ABMultiValueRef addressMultiValue = ABRecordCopyValue(ref, kABPersonAddressProperty);

 CFArrayRef allAddresses = ABMultiValueCopyArrayOfAllValues(addressMultiValue);

 NSMutableArray* addressData = [NSMutableArray arrayWithArray:(__bridge NSArray*) allAddresses];

 for ( int j = 0 ; j < [addressData count]; j++) {
 if ([[addressData objectAtIndex:j] count] > 0) {

 if ([fName length] > 0 || [lName length] > 0) {


 if ([fName length] > 0) {
 [dic setObject:fName forKey:@"FirstName"];
 }

 if ([lName length] > 0) {
 [dic setObject:lName forKey:@"LastName"];
 }

 if ([phoneData count] > 0) {
 [dic setObject:phoneData forKey:@"MultiplePhoneNumbers"];
 }

 if ([emailData count] > 0) {
 [dic setObject:emailData forKey:@"MultipleEmails"];
 }


 [dic setObject:addressData forKey:@"MultipleAddresses"];



 }
 }
 }

 ********** keyCount = [[dic allKeys] count];
 if (keyCount > 0) {

 ABRecordID recId = ABRecordGetRecordID(ref);


 [dic setObject:[NSString stringWithFormat:@"%d",recId] forKey:@"ABRecordRef"];
 [dic setObject:[NSString stringWithFormat:@"%d",i] forKey:@"ab_id"];
 [dic setObject:[NSNumber numberWithBool:FALSE] forKey:@"is_coordinate_fetch"];
 [array addObject:dic]; 
 }

Я был бы очень признателен, если бы кто-нибудь мог занять время и решить это для меня.

2 ответа

Вам нужно выполнить итерацию через многозначное свойство kABPersonAddressProperty и извлечь один из них, соответствующий идентификатору kABHomeLabel. Вот как вы могли бы это сделать в iOS 7 (подразумевает ссылку на адресную книгу):

NSArray *people = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(localAddressBook));

// Iterate through each person in the Address Book
for (********** i = 0; i < people.count; i++)
{
 ABRecordRef person = CFArrayGetValueAtIndex((__bridge CFArrayRef)people, i);

 // Access the person addresses (a ABMultiValueRef)
 ABMultiValueRef addressesProperty = CFAutorelease(ABRecordCopyValue(person, kABPersonAddressProperty));

 if (addressesProperty)
 {
 // Iterate through the address multivalue
 for (CFIndex index = 0; index < ABMultiValueGetCount(addressesProperty); index++)
 {
 // Get the address label
 NSString *addressLabel = (NSString *)CFBridgingRelease(ABMultiValueCopyLabelAtIndex(addressesProperty, index));

 // Check for home address label
 if ([addressLabel isEqualToString:(NSString *)kABHomeLabel])
 {
 // Your code here
 NSLog(@"%@", addressLabel);
 }
 }
 }
}


Единого решения этой проблемы нет. То, что я сделал в своем приложении, было следующим:

1) Если у человека только один адрес, используйте его.

2) Если было более одного адреса, используйте ячейки с именем и первым адресом и кнопку "Выбрать другой адрес". Если пользователь нажал эту кнопку, оживите лист, где пользователь видит другую таблицу всех адресов и может выбрать тот, который они хотят.

licensed under cc by-sa 3.0 with attribution.