iPhone Address Book: список источников и учетных записей - PullRequest
20 голосов
/ 07 декабря 2010

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

В приложении «Контакты», когда я выбираю «<Группы», я получаю опции </p>

  • Все контакты
  • MobileMe
    • Все MobileMe
    • Компания
    • Семейный
    • Друзья
    • ...
  • ACME Exchange
    • Глобальный список адресов ACME Exchange
  • Тестовая картаDAV
    • Addressbook
    • Поиск

Используя функцию ABAddressBookCopyArrayOfAllSources Я получаю исходные записи для

  • без названия; тип: kABSourceTypeMobileMe
  • без названия; тип: kABSourceTypeExchangeGAL
  • "Addressbook"; тип: kABSourceTypeCardDAV
  • "Поиск"; тип: kABSourceTypeCardDAVSearch

Имена ни в коем случае не являются описательными, и я хотел бы показать имена учетных записей в дополнение к имени или типу источника, как это делает приложение Contact.

Знаете ли вы, как узнать имя учетной записи источника или получить все существующие имена учетных записей и источники каждой учетной записи? Любые другие идеи, чтобы получить больше описательных записей?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2012

Начиная с iOS 5.1 для этого нет общедоступного API.

Можно было бы надеяться, что ABRecordCopyCompositeName() получит то, что вы ищете - оно предоставляет "дружественное человеку" имя для записей о персонале и группе - но, увы, возвращает нуль.

Как указал Грэм (предлагая щедрость), прямо спрашивая kABSourceNameProperty, дает неправильный ответ.

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook);

CFIndex i, c = CFArrayGetCount(sources);
ABRecordRef curSource;

// Log each source name.
for (i=0; i<c; i++) {
    curSource = CFArrayGetValueAtIndex(sources, i);
    NSString *name = (__bridge_transfer NSString *)ABRecordCopyCompositeName(curSource);
    NSLog(@"Alas this is null: %@", name);


    NSString *directValue = (__bridge_transfer NSString *)ABRecordCopyValue(curSource,kABSourceNameProperty);
    NSLog(@"And direct access gives wrong answer: %@", directValue);

}

CFRelease(sources);
CFRelease(addressBook);

Все, что я могу предложить, - это подать радар, чтобы попросить ABRecordCopyCompositeName()быть сделанным, чтобы сделать любую услугу, которую использует сама Контакты, доступной для всех нас.

0 голосов
/ 09 ноября 2011

Это может помочь:

Получение определенного источника ABS из ABAddressBook в iOS 4 +

iOS 4+ предоставляет новый API, который позволяет выбирать конкретный ABSource из ABAddressBook. Это может быть полезно в качестве некоторых операций, например, создание ABGroup, не поддерживается в некоторых источниках (например, Exchange).

«Не все исходные группы поддерживают группы, и, что более очевидно, Exchange ничего не знает о группах». - http://flavors.me/volonbolon#1a5/tumblr

Он показывает, как можно использовать функции, которые используют новый API для получения источников определенных типов, которые могут использоваться при вызовах ABGroupCreateInSource(), который выглядит как то, что вы ищете.

...