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