Au tout début

La méthode historique originale a été l'utilisation de la fonction ABPersonCopyImageData ( ABRecordRef person ) qui jusqu'à la version 3.2 d'iOS se contentait de retourner un objet contenant la photo du contact telle que définie par l'utilisateur, c'est à dire l'image originale avec son recadrage. Or, à partir de la version 4.0 d'iOS, cette fonction ne prend plus en compte le recadrage de l'image, et retourne la version « brute » de cette dernière.

La nouvelle manière de faire

À partir d'iOS 4.1 est apparu une nouvelle fonction qui est ABPersonCopyImageDataWithFormat ( ABRecordRef person, ABPersonImageFormat format ). Cette fonction, très proche de la première, accepte un second paramètre pouvant prendre les valeurs suivantes :

  • kABPersonImageFormatThumbnail : l'objet retourné représente la photo du contact telle qu'elle est dans le carnet d'adresse (le même comportement que ABPersonCopyImageData avant la version 4.0 d'iOS).
  • kABPersonImageFormatOriginalSize : l'objet retourné représente l'image brute dont est tiré la photo du contact.

La limitation

Le souci avec cette nouvelle fonction est qu'elle n'est disponible qu'à partir de la version 4.1 d'iOS. Les applications en version 4.0.x vont devoir utiliser la fonction d'origine, mais qui a un comportement défectueux par rapport aux versions précédente du système. Il faut juste espérer que les périphériques utilisant cette version d'iOS soient minoritaires.

Le code

Afin de traiter correctement les différentes versions d'iOS, voici un exemple d'implémentation d'un fonction récupérant la photo d'un contact.

// Retourne la photo d'un contact
- (UIImage *) contactPicture:(NSInteger)contactId {
    // Récupère le contact depuis le carnet d'adresse
    ABAddressBookRef addressBook = ABAddressBookCreate();
    ABRecordID recordId = (ABRecordID)[contactId intValue];
    ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, recordId);
 
    // Vérifie la présence d'une photo pour le contact
    if (person != nil && ABPersonHasImageData(person)) {
        if ( &ABPersonCopyImageDataWithFormat != nil ) {
            // iOS >= 4.1
            return [UIImage imageWithData:(NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)];
        } else {
            // iOS < 4.1
            return [UIImage imageWithData:(NSData *)ABPersonCopyImageData(person)];
        }
    } else {
        return nil;
    }
}

Les différents comportements en image

Photo contact