web-dev-qa-db-fra.com

Obtenir une liste de tous les contacts sur iOS

Je veux obtenir une liste de tous les contacts d'un iPhone.

J'ai vérifié Address Book référence, j'ai peut-être oublié quelque chose, mais je ne l'ai pas vu. Il fournit une méthode pour obtenir une liste de contacts.

70
Chiron

Peut-être que ABPerson fonction ABAddressBookCopyArrayOfAllPeople pourrait faire?

Exemple :

ABAddressBookRef addressBook = ABAddressBookCreate( );
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );

for ( int i = 0; i < nPeople; i++ )
{
    ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, i );
    ...
}
97
martin clayton

Dans ma réponse initiale, à la fin de cette réponse, je montre comment récupérer des contacts dans des versions iOS antérieures à la version 9.0 de manière à résoudre certains des problèmes liés aux autres réponses fournies ici.

Mais, si vous ne supportez que iOS 9 et les versions ultérieures, vous devez utiliser le framework Contacts, en évitant les problèmes de pontages gênants inhérents à l’utilisation de l’ancien framework AddressBook.

Donc, dans iOS 9, vous utiliseriez le framework Contacts:

@import Contacts;

Vous devez également mettre à jour votre Info.plist, en ajoutant un NSContactsUsageDescription pour expliquer pourquoi votre application nécessite un accès aux contacts.

Et puis faites quelque chose comme suit:

CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted) {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Access to contacts." message:@"This app requires access to contacts because ..." preferredStyle:UIAlertControllerStyleActionSheet];
    [alert addAction:[UIAlertAction actionWithTitle:@"Go to Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
    }]];
    [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
    [self presentViewController:alert animated:TRUE completion:nil];
    return;
}

CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {

    // make sure the user granted us access

    if (!granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            // user didn't grant access;
            // so, again, tell user here why app needs permissions in order  to do it's job;
            // this is dispatched to the main queue because this request could be running on background thread
        });
        return;
    }

    // build array of contacts

    NSMutableArray *contacts = [NSMutableArray array];

    NSError *fetchError;
    CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactIdentifierKey, [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]]];

    BOOL success = [store enumerateContactsWithFetchRequest:request error:&fetchError usingBlock:^(CNContact *contact, BOOL *stop) {
        [contacts addObject:contact];
    }];
    if (!success) {
        NSLog(@"error = %@", fetchError);
    }

    // you can now do something with the list of contacts, for example, to show the names

    CNContactFormatter *formatter = [[CNContactFormatter alloc] init];

    for (CNContact *contact in contacts) {
        NSString *string = [formatter stringFromContact:contact];
        NSLog(@"contact = %@", string);
    }
}];

La réponse ci-dessous s’applique si les versions iOS antérieures à iOS 9.0 sont prises en charge.

-

