ABAddressBook ABSource и ABSourceType - PullRequest
       21

ABAddressBook ABSource и ABSourceType

6 голосов
/ 24 июня 2010

Я пытаюсь создать приложение, которое можно использовать для поиска в GAL Exchange, однако я нахожу новую документацию 4.0 по этому вопросу неясной. Кто-нибудь знает, как я могу искать в GAL имена, содержащие определенную строку (например, "Smi")? Мой исходный код на данный момент практически бесполезен, так как я просто пытаюсь обдумать, как указать, что я хочу выполнять поиск только в глобальном списке адресов, а не в локальных контактах на устройстве. Кроме того, как используется kABSourceTypeSearchableMask? Я здесь упускаю что-то фундаментальное. Из документации ...

Типы источников

Эти константы определяют тип источника.

enum {
    kABSourceTypeLocal       = 0x0,
    kABSourceTypeExchange    = 0x1,
    kABSourceTypeExchangeGAL = kABSourceTypeExchange | kABSourceTypeSearchableMask,
    kABSourceTypeMobileMe    = 0x2,
    kABSourceTypeLDAP        = 0x3 | kABSourceTypeSearchableMask,
    kABSourceTypeCardDAV     = 0x4,
    kABSourceTypeCardDAVSearch = kABSourceTypeCardDAV | kABSourceTypeSearchableMask,
};
typedef int ABSourceType;

Когда я запрашиваю тип источника по умолчанию, я получаю «1», который, по-видимому, указывает на то, что типом по умолчанию является «kABSourceTypeExchange», что будет правильным, так как это то, что я имею в своих настройках. Я не знаю, как выйти за пределы этого пункта ...

Поскольку вся концепция исходного кода является новой для фреймворка ABAddressBook в 4.0, я не думаю, что у людей есть большой опыт с этим, но надеюсь, что кто-то может помочь мне понять, как работать с вышеизложенным ... спасибо.

Ответы [ 3 ]

7 голосов
/ 04 ноября 2010

Чтобы получить доступ к Exchange GAL, вам нужно использовать функцию ABAddressBookCopyArrayOfAllSources, чтобы получить массив всех источников, а затем выполнить итерацию по массиву, чтобы попытаться получить правильный источник для Exchange GAL.Используйте функцию ABRecordCopyValue (), чтобы получить свойство kABSourceTypeProperty источника.

например,

ABRecordRef searchableExchangeSource;

addressBook = ABAddressBookCreate();
CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources(addressBook);
for (CFIndex i = 0; i < CFArrayGetCount(allSources); i++) {
    ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(allSources, i);

    // Get source properties
    NSNumber *sourceTypeRef = (NSNumber *)((CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty));
    NSString *sourceTypeName = (NSString *)((CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty));
    int sourceType = [sourceTypeRef intValue];
    NSLog(@"Found Source Type: %@ with ABSourceType %i", sourceTypeName,sourceType);
    if (sourceType == kABSourceTypeExchangeGAL) {
        searchableExchangeSource = source;
    }
    [sourceTypeRef release];
    [sourceTypeName release];
}

Обратите внимание, если у вас настроено несколько учетных записей "Exchange", вы получите несколько источников с одним и тем же ABSourceType.К сожалению, из моего ограниченного тестирования, kABSourceTypeNameProperty для GAL Exchange имеет значение NULL, поэтому вы не можете использовать это свойство для различения нескольких источников GAL Exchange.

Как только у вас есть соответствующий источник, он имеет тип ABRecordRef, так что выможет взаимодействовать с ним так же, как и с любой другой записью.

1 голос
/ 25 января 2011

Я разместил код здесь: Получение определенного ABSource из ABAddressBook в iOS 4 +

для определения конкретных источников. Это может помочь вам понять, как работать с ABAddressBook.

0 голосов
/ 28 марта 2014

Обновление ответа Mixja

  1. ABAddressBookCreate () устарел.Объявите ссылку в интерфейсе:
    • Также удалите: addressBook = ABAddressBookCreate();
  2. Обновите объявление sourceTypeRef & sourceTypeName:
  3. Изменитевызовы метода release:

    // 1.
    @property(nonatomic, assign) ABAddressBookRef *addressBook;
    // 2.
    NSNumber *sourceTypeRef = (__bridge NSNumber *)((CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty));
    NSString *sourceTypeName = (__bridge NSString *)((CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty));
    
    // 3.
    CFRelease((__bridge CFTypeRef)(sourceTypeRef));
    CFRelease((__bridge CFTypeRef)(sourceTypeName));
    

Окончательный код должен выглядеть примерно так:

Убедитесь, что включен шаг 1!

    ABRecordRef searchableExchangeSource;

    CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources(_addressBook);
    for (CFIndex i = 0; i < CFArrayGetCount(allSources); i++) {
    ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(allSources, i);

    // Get source properties
    NSNumber *sourceTypeRef = (__bridge NSNumber *)((CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty));
    NSString *sourceTypeName = (__bridge NSString *)((CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty));
    int sourceType = [sourceTypeRef intValue];
    NSLog(@"Found Source Type: %@ with ABSourceType %i", sourceTypeName,sourceType);
    if (sourceType == kABSourceTypeExchangeGAL) {
        searchableExchangeSource = source;
    }
    CFRelease((__bridge CFTypeRef)(sourceTypeRef));
    CFRelease((__bridge CFTypeRef)(sourceTypeName));
...