Iphone Contact Exporter

Wczoraj pojawił się mały problem. Michał kombinował jak by tu wydłubać kontakty z Iphone ale jednocześnie nie synchronizować go z niczym. Pomyślałem, że dobrym pomysłem byłoby wyeksportowanie kontaktów do pliku CSV i przesłanie ich mailem. Potem można już z tym zrobić co się chce.

Napisałem więc prostą aplikację i wrzucę kawałki kodu źródłowego, bo może ktoś jeszcze będzie chciał z tego skorzystać.

Na początek importy:

Dla dostępu do książki adresowej potrzebujemy:

#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>

Do wysłania emaila będziemy potrzebować jeszcze:

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

Dodatkowo trzeba dodać w deklaracji naszego view controllera obsługę protokołu <MFMailComposeViewControllerDelegate>

Kod do importu książki adresowej wygląda tak:

- (IBAction)Import:(id)sender {
    ABAddressBookRef ab=ABAddressBookCreate();
    CFArrayRef people=ABAddressBookCopyArrayOfAllPeople(ab);
    CFIndex ii=ABAddressBookGetPersonCount(ab);
    NSString *wszystko=@"";
    for(int i=0;i<ii;i++)
    {
        ABRecordRef record=CFArrayGetValueAtIndex(people, i);
        NSString   *FirstName=(__bridge NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty);
        NSString   *LastName=(__bridge NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty);
        NSArray *Email=(__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(ABRecordCopyValue(record, kABPersonEmailProperty));
         NSArray *Phone=(__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(ABRecordCopyValue(record, kABPersonPhoneProperty));

        NSString *outputRecord=[NSString stringWithFormat:@"%@; %@; %@; %@\n",FirstName,LastName,[self arrayToString: Email],[self arrayToString: Phone]];

        wszystko=[wszystko stringByAppendingString:outputRecord];
    }

    [OutputContactList setText:wszystko];
}

Zaimportowane kontakty z będą zapisane jako tekst oddzielany średnikami – po jednej linii na kontakt. Importuję tylko pola: imię, nazwisko, wszystkie numery telefonów i wszystkie adresy e-mail.

Na końcu przygotowane dane wrzucam do TextView OutputContactList

W związku z tym, że numery telefonów i emaile są przechowywane w tablicy zrobiłem sobie jeszcze jedną pomocnicza funkcję:

- (NSString *)arrayToString:(NSArray *)ar
    {
        NSString *s=@"";
        int i=0;
        if([ar count]>0)
        {
        for(NSString *pozycja in ar)
        {
            i=i+1;
            s=[[s stringByAppendingString:pozycja] stringByAppendingString:@";"];
        }
        }
        for (int j=i;  j <= 3 ;j++)
        {
            s=[s stringByAppendingString:@";"];
        }
        return s;
    }

Przekształca ona tablice na ciąg 4 elementów oddzielanych średnikami – jak tablica jest mniejsza to dopełnia ją – zakładam, że nie będę miał więcej numerów telefonów lub adresów email.

Pozostaje jeszcze wysłanie emaila z danymi:

- (IBAction)sendMail:(id)sender {
    MFMailComposeViewController *mailController=[[MFMailComposeViewController alloc]init];
    [mailController setMailComposeDelegate:self];
    [mailController setMessageBody:[OutputContactList text] isHTML:NO];
    [mailController setSubject:@"Sending contacts"];
    NSArray *recp=[[NSArray alloc]initWithObjects:[emailAddress text], nil ];
    [mailController setToRecipients:recp];
    [self presentModalViewController:mailController animated:YES]; 
}

Ten kod otworzy okienko i przygotuje e-mail do wysłania.

Pozostaje jeszcze obsłużenie zamknięcia okna:

-(void ) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    [controller dismissModalViewControllerAnimated:YES];
}

I właściwie gotowe.

Efekt końcowy u mnie wygląda mniej więcej tak:

 

Jeżeli macie pytania to zapraszam do komentowania