Quelques réactions non seulement à votre question, mais également à de nombreuses réponses fournies ici (qui ne réussissent pas à demander l'autorisation, ne gèrent pas correctement les erreurs ABAddressBookCreateWithOptions, ou fuient):

  1. Évidemment, importez le framework AddressBook:

    #import <AddressBook/AddressBook.h>
    

    ou

    @import AddressBook;
    
  2. Vous devez demander l'autorisation de l'application pour accéder aux contacts. Par exemple:

    ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
    
    if (status == kABAuthorizationStatusDenied || status == kABAuthorizationStatusRestricted) {
        // if you got here, user had previously denied/revoked permission for your
        // app to access the contacts and all you can do is handle this gracefully,
        // perhaps telling the user that they have to go to settings to grant access
        // to contacts
    
        [[[UIAlertView alloc] initWithTitle:nil message:@"This app requires access to your contacts to function properly. Please visit to the \"Privacy\" section in the iPhone Settings app." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        return;
    }
    
    CFErrorRef error = NULL;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
    
    if (!addressBook) {
        NSLog(@"ABAddressBookCreateWithOptions error: %@", CFBridgingRelease(error));
        return;
    }
    
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
        if (error) {
            NSLog(@"ABAddressBookRequestAccessWithCompletion error: %@", CFBridgingRelease(error));
        }
    
        if (granted) {
            // if they gave you permission, then just carry on
    
            [self listPeopleInAddressBook:addressBook];
        } else {
            // however, if they didn't give you permission, handle it gracefully, for example...
    
            dispatch_async(dispatch_get_main_queue(), ^{
                // BTW, this is not on the main thread, so dispatch UI updates back to the main queue
    
                [[[UIAlertView alloc] initWithTitle:nil message:@"This app requires access to your contacts to function properly. Please visit to the \"Privacy\" section in the iPhone Settings app." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
            });
        }
    
        CFRelease(addressBook);
    });
    
  3. Notez que ci-dessus, je n'ai pas utilisé le modèle suggéré par d'autres:

    CFErrorRef *error = NULL;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
    

    Ce n'est pas correct. Comme vous le verrez ci-dessus, vous voulez:

    CFErrorRef error = NULL;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
    

    Le premier modèle ne capturera pas l'erreur correctement, alors que le second le fera. Si error n'était pas NULL, n'oubliez pas de CFRelease (ou transférez la propriété à ARC comme je l'ai fait) sinon vous fuirez cet objet.

  4. Pour parcourir les contacts, vous voulez:

    - (void)listPeopleInAddressBook:(ABAddressBookRef)addressBook
    {
        NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
        NSInteger numberOfPeople = [allPeople count];
    
        for (NSInteger i = 0; i < numberOfPeople; i++) {
            ABRecordRef person = (__bridge ABRecordRef)allPeople[i];
    
            NSString *firstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
            NSString *lastName  = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));
            NSLog(@"Name:%@ %@", firstName, lastName);
    
            ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
    
            CFIndex numberOfPhoneNumbers = ABMultiValueGetCount(phoneNumbers);
            for (CFIndex j = 0; j < numberOfPhoneNumbers; j++) {
                NSString *phoneNumber = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phoneNumbers, j));
                NSLog(@"  phone:%@", phoneNumber);
            }
    
            CFRelease(phoneNumbers);
    
            NSLog(@"=============================================");
        }
    }
    
  5. Je souhaite attirer votre attention sur un détail assez important, à savoir le "Créer une règle" :

    Les fonctions Core Foundation ont des noms qui indiquent quand vous possédez un objet renvoyé:

    • Fonctions de création d’objets dont le nom contient "Create";

    • Fonctions de duplication d’objets dont le nom contient "Copy".

    Si vous possédez un objet, il est de votre responsabilité de renoncer à sa propriété (à l'aide de CFRelease) une fois que vous en avez fini.

    Cela signifie que vous êtes responsable de la libération de tout objet renvoyé par une fonction Core Foundation avec Create ou Copy dans le nom. Vous pouvez appeler explicitement CFRelease (comme je l’ai fait précédemment avec addressBook et phoneNumbers) ou, pour les objets prenant en charge le pontage sans frais, vous pouvez transférer la propriété à ARC avec __bridge_transfer ou CFBridgingRelease (comme je l’ai fait précédemment avec allPeople, lastName, firstName et phoneNumber).

    L'analyseur statique (appuyez sur shift+command+B dans Xcode ou choisissez "Analyser" dans le menu "Produit") permet d'identifier de nombreuses situations dans lesquelles vous avez négligé d'observer cette "règle de création" et omis de libérer les objets appropriés. Ainsi, chaque fois que vous écrivez du code Core Foundation de cette manière, exécutez-le toujours dans l'analyseur statique pour vous assurer de ne pas avoir de fuites évidentes.

102
Rob

Utilisez ce code pour afficher tous les noms + noms + numéros de téléphone (iOS 6). Fonctionne aussi sur simulateur:

CFErrorRef *error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);

