vez varios todos sincronizar pasar los golpe eliminar cómo contactos contacto como borrar iphone csv import-contacts

varios - sincronizar contactos iphone



Cómo obtener detalles de contactos de iphone y hacer un archivo CSV de ese contacto (4)

A continuación está el código para obtener toda la información del libro de contactos de iPhone ...

-(void)collectContacts { NSMutableDictionary *myAddressBook = [[NSMutableDictionary alloc] init]; ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); for(int i = 0;i<ABAddressBookGetPersonCount(addressBook);i++) { ABRecordRef ref = CFArrayGetValueAtIndex(people, i); // Get First name, Last name, Prefix, Suffix, Job title NSString *firstName = (NSString *)ABRecordCopyValue(ref,kABPersonFirstNameProperty); NSString *lastName = (NSString *)ABRecordCopyValue(ref,kABPersonLastNameProperty); NSString *prefix = (NSString *)ABRecordCopyValue(ref,kABPersonPrefixProperty); NSString *suffix = (NSString *)ABRecordCopyValue(ref,kABPersonSuffixProperty); NSString *jobTitle = (NSString *)ABRecordCopyValue(ref,kABPersonJobTitleProperty); [myAddressBook setObject:firstName forKey:@"firstName"]; [myAddressBook setObject:lastName forKey:@"lastName"]; [myAddressBook setObject:prefix forKey:@"prefix"]; [myAddressBook setObject:suffix forKey:@"suffix"]; [myAddressBook setObject:jobTitle forKey:@"jobTitle"]; NSMutableArray *arPhone = [[NSMutableArray alloc] init]; ABMultiValueRef phones = ABRecordCopyValue(ref, kABPersonPhoneProperty); for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) { CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j); NSString *phoneLabel =(NSString*) ABAddressBookCopyLocalizedLabel (ABMultiValueCopyLabelAtIndex(phones, j)); NSString *phoneNumber = (NSString *)phoneNumberRef; NSMutableDictionary *temp = [[NSMutableDictionary alloc] init]; [temp setObject:phoneNumber forKey:@"phoneNumber"]; [temp setObject:phoneLabel forKey:@"phoneNumber"]; [arPhone addObject:temp]; [temp release]; } [myAddressBook setObject:arPhone forKey:@"Phone"]; [arPhone release]; CFStringRef address; CFStringRef label; ABMutableMultiValueRef multi = ABRecordCopyValue(ref, kABPersonAddressProperty); for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++) { label = ABMultiValueCopyLabelAtIndex(multi, i); CFStringRef readableLabel = ABAddressBookCopyLocalizedLabel(label); address = ABMultiValueCopyValueAtIndex(multi, i); CFRelease(address); CFRelease(label); } ABMultiValueRef emails = ABRecordCopyValue(ref, kABPersonEmailProperty); NSMutableArray *arEmail = [[NSMutableArray alloc] init]; for(CFIndex idx = 0; idx < ABMultiValueGetCount(emails); idx++) { CFStringRef emailRef = ABMultiValueCopyValueAtIndex(emails, idx); NSString *strLbl = (NSString*) ABAddressBookCopyLocalizedLabel (ABMultiValueCopyLabelAtIndex (emails, idx)); NSString *strEmail_old = (NSString*)emailRef; NSMutableDictionary *temp = [[NSMutableDictionary alloc] init]; [temp setObject:strEmail_old forKey:@"strEmail_old"]; [temp setObject:strLbl forKey:@"strLbl"]; [arEmail addObject:temp]; [temp release]; } [myAddressBook setObject:arEmail forKey:@"Email"]; [arEmail release]; } [self createCSV:myAddressBook]; } -(void) createCSV :(NSMutableDictionary*)arAddressData { NSMutableString *stringToWrite = [[NSMutableString alloc] init]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[arAddressData valueForKey:@"firstName"]]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[arAddressData valueForKey:@"lastName"]]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[arAddressData valueForKey:@"jobTitle"]]]; //[stringToWrite appendString:@"fname, lname, title, company, phonetype1, value1,phonetype2,value,phonetype3,value3phonetype4,value4,phonetype5,value5,phonetype6,value6,phonetype7,value7,phonetype8,value8,phonetype9,value9,phonetype10,value10,email1type,email1value,email2type,email2value,email3type,email3‌​value,email4type,email4value,email5type,email5value,website1,webs‌​ite2,website3"]; NSMutableArray *arPhone = (NSMutableArray*) [arAddressData valueForKey:@"Phone"]; for(int i = 0 ;i<[arPhone count];i++) { NSMutableDictionary *temp = (NSMutableDictionary*) [arPhone objectAtIndex:i]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[temp valueForKey:@"phoneNumber"]]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[temp valueForKey:@"phoneNumber"]]]; [temp release]; } NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentDirectory=[paths objectAtIndex:0]; NSString *strBackupFileLocation = [NSString stringWithFormat:@"%@/%@", documentDirectory,@"ContactList.csv"]; [stringToWrite writeToFile:strBackupFileLocation atomically:YES encoding:NSUTF8StringEncoding error:nil]; }

Deseo obtener detalles de contacto en un iPhone con información como Nombre, Apellido, Número de teléfono, Tipo de número de teléfono, Dirección de correo electrónico, Tipo de dirección de correo electrónico, etc.

Alguien me puede ayudar con eso?

Quiero hacer un archivo .csv de los detalles de contacto en un iPhone en particular. Quiero buscar datos de la libreta de direcciones de iPhone.


Primero deberá usar el marco de la libreta de direcciones, por lo que debe agregarlo a su proyecto de Xcode.

A continuación, deberá dividir la tarea en un par de pasos.

1) Obtener las personas dentro de la libreta de direcciones

