Подтвердить что ты не робот

Адресная книга iPhone: список источников и учетных записей

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

В приложении "Контакты", когда я выбираю "< Groups", я получаю параметры

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

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

  • Нет имени; Тип: kABSourceTypeMobileMe
  • Нет имени; Тип: kABSourceTypeExchangeGAL
  • "Адресный"; Тип: kABSourceTypeCardDAV
  • "Поиск"; Тип: kABSourceTypeCardDAVSearch

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

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

4b9b3361

Ответ 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(), которые выглядят так, как вы после.