Ich möchte eine Liste aller Kontakte eines iPhones erhalten.
Ich habe die Address Book
Referenz überprüft. Möglicherweise habe ich etwas verpasst, aber ich habe nicht gesehen, dass es eine Methode zum Abrufen einer Kontaktliste bietet.
ios
ios4
abaddressbook
Chiron
quelle
quelle
Antworten:
Vielleicht könnte die
ABPerson
Funktion ABAddressBookCopyArrayOfAllPeople funktionieren?Beispiel :
ABAddressBookRef addressBook = ABAddressBookCreate( ); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook ); CFIndex nPeople = ABAddressBookGetPersonCount( addressBook ); for ( int i = 0; i < nPeople; i++ ) { ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, i ); ... }
quelle
ABAddressBookCreate()
wurde (ab iOS 6) zugunsten von veraltetABAddressBookCreateWithOptions(NULL, error)
.autoreleasepool{}
)In meiner ursprünglichen Antwort am Ende dieser Antwort zeige ich, wie Kontakte in iOS-Versionen vor 9.0 auf eine Weise abgerufen werden können, die einige der Probleme behebt, die durch andere Antworten hier verursacht werden.
Wenn Sie jedoch nur iOS 9 und höher unterstützen, sollten Sie das
Contacts
Framework verwenden, um einige der lästigen Überbrückungsprobleme zu vermeiden, die bei der Verwendung des älterenAddressBook
Frameworks auftreten.In iOS 9 würden Sie also das
Contacts
Framework verwenden:@import Contacts;
Sie müssen auch Ihre aktualisieren
Info.plist
und ein hinzufügen, umNSContactsUsageDescription
zu erklären, warum Ihre App Zugriff auf Kontakte benötigt.Und dann machen Sie so etwas wie folgt:
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); } }];
Unten ist meine Antwort anwendbar, wenn iOS-Versionen vor iOS 9.0 unterstützt werden.
- -
Einige Reaktionen nicht nur auf Ihre Frage, sondern auch auf viele der hier gegebenen Antworten (die entweder keine Erlaubnis anfordern,
ABAddressBookCreateWithOptions
Fehler nicht richtig behandeln oder auslaufen):Importieren Sie natürlich das
AddressBook
Framework:#import <AddressBook/AddressBook.h>
oder
@import AddressBook;
Sie müssen die Erlaubnis für die App anfordern, um auf die Kontakte zugreifen zu können. Zum Beispiel:
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); });
Beachten Sie, dass ich oben das von anderen vorgeschlagene Muster nicht verwendet habe:
CFErrorRef *error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
Das ist nicht richtig. Wie Sie oben sehen werden, möchten Sie:
CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
Das erstere Muster erfasst den Fehler nicht korrekt, während das letztere dies tut. Wenn
error
nichtNULL
, vergessen SieCFRelease
es nicht (oder übertragen Sie das Eigentum wie ich auf ARC), sonst verlieren Sie das Objekt.Um die Kontakte zu durchlaufen, möchten Sie:
- (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(@"============================================="); } }
Ich möchte Ihre Aufmerksamkeit auf ein ziemlich wichtiges Detail lenken, nämlich die "Regel erstellen" :
Dies bedeutet, dass Sie die Verantwortung für die Freigabe von Objekten tragen, die von einer Core Foundation-Funktion mit
Create
oderCopy
im Namen zurückgegeben werden. Sie können entweder rufenCFRelease
explizit (wie ich oben mitaddressBook
undphoneNumbers
) oder für Objekte , die Unterstützung gebührenfreie Überbrückung, Sie Eigentum an ARC übertragen können mit__bridge_transfer
oderCFBridgingRelease
(wie ich oben tat mitallPeople
,lastName
,firstName
, undphoneNumber
).Der statische Analysator (drücken Sie shift+ command+ Bin Xcode oder wählen Sie "Analysieren" aus dem Menü "Produkt") kann viele Situationen identifizieren, in denen Sie diese "Regel erstellen" nicht beachtet und die entsprechenden Objekte nicht freigegeben haben. Wenn Sie also Core Foundation-Code wie diesen schreiben, führen Sie ihn immer durch den statischen Analysator, um sicherzustellen, dass Sie keine offensichtlichen Lecks haben.
quelle
Verwenden Sie diesen Code, um alle Namen + Nachnamen + Telefonnummern anzuzeigen (iOS 6). Funktioniert auch im Simulator:
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(@"============================================="); }
quelle
Stellen Sie sicher, dass Sie den richtigen Import haben
#import <AddressBook/AddressBook.h>
Dann können Sie mit ein CFArray-Objekt mit allen Kontakten abrufen
CFArrayRef ABAddressBookCopyArrayOfAllPeople (ABAddressBookRef addressBook);
quelle
Stellen Sie in iOS 6 sicher, dass Sie
ABAddressBookCreateWithOptions
die aktualisierte Version von verwendenABAddressBookCreate
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 }
quelle
Update für
iOS 9.0
. Apple ist veraltetAddressBook
und jetzt haben sieContacts
Framework hinzugefügt :Fügen Sie eine
CNContactStore
Eigenschaft hinzu und definieren Sie sie wie folgt:self.contactsStrore = [[CNContactStore alloc] init];
Fügen Sie dann diese Methoden hinzu, um alle Kontakte zu lesen:
-(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; } }
Vor iOS 9.0 =>
AddressBook
Framework verwenden. Sie müssen zuerst nach dem Zugriff suchen und den Zugriff auf Benutzerkontakte anfordern:// 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; } }
quelle
Dank Mahesh und Wzbozon hat der folgende Code für mich funktioniert:
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]; } }); } });
quelle
Schnelle Version:
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)") } }
quelle
Schauen Sie sich https://github.com/heardrwt/RHAddressBook an (254 Sterne 01/2014).
Bietet einen ObjC-Wrapper für AddressBook mit einer viel einfacheren API.
quelle
Dies funktioniert für iOS 7 und iOS 8, ich hoffe, es hilft Ihnen .............
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]];
quelle
functions
im letztenif
Fall ist undefiniert. AuchCFStringCompare
auf Versuche konvertierenNSStringCompareOptions
zuNSStringCompareFlags
.ABAddressBookRef addressBook = ABAddressBookCreate( ); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook ); CFIndex nPeople = ABAddressBookGetPersonCount( addressBook ); for ( int i = 0; i < nPeople; i++ ) { ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, i ); ... }
quelle
Dies ist eine vollständige Demo zum Abrufen aller Kontakte mit Tabellenansicht.
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 } }
quelle
Wenn Sie alphabetisch sortieren möchten, können Sie den folgenden Code verwenden.
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);
quelle