2) Crea tu archivo .csv. Supongo que sabe algo sobre el formato de archivo CSV usando caracteres para separar campos y cuándo agregar caracteres de retorno para que tenga un archivo con el formato correcto. Esto probablemente se deje para otro hilo de preguntas si necesita ayuda con esto.

3) Guarde su archivo .csv en algún lugar

1) Para obtener una matriz de todas las personas en la libreta de direcciones, haría algo como lo siguiente. La documentación de referencia para ABAddressBook está aquí . Debería ser muy útil para ayudarlo a acceder a los datos.

ABAddressBook *sharedBook = [ABAddressBook sharedAddressBook]; NSArray *peopleList = [sharedBook people];

2) Deberá iterar a través de cada una de las personas y crear sus datos generales de csv. Por lo general, debe crear manualmente los datos csv en un NSString y luego convertirlos a NSData y guardar el NSData en un archivo. Esto no es ideal si se trata de un conjunto de datos realmente grande. Si este es el caso, entonces probablemente desee que algún código escriba sus datos csv en el archivo en fragmentos para que pueda liberar memoria sobre la marcha. Para simplificar, mi código simplemente muestra que se crea el archivo completo y luego se guardan las obras completas.

NSString *csvString = @""; for(ABPerson *aPerson in peopleList) { //Do something here to write each property you want to the CSV file. csvString = [csvString stringByAppendingFormat:@"''%@''," [aPerson valueForProperty:kABFirstNameProperty]]; } NSData *csvData = [csvString dataUsingEncoding:NSUTF8StringEncoding];

3) Escribe tu archivo en algún lado

//This is an example of writing your csv data to a file that will be saved in the application''s sand box directory. //This file could be extracted using iTunes file sharing. //Get the proper path to save the file NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"my_file.csv"]; //Actually write the data BOOL isSuccessful = [csvData writeToFile:fullPath atomically:NO]; if(isSuccessful) { //Do something if the file was written } else { //Do something if there was an error writing the file }


Utilicé el código de iApple de arriba como punto de partida y creé una versión de trabajo a partir de él; este solo recopila todas las entradas de la libreta de direcciones en una matriz. Como se mencionó anteriormente, el iApple original no funciona, hay algunos errores en él. Este funciona, y fue probado.

Nota: Esto no devuelve ningún contacto que no tenga un nombre establecido; puede eliminarlo para su propio código, simplemente lo hice porque solo necesito contactos con nombres establecidos, y NSMutableDictionary no le gusta las entradas nulas (bloqueos) )

En mi propia libreta de direcciones tengo algunas entradas que son solo un correo electrónico. No estoy seguro de cómo llegaron allí, pero es ciertamente posible tener entradas de la libreta de direcciones sin nombre. Tenga esto en cuenta cuando itere sobre una libreta de direcciones.

Estoy usando el nombre completo según las recomendaciones de Apple: ABRecordCopyCompositeName devuelve un compuesto de nombre y apellido en el orden especificado por el usuario.

Finalmente, hice esto un método estático y lo puse en una clase de ayuda.

¡Esto es para usar con ARC!

// returns an array of dictionaries // each dictionary has values: fullName, phoneNumbers, emails // fullName is a string // phoneNumbers is an array of strings // emails is an array of strings + (NSArray *)collectAddressBookContacts { NSMutableArray *allContacts = [[NSMutableArray alloc] init]; ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); for(int i = 0;i<ABAddressBookGetPersonCount(addressBook);i++) { NSMutableDictionary *aPersonDict = [[NSMutableDictionary alloc] init]; ABRecordRef ref = CFArrayGetValueAtIndex(people, i); NSString *fullName = (__bridge NSString *) ABRecordCopyCompositeName(ref); if (fullName) { [aPersonDict setObject:fullName forKey:@"fullName"]; // collect phone numbers NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init]; ABMultiValueRef phones = ABRecordCopyValue(ref, kABPersonPhoneProperty); for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) { NSString *phoneNumber = (__bridge NSString *) ABMultiValueCopyValueAtIndex(phones, j); [phoneNumbers addObject:phoneNumber]; } [aPersonDict setObject:phoneNumbers forKey:@"phoneNumbers"]; // collect emails - key "emails" will contain an array of email addresses ABMultiValueRef emails = ABRecordCopyValue(ref, kABPersonEmailProperty); NSMutableArray *emailAddresses = [[NSMutableArray alloc] init]; for(CFIndex idx = 0; idx < ABMultiValueGetCount(emails); idx++) { NSString *email = (__bridge NSString *)ABMultiValueCopyValueAtIndex(emails, idx); [emailAddresses addObject:email]; } [aPersonDict setObject:emailAddresses forKey:@"emails"]; // if you want to collect any other info that''s stored in the address book, it follows the same pattern. // you just need the right kABPerson.... property. [allContacts addObject:aPersonDict]; } else { // Note: I have a few entries in my phone that don''t have a name set // Example one could have just an email address in their address book. } } return allContacts; }