Address Book è la tecnologia di iOS per la memorizzazione dei contatti degli utenti in un database centralizzato e l’accesso di altre applicazioni a queste informazioni. È, in altre parole, l'infrastruttura che gestisce la rubrica, di un dispositivo iOS che può essere messa a disposizione delle altre applicazione per gestire, ad esempio, la condivisione di risorse o le chiamate telefoniche e così via. La tecnologia comprende:
- Un database.
- I framework AddressBook e AddressBookUI.
- L’applicazione Contacts in iOS.
In questo articolo impareremo a interagire con i contatti dell’utente tramite i due framework elencati in precedenza e per farlo avremo bisogno di
- XCode 4.6 disponibile gratuitamente sul Mac App Store
- OS X 10.7.4 o successivo.
- Un Mac.
- Product Name MyAddressBookApp
- Organization Name
- Company Identifier www.html.it it.html
- Bundle Identifier Company Identifier Product Name
- Class Prefix
- Nella schermata principale selezioniamo la voce MyAddressBookApp TARGETS
- Scendiamo in fondo fino alla sezione Linked Frameworks and Libraries
- Premiamo il pulsante +.
- Scegliamo AddressBookUI.framework Add
Il PeoplePicker
Per eseguire alcune operazioni comuni sulla rubrica, iOS mette a disposizione dei controller già pronti come il PeoplePicker
(il nome completo è ABPeoplePickerNavigationController
ma per semplicità lo chiameremo semplicemente PeoplePicker) che permette di presentare all’utente la lista dei contatti per sceglierne uno.
È anche possibile creare un’interfaccia personalizzata ma si raccomanda di utilizzare questo controller quando si deve eseguire questo tipo di compito in modo da fornire all’utente un’esperienza coerente con il resto del sistema operativo.
Preparazione del progetto
Creiamo dunque il nostro progetto. Per prima cosa apriamo XCode 4.6 e scegliamo File / New / Project... Nella colonna di sinistra scegliamo Application (dal riquadro iOS) e nell’area di destra scegliamo Single View Application:

Premiamo Next
Scegliamo iPhone dal campo Devices.
Selezioniamo infine Storyboards e Use Automatic Reference Counting, due componenti che velocizzano enormemente i tempi di sviluppo e permettono di scrivere meno "boilerplate code" (codice ripetitivo).

Premiamo Next Create Documenti
Lasciamo qualche secondo a Xcode per generare tutti i file necessari e premiamo CMD + R
Viene visualizzata una schermata bianca, si tratta del nostro view controller: MABAViewController
Applicare il pattern delegate
Tra poco prepareremo un pulsante che, una volta premuto dall’utente, visualizzi un PeoplePicker contenente la lista dei contatti presenti nella rubrica in modo da permette all’utente di selezionarne uno. Quando un contatto viene selezionato il PeoplePicker comunica al suo delegate la scelta effettuata dall’utente: si tratta di un classico esempio di delegation pattern in iOS.
Avremo bisogno di una classe che possa funzionare come delegate del PeoplePicker, che abbia, in altre parole, alcuni metodi specifici: un buon candidato è il nostro MABAViewController
.
Lo useremo nella prossima pagina.
Implementare il protocollo ABPeoplePickerNavigationControllerDelegate
Dobbiamo fare in modo che MABAViewController implementi il protocollo ABPeoplePickerNavigationControllerDelegate
.
Apriamo il file MABAViewController.h e modifichiamolo come mostrato di seguito:
Il framework è apparso nel Navigator di Xcode sotto la radice del progetto, dobbiamo trascinarlo nel gruppo Frameworks come mostrato di seguito.

