10

我想获取 ABPersonRef 和 A​​BGroupRef 的所有属性的列表,而不必使用 kABPersonFirstNameProperty、kABPersonLastNameProperty 的 iOS 预定义键...我正在使用地址簿,我想遍历所有值一个特定的人。我知道有预定义的键,但苹果将来很可能会添加新的键,所以我想做类似的事情:

ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *allPeople = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
for (int i = 0; i < [allPeople count]; ++i) {
    ABRecordRef person = [allPeople objectAtIndex:i];

    // This is the line that I can't figure out.
    NSArray *allProperties = (NSArray *)ABRecordCopyArrayOfAllProperties(person);
}

我知道我会遇到稍后必须循环的多值项,但目标是获取我可以为单值属性迭代的键列表。我不在乎返回的类是什么,NSArray、NSDictionary……随便。

我非常感谢任何建议!

4

2 回答 2

8

您可以尝试以下方法:

使用弧

NSDictionary* dictionaryRepresentationForABPerson(ABRecordRef person)
{
    NSMutableDictionary* dictionary = [NSMutableDictionary dictionary];

    for ( int32_t propertyIndex = kABPersonFirstNameProperty; propertyIndex <= kABPersonSocialProfileProperty; propertyIndex ++ )
    {
        NSString* propertyName = CFBridgingRelease(ABPersonCopyLocalizedPropertyName(propertyIndex));
        id value = CFBridgingRelease(ABRecordCopyValue(person, propertyIndex));

        if ( value )
            [dictionary setObject:value forKey:propertyName];
    }

    return dictionary;
}
  • 我们使用属性的本地化名称——在不同的语言环境中会有不同的键。
  • 在下一个 iOS 版本中,属性的数量可能会发生变化。

只要propertyName不变成UNKNOWN_PROPERTY

于 2012-06-28T09:53:44.613 回答
2

Aliaksandr 的解决方案并不安全:例如,如果您尝试在特定 ABSource 中创建 ABPerson 记录并使用此方法,您可能会发现联系人无法正确同步到该来源。

我只是从 ABPerson 复制了 25 个 ABPropertyID 的列表,将它们放在一个简单的 int[] 中,然后迭代它们......

        // Loop over all properties of this Person

        // taken from Apple's ABPerson reference page on 9.12.13.
        // URL: https://developer.apple.com/library/ios/documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html#//apple_ref/c/func/ABPersonGetTypeOfProperty

        // count = 25. All are type ABPropertyID

        int propertyArray[25] = {
            kABPersonFirstNameProperty,
            kABPersonLastNameProperty,
            kABPersonMiddleNameProperty,
            kABPersonPrefixProperty,
            kABPersonSuffixProperty,
            kABPersonNicknameProperty,
            kABPersonFirstNamePhoneticProperty,
            kABPersonLastNamePhoneticProperty,
            kABPersonMiddleNamePhoneticProperty,
            kABPersonOrganizationProperty,
            kABPersonJobTitleProperty,
            kABPersonDepartmentProperty,
            kABPersonEmailProperty,
            kABPersonBirthdayProperty,
            kABPersonNoteProperty,
            kABPersonCreationDateProperty,
            kABPersonModificationDateProperty,

            kABPersonAddressProperty,
            kABPersonDateProperty,
            kABPersonKindProperty,
            kABPersonPhoneProperty,
            kABPersonInstantMessageProperty,
            kABPersonSocialProfileProperty,
            kABPersonURLProperty,
            kABPersonRelatedNamesProperty
        };
        int propertyArraySize = 25;



        for ( int propertyIndex = 0; propertyIndex < propertyArraySize; propertyIndex++ ) {
...code here
}                
于 2013-12-09T12:50:25.440 回答