【问题标题】:I am retrieving contact's multiple addresses but only want Home address我正在检索联系人的多个地址,但只需要家庭地址
【发布时间】:2013-06-25 15:03:42
【问题描述】:

有谁知道如何在 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];                
        }

如果有人能花时间为我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: ios abaddressbook abmultivalue


    【解决方案1】:

    您需要遍历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);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      这个问题没有单一的解决方案。我在我的应用程序中执行以下操作:

      1) 如果此人只有一个地址,请使用该地址。

      2) 如果有多个地址,请使用包含名称和第一个地址的单元格,以及显示“选择不同地址”的按钮。如果用户点击该按钮,则在一张表上设置动画,用户可以在其中看到另一个包含所有地址的表格,并且可以选择他们想要的那个。

      【讨论】:

      • 我通过将多个地址保存在一个数组中,然后通过 objectatindex:0 从该数组中提取家庭地址来做到这一点,它总是返回家庭地址,如果有任何工作地址,objectatindex:1 返回工作地址否则它会返回错误.....
      • 很高兴知道!我从来没有真正看过索引是否有价值。我能看到的唯一问题是,如果没有设置 HOME,那么会添加一个不同的地址,因此索引 0 处的地址是业务。可能是一个非常不可能的事件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2013-08-13
      • 2016-12-26
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多