for(int i = 0; i < numberOfPeople; i++) {

    ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i );

    NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
    NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
    NSLog(@"Name:%@ %@", firstName, lastName);

    ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);

    for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {
        NSString *phoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i);
        NSLog(@"phone:%@", phoneNumber);
    }

    NSLog(@"=============================================");

}
23
wzbozon

Assurez-vous d'avoir l'importation appropriée

#import <AddressBook/AddressBook.h>

Ensuite, vous pouvez obtenir un objet CFArray avec tous les contacts en utilisant

CFArrayRef ABAddressBookCopyArrayOfAllPeople (ABAddressBookRef addressBook);
12
Hector204

Dans iOS 6, assurez-vous d'utiliser ABAddressBookCreateWithOptions, qui est la version mise à jour de ABAddressBookCreate.

CFErrorRef * error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);

for(int i = 0; i < numberOfPeople; i++){
  ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i );
  // More code here
}
10
danielM

Mise à jour pour iOS 9.0. Apple déconseille AddressBook et maintenant ils ont ajouté Contacts framework:

Ajoutez la propriété CNContactStore et définissez-la comme suit:

self.contactsStrore = [[CNContactStore alloc] init];

Ajoutez ensuite ces méthodes pour lire tous les contacts:

-(void)checkContactsAccess{

[self requestContactsAccessWithHandler:^(BOOL grandted) {

    if (grandted) {

        CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactNamePrefixKey, CNContactMiddleNameKey, CNContactPhoneNumbersKey]];
        [self.contactsStrore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {

            NSLog(@"%@", contact.familyName);
            NSLog(@"%@", contact.givenName);
            NSLog(@"%@", contact.namePrefix);
            NSLog(@"%@", contact.middleName);
            NSLog(@"%@", contact.phoneNumbers);
            NSLog(@"=============================================");
        }];
    }
}];
}

-(void)requestContactsAccessWithHandler:(void (^)(BOOL grandted))handler{

switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]) {
    case CNAuthorizationStatusAuthorized:
        handler(YES);
        break;
    case CNAuthorizationStatusDenied:
    case CNAuthorizationStatusNotDetermined:{
        [self.contactsStrore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {

            handler(granted);
        }];
        break;
    }
    case CNAuthorizationStatusRestricted:
        handler(NO);
        break;
}
}

Avant iOS 9.0 => Utilisez le framework AddressBook. Vous devez d'abord vérifier l'accès et demander l'accès aux contacts de l'utilisateur:

// Prompt the user for access to their Address Book data
-(void)requestAddressBookAccess
{
   YourViewController * __weak weakSelf = self;

  ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error)
                                         {
                                             if (granted)
                                             {
                                                 dispatch_async(dispatch_get_main_queue(), ^{
                                                     [weakSelf accessGrantedForAddressBook];

                                                 });
                                             }
                                         });
}



-(void)checkAddressBookAccess
{
   switch (ABAddressBookGetAuthorizationStatus())
       {
        // Update our UI if the user has granted access to their Contacts
    case  kABAuthorizationStatusAuthorized:
        [self accessGrantedForAddressBook];
        break;
        // Prompt the user for access to Contacts if there is no definitive answer
    case  kABAuthorizationStatusNotDetermined :
        [self requestAddressBookAccess];
        break;
        // Display a message if the user has denied or restricted access to Contacts
    case  kABAuthorizationStatusDenied:
    case  kABAuthorizationStatusRestricted:
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Privacy Warning"
                                                        message:@"Permission was not granted for Contacts."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }
        break;
    default:
        break;
 }
   }
9
Hossam Ghareeb

Grâce à mahesh et à wzbozon, le code suivant a fonctionné pour moi:

