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

Кто-нибудь знает, как получить домашний адрес из мультиадреса в 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"];



                }
            }
        }

        NSUInteger 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 (NSUInteger i = 0; i < people.count; i++)
{
    ABRecordRef person = CFArrayGetValueAtIndex((__bridge CFArrayRef)people, i);

    // Access the person's 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) Если было более одного адреса, используйте ячейки с именем и первым адресом и кнопку "Выбрать другой адрес". Если пользователь нажимает эту кнопку, анимируйте лист, где пользователь видит другую таблицу всех адресов, и можете выбрать ту, которая ему нужна.

Другие вопросы по тегам