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.
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.
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 );
...
}
ABAddressBookCreate()
wurde (ab iOS 6) zugunsten von veraltet ABAddressBookCreateWithOptions(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 älteren AddressBook
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, um NSContactsUsageDescription
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
nicht NULL
, vergessen Sie CFRelease
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" :
Core Foundation-Funktionen haben Namen, die angeben, wann Sie ein zurückgegebenes Objekt besitzen:
Objekterstellungsfunktionen,
Create
in die der Name eingebettet ist;Objektduplizierungsfunktionen,
Copy
in die der Name " " eingebettet ist.Wenn Sie ein Objekt besitzen, liegt es in Ihrer Verantwortung, das Eigentum (mithilfe von CFRelease) aufzugeben, wenn Sie damit fertig sind.
Dies bedeutet, dass Sie die Verantwortung für die Freigabe von Objekten tragen, die von einer Core Foundation-Funktion mit Create
oder Copy
im Namen zurückgegeben werden. Sie können entweder rufen CFRelease
explizit (wie ich oben mit addressBook
und phoneNumbers
) oder für Objekte , die Unterstützung gebührenfreie Überbrückung, Sie Eigentum an ARC übertragen können mit __bridge_transfer
oder CFBridgingRelease
(wie ich oben tat mit allPeople
, lastName
, firstName
, und phoneNumber
).
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.
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(@"=============================================");
}
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);
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
}
Update für iOS 9.0
. Apple ist veraltet AddressBook
und jetzt haben sie Contacts
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;
}
}
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];
}
});
}
});
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)")
}
}
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.
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]];
functions
im letzten if
Fall ist undefiniert. Auch CFStringCompare
auf Versuche konvertieren NSStringCompareOptions
zu NSStringCompareFlags
.
ABAddressBookRef addressBook = ABAddressBookCreate( );
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );
for ( int i = 0; i < nPeople; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, i );
...
}
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
}
}
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);