Как получить контактную информацию о iphone и сделать CSV-файл этого контакта - PullRequest
8 голосов
/ 19 августа 2011

Я хочу получить контактную информацию на iPhone с такой информацией, как имя, фамилия, номер телефона, тип номера телефона, адрес электронной почты, тип адреса электронной почты и т. Д.

Может ли кто-нибудь помочь мне с этим?

Я хочу создать файл .csv из контактных данных конкретного iPhone. Я хочу получить данные адресной книги iPhone.

Ответы [ 4 ]

13 голосов
/ 19 августа 2011

Ниже приведен код для получения всей информации из контактной книги 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];
    }
9 голосов
/ 01 февраля 2012

Я использовал приведенный выше код iApple в качестве отправной точки и создал из него рабочую версию - она ​​просто собирает все записи адресной книги в массиве. Как упоминалось выше, оригинальный iApple не работает, в нем есть несколько ошибок. Этот работает, и был проверен.

Примечание: это не возвращает никаких контактов, у которых нет установленного имени - вы можете удалить это для своего собственного кода, я просто сделал это, потому что мне нужны только контакты с установленными именами, а NSMutableDictionary не любит nil записи (сбои).

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

Я использую полное имя в соответствии с рекомендациями Apple - ABRecordCopyCompositeName возвращает составное имя и фамилию в порядке, указанном пользователем.

Наконец, я сделал это статическим методом и поместил его во вспомогательный класс.

Это для использования с 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;
}
2 голосов
/ 19 августа 2011

Сначала вам нужно будет использовать инфраструктуру адресной книги, так что это должно быть добавлено в ваш проект Xcode.

Затем вам нужно будет разбить задачу на пару шагов.

1) Получить людей внутри адресной книги

2) Создайте свой файл .csv.Я предполагаю, что вы что-то знаете о форматировании файла CSV, используя символы для разделения полей и когда нужно добавлять возвращаемые символы, чтобы у вас был правильно отформатированный файл.Это, вероятно, оставлено для другой цепочки вопросов, если вам нужна помощь в этом.

3) Сохраните ваш файл .csv где-нибудь

1) Чтобы получить массив всех людей в адресной книге, вы бысделать что-то вроде следующего.Справочная документация для ABAddressBook: здесь .Это должно быть очень полезно, чтобы помочь вам получить доступ к данным.

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

2) Вам нужно будет пройтись по каждому человеку и построить ваши общие данные CSV.Обычно вы вручную создаете данные csv в NSString, а затем конвертируете их в NSData и сохраняете NSData в файл.Это не идеально, если вы имеете дело с действительно большим набором данных.Если это так, то вы, вероятно, захотите, чтобы какой-то код записал ваши данные csv в файл порциями, чтобы вы могли освобождать память по мере необходимости.Ради простоты, мой код просто показывает, что вы создаете полный файл, а затем сохраняете все произведения.

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) Запишите файл куда-нибудь

//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
  }
0 голосов
/ 19 августа 2011

См. API адресной книги в частности Импорт и экспорт личных и групповых записей

проверьте также пример теста адресной книги в этом блоге

...