Obtener una lista de todos los contactos en iOS

Quiero obtener una lista de todos los contactos de un iPhone.

He comprobado Address Book de referencia, puedo perdido algo, pero no veo proporciona un método para obtener una lista de contactos.

InformationsquelleAutor Chiron | 2010-09-19

13 Kommentare

  1. 98

    Quizás ABPerson función ABAddressBookCopyArrayOfAllPeople podría hacer?

    Ejemplo:

    ABAddressBookRef addressBook = ABAddressBookCreate( );
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
    CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );
    
    for ( int i = 0; i < nPeople; i++ )
    {
        ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, i );
        ...
    }
    • Tomó nota de los recientes lectores, ABAddressBookCreate() ha quedado obsoleto (a partir de iOS 6) en favor de ABAddressBookCreateWithOptions(NULL, error).
    • ¿cómo funciona cuando hay más de 5.000 contactos? ¿cómo podemos gestionar la memoria?
    • ¿cómo medir la cantidad de memoria que los costos de la 5000+ contactos? No estoy seguro de que este es un problema a menos que usted asignar demasiadas imágenes en un bucle y no desasignar manualmente al final de cada iteración. (sólo tienes que utilizar autoreleasepool{})
  2. 103

    En mi respuesta original, al final de esta respuesta, voy a mostrar cómo recuperar contactos en las versiones de iOS anteriores a la 9.0 en una manera que soluciona algunos de los problemas ocasionados por otras respuestas aquí.

    Pero, si sólo se apoya iOS 9 y versiones posteriores, se debe utilizar el Contacts marco, evitando algunos de los molestos puente problemas implicó cuando se utiliza la mayor AddressBook marco.

    Así, en iOS 9, tendría que utilizar la Contacts marco:

    @import Contacts;

    Usted también necesita actualizar su Info.plist, la adición de un NSContactsUsageDescription de explicar por qué su aplicación requiere el acceso a los contactos.

    Y, a continuación, haga algo como lo siguiente:

    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);
        }
    }];

    A continuación es mi respuesta aplicable si el apoyo a las versiones de iOS anteriores a iOS 9.0.

    Un par de reacciones, no sólo a su pregunta, pero también muchas de las respuestas proporcionadas aquí (que no solicite el permiso, no se manejan ABAddressBookCreateWithOptions correctamente los errores, o fugas):

    1. Obviamente, la importación de la AddressBook marco:

      #import <AddressBook/AddressBook.h>

      o

      @import AddressBook;
    2. Debe solicitar el permiso para que la aplicación para acceder a los contactos. Por ejemplo:

      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. Tenga en cuenta que por encima, no he utilizado el patrón sugerido por otros:

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

      Que no es correcto. Como puedes ver arriba, usted desea:

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

      El ex patrón de no capturar el error correctamente, mientras que el último. Si error no era NULL, no te olvides de CFRelease (o de transferencia de la propiedad de ARCO como hice yo) o pérdida de ese objeto.

    4. Para iterar a través de los contactos que desea:

      - (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. Quiero llamar su atención a un bastante detalle clave, a saber, la «Crear Regla»:

      Núcleo de la Fundación funciones tienen nombres que indican cuando usted es dueño de un objeto devuelto:

      • Objeto de creación de las funciones que tienen «Create» incrustado en el nombre;

      • Objeto de la duplicación de las funciones que tienen «Copy» incrustado en el nombre.

      Si usted es dueño de un objeto, es su responsabilidad para renunciar a la propiedad (mediante CFRelease) cuando haya terminado con él.

      Esto significa que usted asume la responsabilidad por la liberación de cualquier objeto de devolución por cualquier Núcleo de Fundación de la función con Create o Copy en el nombre. Usted puede llamar CFRelease explícitamente (como hice anteriormente con addressBook y phoneNumbers) o, para los objetos que el apoyo exento de peaje, puentes, usted puede transferir la propiedad de ARCO con __bridge_transfer o CFBridgingRelease (como hice anteriormente con allPeople, lastName, firstName, y phoneNumber).

      El analizador estático (pulse cambio+comando+B en Xcode o seleccione «Analizar» desde el «Producto» en el menú), se pueden identificar muchas situaciones en las que lo dejaron de observar este «Crear Regla» y no pudo liberar los objetos adecuados. Así, cada vez que la escritura de los Cimientos Básicos código como este, siempre se ejecutan a través del analizador estático para asegurarse de que usted no tiene ninguna obvio fugas.

    • Nota: a Veces los números de teléfono se han \U00a0 espacios en ellos. Usted puede quitar con número de teléfono = [[número de teléfono componentsSeparatedByCharactersInset:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@»»]; en la línea después de conseguir el teléfono de cadena
    • Supongo que hay un error en la línea de ‘if (estado == CNAuthorizationStatusDenied || estado == CNAuthorizationStatusDenied) {‘ supongo que el otro estado significó CNAuthorizationStatusRestricted
  3. 23

    Utilizar este código para mostrar todos los nombres de + lastnames + phonenumbers (iOS 6). Funciona en el simulador demasiado:

    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(@"=============================================");
    
    }
  4. 12

    Asegúrese de que tiene la correcta importación

    #import <AddressBook/AddressBook.h>

    Entonces usted puede conseguir un CFArray objeto con todos los contactos a través de

    CFArrayRef ABAddressBookCopyArrayOfAllPeople (ABAddressBookRef addressBook);
    • +1 por ser la única respuesta (en la actualidad) que han incluido la biblioteca requiere
  5. 10

    De iOS 6, asegúrese de usar ABAddressBookCreateWithOptions, que es la versión actualizada 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
    }
  6. 9

    Actualización para iOS 9.0. Apple ha dejado de utilizar AddressBook y ahora han añadido Contacts marco:

    Agregar CNContactStore propiedad y definir de esta manera:

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

    A continuación, agregue estos métodos para leer todos los contactos:

    -(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;
    }
    }

    Antes de iOS 9.0 => Uso AddressBook marco.
    Usted tiene que comprobar para el acceso y la solicitud de acceso a la lista de contactos:

    //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;
     }
       }
  7. 7

    Gracias a mahesh y wzbozon, el siguiente código funcionó para mí:

    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];
                 }
             });
         }
     });
  8. 5

    Swift versión:

    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)")
    
    
        }
    
    }
  9. 1

    Esto funciona para ios 7 y ios 8 , espero su ayuda usted………….

    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]];
    • functions en última if caso es indefinido. También CFStringCompare intenta convertir NSStringCompareOptions a NSStringCompareFlags.
  10. 0
    ABAddressBookRef addressBook = ABAddressBookCreate( );
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
    CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );
    
    for ( int i = 0; i < nPeople; i++ )
    {
    ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, i );
      ...
    }
  11. 0

    Esta es la demostración completa para recuperar todos los contactos con la vista tabla.

    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
        }
    
    }
    • Es este código es también para la generación de código QR de un contacto?
  12. 0

    si desea ordenar como un orden alfabético, usted puede utilizar a continuación el código.

     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);

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...