CFErrorRef * error = NULL;
addressBook = ABAddressBookCreateWithOptions(NULL, error);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
 {
     if (granted)
     {
         dispatch_async(dispatch_get_main_queue(), ^{
             CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
             CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);

             for(int i = 0; i < numberOfPeople; i++){
                 ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i );

                 NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
                 NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
                 NSLog(@"Name:%@ %@", firstName, lastName);

                 ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);

                 NSMutableArray *numbers = [NSMutableArray array];
                 for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {
                     NSString *phoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i);
                     [numbers addObject:phoneNumber];
                 }

                 NSMutableDictionary *contact = [NSMutableDictionary dictionary];
                 [contact setObject:name forKey:@"name"];
                 [contact setObject:numbers forKey:@"numbers"];

                 [all_contacts addObject:contact];
             }
         });
     }
 });
7

Version rapide:

override func viewDidLoad() {
    super.viewDidLoad()

    var error: Unmanaged<CFErrorRef>?

    var addressBook: ABAddressBook = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue()


    if ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.NotDetermined {
        ABAddressBookRequestAccessWithCompletion(addressBook,  {

            (granted:Bool, error:CFErrorRef!) -> Void in

            self.populateFrom(addressBook: addressBook)

        })
    }
    else if ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Authorized {

        self.populateFrom(addressBook: addressBook)

    }

}

func populateFrom(#addressBook:ABAddressBook){
    let allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
    let nPeople = ABAddressBookGetPersonCount(addressBook)
    for index in 0..<nPeople{
        let person: ABRecordRef = Unmanaged<ABRecordRef>.fromOpaque(COpaquePointer(CFArrayGetValueAtIndex(allPeople, index))).takeUnretainedValue()
        let firstName: String = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeUnretainedValue() as? String
        println("\(firstName.debugDescription)")


    }

}
5
Bojan Bozovic

Départ https://github.com/heardrwt/RHAddressBook (254 étoiles 01/2014).

Fournit un encapsuleur ObjC pour AddressBook avec une API beaucoup plus simple.

4
vaughan

Cela fonctionne pour ios 7 et ios 8, j'espère que cela vous aidera .............

NSMutableArray *result = [[NSMutableArray alloc] init];
CFErrorRef *error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
__block BOOL accessGranted = NO;

if (ABAddressBookRequestAccessWithCompletion != NULL){
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
        accessGranted = granted;
        dispatch_semaphore_signal(sema);
    });
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else{
    accessGranted = YES;
}
if (accessGranted){
    // If the app is authorized to access the first time then add the contact
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);

    for (int i=0; i<numberOfPeople; i++){
        CFStringRef phone;
        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
        CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
        CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
        NSString *userName = @"NoName";

        userName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
        userName = [userName stringByReplacingOccurrencesOfString:@"(null)" withString:@""];

        ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
        CFIndex phoneNumberCount = ABMultiValueGetCount( phoneNumbers );

        phone = nil;

        for ( CFIndex ind= 0; ind<phoneNumberCount; ind++ ){
            CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex( phoneNumbers, ind);
            CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex( phoneNumbers, ind);

            // converts "_$!<Work>!$_" to "work" and "_$!<Mobile>!$_" to "mobile"
            // Find the ones you want here
            if (phoneNumberLabel != nil){
                NSStringCompareOptions  compareOptions = NSCaseInsensitiveSearch;
                if(CFStringCompare(phoneNumberLabel, CFSTR("mobile"),compareOptions)){
                    phone = phoneNumberValue;
                }
                phone = phoneNumberValue;

                NSStringCompareOptions  compareOptionss = NSCaseInsensitiveSearch;
                if(!CFStringCompare(phone, CFSTR("1-800-MY-Apple"),compareOptionss)){
                    continue;
                }
                NSMutableArray *theKeys = [NSMutableArray arrayWithObjects:@"name", @"small_name",@"phone", @"checked", nil];
                NSMutableArray *theObjects = [NSMutableArray arrayWithObjects:userName, [userName lowercaseString],phone, @"NO", nil];
                NSMutableDictionary *theDict = [NSMutableDictionary dictionaryWithObjects:theObjects forKeys:theKeys];
                if (![[functions formatNumber:(__bridge NSString *)(phone)] isEqualToString:[[NSUserDefaults standardUserDefaults]valueForKey:@"phoneNumber"]]){
                    [result addObject:theDict];
                }
            }
        }
    }
}
//sort array
NSSortDescriptor * descriptor = [[NSSortDescriptor alloc] initWithKey:@"small_name"
                                                            ascending:YES]; // 1
