2010-05-08 11 views
13

Estoy utilizando AddressBook.framework en mi aplicación de iPhone y me gustaría replicar algo similar a la función de compartir en Contacts.app. Esto básicamente adjunta una vCard de contactos específicos a un correo electrónico. Hasta donde yo sé, no hay nada en la documentación que mencione la generación de una vCard.Generar vCard desde AddressBook.framework

¿Es este un caso de generar uno yo mismo? ¿O hay algo disponible que pueda ayudarme?

+2

Véase también: http://stackoverflow.com/questions/1552325 Esa pregunta, desafortunadamente, no tiene una respuesta aceptada. –

Respuesta

18

Totalmente de acuerdo con la respuesta de Dave DeLong. Solo quiero agregar que dado que simplemente quería crear un archivo vCard (.vcf) y adjuntarlo a una acción de correo electrónico dentro de la aplicación, lo que hice fue crear una cadena, luego un archivo temporal, con todos los campos vCard que tenía datos para .

En mi caso hice un método en mi subclase NSManagedObject para devolver una cadena -vCardRepresentation.

Una categoría Objective-c o un marco simple sería de gran ayuda; podría hacerlo cuando sea el momento.

La página Wikipedia y las especificaciones formales para vCard (3.0) realmente ayudan.

ACTUALIZACIÓN 3: Si está utilizando iOS 5 o posterior Ahora hay una función en ABPerson que puede devolver la representación vCard de los registros de personas dadas:

CFDataRef ABPersonCreateVCardRepresentationWithPeople(CFArrayRef people); 

ACTUALIZACIÓN 2: I' Me apresuré a completar una aplicación, pero como quería crear datos de vCard y agregarlos como archivos adjuntos a los mensajes de correo integrados en la aplicación en varios lugares, ahora hice un controlador de clase separado que hace/oculta los detalles de la sintaxis de vCard. . Entonces solo tengo un método que devuelve una versión NSData de la cadena vCard para agregar directamente a un mensaje de correo como un archivo adjunto. Esta es una solución mucho más limpia, no necesita crear ningún archivo, incluso si fuera solo temporal. Además, en realidad no necesita una representación de NSString de los datos, a menos que desee crear un archivo y usarlo más de una vez para guardar la reconstrucción de los datos.

Mi clase de controlador tiene una serie de métodos -setXXXX que agregan valores a un diccionario donde las claves son cadenas con los nombres de campo vCard, como FN, TEL y ADR. Luego, cuando llamo a su -vCardRepresentation, ahora se devuelve un objeto NSData (creado al escanear el diccionario) que se puede usar directamente en el método -addAttachmentData:mimeType:fileName: de MFMailComposeViewController.

Si puedo ordenar mi código, por lo que es lo suficientemente genérico, lo publicaré más tarde.

ACTUALIZACIÓN: Aquí está mi código, que puede ayudar a alguien a empezar:

- (NSString *)vCardRepresentation 
{ 
    NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; 

    [mutableArray addObject:@"BEGIN:VCARD"]; 
    [mutableArray addObject:@"VERSION:3.0"]; 

    [mutableArray addObject:[NSString stringWithFormat:@"FN:%@", self.name]]; 

    [mutableArray addObject:[NSString stringWithFormat:@"ADR:;;%@", 
          [self addressWithSeparator:@";"]]]; 

    if (self.phone != nil) 
    [mutableArray addObject:[NSString stringWithFormat:@"TEL:%@", self.phone]]; 

    [mutableArray addObject:[NSString stringWithFormat:@"GEO:%g;%g", 
          self.latitudeValue, self.longitudeValue]]; 

    [mutableArray addObject:[NSString stringWithFormat:@"URL:http://%@", 
          self.website]]; 

    [mutableArray addObject:@"END:VCARD"]; 

    NSString *string = [mutableArray componentsJoinedByString:@"\n"]; 

    [mutableArray release]; 

    return string; 
} 

Obviamente estoy haciendo referencia a las propiedades de mi clase, además de un método llamado -addressWithSeparator a la acumulación de los datos para la dirección, que debe incluir el; separador incluso para campos de dirección opcionales.

+0

¡Muchas gracias! Parece un comienzo increíble. – Oliver

+0

¿No lo he probado completamente, pero parece que el campo GEO no se usa en la aplicación AddressBook de Mac al importar el archivo vCard? Agregó algo como lo siguiente al campo de notas en AddressBook: "GEO: 51.34i8rtt". – petert

+1

Esto es de gran ayuda. ¿Qué tipo de MIME utilizaste al adjuntar NSData? Wikipedia dice "Nota: El tipo de texto de Internet text/vcard se usó (incorrectamente) en algunos Documentación SyncML para referirse a vCard 3.0, y el ejemplo se siguió en varias implementaciones". – Oliver

5

No parece haber ningún código publicado públicamente para hacer esto. La versión Mac de AddressBook.framework tiene un ABPersonCopyVCardRepresentation(), pero no hay un equivalente en el iPhone.

Probablemente su mejor opción sea tomar un analizador/constructor existente (como el PEAR builder y parser) y traducirlo a Objective-C.

Otra opción podría ser escribir su propio constructor. La gramática para vCards no es difícil.

5

Here puede descargar el código que genera vCard.

+0

Proporcione alguna aplicación de muestra usando ese Código. Gracias por adelantado. –