iphone - todos - itunes
Libreta de direcciones del iPhone: Lista de fuentes y cuentas (2)
Necesito seleccionar la fuente de la libreta de direcciones en la que mi aplicación crea los contactos.
En la aplicación Contactos, cuando selecciono "<Grupos", obtengo las opciones
- Todos los contactos
- MobileMe
- Todo MobileMe
- Empresa
- Familia
- Amigos
- ...
- ACME Exchange
- Lista global de direcciones de ACME Exchange
- Prueba CardDAV
- Directorio
- Buscar
Usando la función ABAddressBookCopyArrayOfAllSources
, obtengo registros de origen para
- Sin nombre; tipo: kABSourceTypeMobileMe
- Sin nombre; tipo: kABSourceTypeExchangeGAL
- "Directorio"; tipo: kABSourceTypeCardDAV
- "Buscar"; tipo: kABSourceTypeCardDAVSearch
Los nombres no son de ninguna manera descriptivos y me gustaría mostrar los nombres de las cuentas además del nombre o tipo de fuente, al igual que la aplicación de contacto.
¿Conoce alguna forma de averiguar el nombre de cuenta de una fuente o de recuperar todos los nombres de cuenta existentes y las fuentes de cada cuenta? ¿Alguna otra idea para obtener entradas más descriptivas?
A partir de iOS 5.1 no hay una API pública para esto.
Uno esperaría que ABRecordCopyCompositeName()
obtendría lo que está buscando: proporciona el nombre "amigable para los humanos" para los registros de Persona y Grupo, pero lamentablemente devuelve el valor nulo.
Como señaló Graham (cuando ofrece una recompensa), pedir directamente a kABSourceNameProperty
proporciona la respuesta incorrecta.
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);
Todo lo que puedo sugerir es presentar un Radar para solicitar que ABRecordCopyCompositeName()
se haga para que cualquier servicio que los Contactos están usando esté disponible para el resto de nosotros.
Esto puede ayudar:
Obtención de una fuente de ABS específica de ABAddressBook en iOS 4+
iOS 4+ proporciona una nueva API que permite seleccionar una ABSource
de ABSource
específica de ABAddressBook
. Esto puede ser útil ya que algunas operaciones, por ejemplo, la creación de un grupo ABGroup
, no se admiten en algunas fuentes (es decir, Exchange).
"No todos los tipos de fuente admiten grupos, de manera más visible, Exchange no sabe nada acerca de los grupos". - http://flavors.me/volonbolon#1a5/tumblr
Muestra cómo se pueden usar las funciones que aprovechan la nueva API para obtener fuentes de tipos específicos que pueden usarse en las llamadas a ABGroupCreateInSource()
, que parece ser lo que está buscando.