NSArray * sortedArray = [result sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
1
KumarS

si vous voulez trier alphabétiquement, vous pouvez utiliser le code ci-dessous.

 CFErrorRef *error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);

CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault,
                                                           CFArrayGetCount(allPeople),
                                                           allPeople);

CFArraySortValues(peopleMutable,
                  CFRangeMake(0, CFArrayGetCount(peopleMutable)),
                  (CFComparatorFunction) ABPersonComparePeopleByName,
                  kABPersonSortByFirstName);
0
Emre Gürses
ABAddressBookRef addressBook = ABAddressBookCreate( );
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );

for ( int i = 0; i < nPeople; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, i );
  ...
}
0
mahesh chowdary

C'est une démo complète pour récupérer tous les contacts avec la vue tableau.

import UIKit
import ContactsUI
import AddressBook
import Contacts

class ShowContactsVC: UIViewController,CNContactPickerDelegate,UITableViewDelegate,UITableViewDataSource
{



@IBOutlet weak var tableView: UITableView!
let peoplePicker = CNContactPickerViewController()
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var contacts = [CNContact]()
var option : Int = 0
var userAccessGranted : Bool = false
var dataArray : NSMutableArray?




override func viewDidLoad()
{
    super.viewDidLoad()

    peoplePicker.delegate = self

    self.checkIfUserAccessGranted()

    self.tableView.delegate = self
    self.tableView.dataSource = self


    navigationController!.navigationBar.barTintColor = UIColor.grayColor()


              if(self.userAccessGranted)
      {
         self.tableView.hidden = false
        fetchContacts()

    }

}

func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    if dataArray == nil {
        return 0;
    }
    else{


    return dataArray!.count
}
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier("TableCell", forIndexPath: indexPath) as! ContactsTableViewCell



    let data = dataArray![indexPath.row] as! Data;
    cell.lblName.text = data.name
    cell.imgContact.image = data.image
    return cell
}

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
{
    cell.backgroundColor = UIColor.cyanColor()

}




func checkIfUserAccessGranted()
{
    appDelegate.requestForAccess { (accessGranted) -> Void in
        if accessGranted {
            self.userAccessGranted = true;
        }else{
            self.userAccessGranted = false;
        }
    }
}





func fetchContacts()
{

    dataArray = NSMutableArray()

    let toFetch = [CNContactGivenNameKey, CNContactImageDataKey, CNContactFamilyNameKey, CNContactImageDataAvailableKey]
    let request = CNContactFetchRequest(keysToFetch: toFetch)

    do{
        try appDelegate.contactStore.enumerateContactsWithFetchRequest(request) {
            contact, stop in
            print(contact.givenName)
            print(contact.familyName)
            print(contact.identifier)

            var userImage : UIImage;
            // See if we can get image data
            if let imageData = contact.imageData {
                //If so create the image
                userImage = UIImage(data: imageData)!
            }else{
                userImage = UIImage(named: "no_contact_image")!
            }

            let data = Data(name: contact.givenName, image: userImage)
            self.dataArray?.addObject(data)

        }
    } catch let err{
        print(err)

    }

    self.tableView.reloadData()

}

func contactPickerDidCancel(picker: CNContactPickerViewController)
{
    picker.dismissViewControllerAnimated(true, completion: nil)
    self.navigationController?.popToRootViewControllerAnimated(true)
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



}




import UIKit

class Data {


    let name : String
    let image : UIImage

    init(name : String, image : UIImage) {
        self.image = image
        self.name = name
    }

}
0
Amit Singh