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.
Véase también: http://stackoverflow.com/questions/1552325 Esa pregunta, desafortunadamente, no tiene una respuesta aceptada. –