Serialiser l’identifiant d’un contact dans l’AddressBook de l’iPhone

Dans la série des billets concernant le développement sur iPhone, en voici un nouveau qui reste dans la veine du précédent (« Récupérer une adresse email dans le AddressBook de l’iPhone »).

L’idée ce coup là, c’est de récupérer un identifiant d’un contact. Je m’explique: dans l’application que je développe je dois enregistrer (sur un serveur distant) des informations concernant un contact sélectionné par l’utilisateur. Clairement, il s’agit du nom, du prénom et de l’adresse email. Puis, dans un second temps, ces données peuvent revenir sur l’iPhone.

Seulement, il pourrait être intéressant de faire directement le lien, lors du retour de l’information, entre les personnes désignée par les données sur le serveur et l’entité qui la représente dans le AddressBook. Pourquoi ? Pour plusieurs raisons. Tout d’abord, imaginez que l’on modifie les informations concernant la personne (cas typique: on a fait une faute de frappe quand on a saisi son nom la première fois ou elle change d’adresse mail). Et bien si on est capable de détecter ce changement quand les données reviennent sur l’iPhone, on pourra répercuter les modifications sur le serveur. La seconde raison est qu’il peut être sympa de faire un lien vers la fiche de la personne dans le AddressBook quand on affiche son nom dans l’application.

Quand on arrive dans le peoplePickerNavigationController: shouldContinueAfterSelectingPerson (donc que l’utilisateur a sélectionne un contact), on ne dispose que d’un objet de type ABRecordRef. Ce type d’objet est difficilement « sérialisable » … Comprenez par là qu’il serait difficile de le transformer en une chaine de caractère et de refaire l’opération inverse (pour le « dé-sérialiser »).

La solution est d’utiliser ABRecordGetRecordID() qui retourne un identifiant unique du contact dans l’ AddressBook. Cette fonction renvoie un objet de type ABRecordID (qui n’est ni plus ni moins qu’un entier !). Au final, pour la convertir en chaine de caractère ça donne (mPerson étant notre objet de type ABRecordRef):

NSString contactId = [NSString stringWithFormat:@"%u", ABRecordGetRecordID(mPerson)];

Ensuite, l’opération inverse (récupérer le ABRecordRef a partir du de la chaine de caractère), c’est simple:

ABRecordRef recordRef = ABAddressBookGetPersonWithRecordID(addressBook, [contactId intValue]);

Notez que dans le cas où le contact n’existe pas (plus), ABAddressBookGetPersonWithRecordID() renvoie NULLVoilà, maintenant on peut effectuer n’importe quelle opération comme si on venait de récupérer le contact à partir du peoplePickerNavigationController.

Cette entrée a été publiée dans Pro, avec comme mot(s)-clef(s) , , , . Vous pouvez la mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>