Se premiamo CMD + B warning
Il problema è che, pur avendo dichiarato il nostro view controller come un delegate del PeoplePicker, non abbiamo implementato i metodi obbligatori
Apriamo MABAViewController.m
@end
- (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { [self dismissViewControllerAnimated:YES completion: nil]; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { [self dismissViewControllerAnimated: YES completion: nil]; return NO; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson: (ABRecordRef)person property: (ABPropertyID)property identifier: (ABMultiValueIdentifier)identifier { return NO; }
Questi metodi vengono chiamati dal PeoplePicker rispettivamente quando:
- L’utente preme Annulla
- L’utente seleziona un contatto.
- L’utente seleziona una proprietà di un contatto.
Finalmente, premendo CMD + B
Il pulsante per visualizzare il PeoplePicker
Creeremo ora un pulsante e collegheremo l’azione del toccare il pulsante alla visualizzazione del PeoplePicker.
- Dal pannello Navigator selezioniamo MainStoryboard.storyboard
- Accertiamoci che la Object Library View Utilities Show Object Library
- Cerchiamo l’oggetto Round Rect Button
Colleghiamo la pressione di questo pulsante all’esecuzione di un nuovo metodo:
- Scegliamo View Assistant Editor Show Assistant Editor
- Ora l’area principale dovrebbe essere divisa in 2 parti, a sinistra MainStoryboard.storyboard MABAViewController.h
- Facciamo click destro sul pulsante che abbiamo creato poco fa.
- Posizioniamo il puntatore sul cerchietto bianco accanto alla voce Touch Down
- Teniamo premuto il click principale e trasciniamo il puntatore sul codice di MABAViewController.h
@end
- Rilasciamo il click principale.
È apparsa una finestra che ci chiede il nome da assegnare al nuovo metodo: digitiamo showPeoplePicker
Connect
Xcode ha inserito la dichiarazione del metodo showPeoplePicker
Modifichiamolo come mostrato di seguito.
- (IBAction)showPeoplePicker:(id)sender { ABPeoplePickerNavigationController * peoplePicker = [[ABPeoplePickerNavigationController alloc] init]; peoplePicker.peoplePickerDelegate = self; [self presentViewController: peoplePicker animated: YES completion: nil]; }
- La prima
- La seconda
- La terza
A questo punto premiamo CMD + R e verifichiamo quel che accade. Effettivamente ora premendo il pulsante Seleziona un contatto appare la lista dei contatti dell’utente (se la lista è vuota usate il simulatore come fosse un iPhone, premete Home, accedete all’applicazione Contacts e inserite almeno un contatto popolando First Name, Last Name, Birthday e Phone).
Infine possiamo selezionare un contatto o premere Cancel.
Le proprietà Single-Value
Quello che vorremmo fare ora è ricevere dal PeoplePicker l’identificativo del contatto selezionato dall’utente in modo da poter estrarre il suo nome, cognome e data di nascita.
Ancora una volta applichiamo il pattern delegate, infatti come abbiamo visto in precedenza, appena l’utente seleziona un contatto il PeoplePicker invoca il seguente metodo della nostra classe MABAViewController (il secondo dei tre copiati in precedenza, ovvero quello che riceve solo due parametri)
La prima seconda
ABRecordCopyValue(person, kABPersonFirstNameProperty)
Le successive 2
La lista dei campi che possiamo estrarre è la seguente:
- kABPersonFirstNameProperty;
- kABPersonLastNameProperty;
- kABPersonMiddleNameProperty;
- kABPersonPrefixProperty;
- kABPersonSuffixProperty;
- kABPersonNicknameProperty;
- kABPersonFirstNamePhoneticProperty;
- kABPersonLastNamePhoneticProperty;
- kABPersonMiddleNamePhoneticProperty;
- kABPersonOrganizationProperty;
- kABPersonJobTitleProperty;
- kABPersonDepartmentProperty;
- kABPersonEmailProperty;
- kABPersonBirthdayProperty;
- kABPersonNoteProperty;
- kABPersonCreationDateProperty;
- kABPersonModificationDateProperty;
La quinta riga concatena il nome e il cognome.
La sesta dichiara un puntatore di tipo NSString e il costrutto if
Nato nel [ANNO DI NASCITA]
Infine viene inizializzato un oggetto UIAlertView
titleMessage
message
Se proviamo a compilare (CMD + B
ABRecordCopyValue
kABPersonNameProperty
kABPersonLastNameProperty
- Selezioniamo la radice del progetto dal pannello Navigator
- Scegliamo MyAddressBookApp sotto la voce TARGET .
- Scendiamo fino alla sezione Linked Framework and Libraries .
- Aggiungiamo AddressBook.framework .
- Usiamo il pannello Navigator per spostare il framework nel gruppo Frameworks .
Ora apriamo il file MABAViewController.h
@interface
#import <AddressBook/AddressBook.h>
Finalmente possiamo premere CMD + R
Le proprietà Multi-value
Vediamo ora come gestire le proprietà Multi-Value di un contatto come ad esempio il numero di telefono. Si tratta di tipi proprietà che possono ricorrere più volte all’interno di una contatto e ognuna di esse è definita come una coppia (label, value).
Dichiariamo un nuovo metodo nel file MABAViewController.h come mostrato di seguito (il codice va incollato prima dell’istruzione @end).
- (void)displayPhoneNumbersFromPerson: (ABRecordRef)person;
Questo metodo riceverà un singolo parametro che identifica un contatto della rubrica e mostrerà un messaggio di popup contenente la lista di tutti i numeri di telefono associati a quel contatto.
Apriamo ora MAVAViewController.m e implementiamo il nuovo metodo come descritto di seguito.
Il metodo definisce una variabile adatta a contenere una lista di valori Multi-Value e la popola estraendo dal contatto (identificato dalla variabile person
ABRecordCopyValue
kABPersonePhoneProperty
Poi estrae dalla rubrica il nome del contatto selezionato.
Il costrutto for
AVMultiValueCopyLabelAtIndex
ABAddressBookCopyLocalizedLabel
Inoltre usa ABMultiValueCopyValueAtIndex
Dobbiamo ora modificare il metodo
(BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson: (ABRecordRef)person
come mostrato di seguito
- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson: (ABRecordRef)person { [self dismissViewControllerAnimated:YES completion:nil]; [self displayPhoneNumbersFromPerson: person]; return NO; }
La prima riga nasconde il PeoplePicker, la seconda chiama il nostro nuovo metodo e la terza restituisce al PeoplePicker il valore booleano NO
Premiamo CMD + R