Адресная книга iPhone: список источников и учетных записей
Мне нужно выбрать источник адресной книги, в котором контакты создаются моим приложением.
В приложении "Контакты", когда я выбираю "< Groups", я получаю параметры
- Все контакты
- MobileMe
-
- Все MobileMe
- Компания
- Семья
- Друзья
- ...
- ACME Exchange
-
- Список глобальных адресов Exchange ACME
- Тест CardDAV
Используя функцию ABAddressBookCopyArrayOfAllSources
, я получаю исходные записи для
- Нет имени; Тип: kABSourceTypeMobileMe
- Нет имени; Тип: kABSourceTypeExchangeGAL
- "Адресный"; Тип: kABSourceTypeCardDAV
- "Поиск"; Тип: kABSourceTypeCardDAVSearch
Имена не являются описательными, и я хотел бы показать имена учетных записей в дополнение к имени источника или типу, как это делает приложение Contact.
Знаете ли вы способ узнать имя учетной записи источника или получить все существующие имена учетных записей и источники каждой учетной записи? Любые другие идеи для получения более описательных записей?
Ответы
Ответ 1
Как и в iOS 5.1, для этого нет публичного API.
Можно было бы надеяться, что ABRecordCopyCompositeName()
получит то, что вам нужно, - оно предоставляет "дружественное человеку" имя для записей Person и Group, но, увы, оно возвращает null.
Как указал Грэхем (при предлагании щедрости), прямо запрашивающий 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()
сделать, чтобы все службы, используемые самими Сервисами, были доступны для всех нас.
Ответ 2
Это может помочь:
Получение специального источника ABS из ABAddressBook в iOS 4+
iOS 4+ предоставляет новый API, который позволяет выбрать конкретный ABSource
из ABAddressBook
. Это может быть полезно в качестве некоторых операций, например. создавая ABGroup
, не поддерживаются в некоторых источниках (т.е. Exchange).
"Не все типы групп поддержки типов, более заметные, Exchange ничего не знает о группах". - http://flavors.me/volonbolon#1a5/tumblr
В нем показано, как можно использовать функции, которые используют новый API для получения источников конкретных типов, которые могут использоваться при вызовах ABGroupCreateInSource()
, которые выглядят так, как вы после.