IOS7中讀取不到通訊錄的問題 大部分原因是沒有判斷系統版本來構造ABAddressBookRef
下面是兩個本人程序中的兩個方法,請參考。所有版本中已測試沒有問題。
//獲取通訊錄 -(void)GetUserAddressBook { //獲取通訊錄權限 ABAddressBookRef ab = NULL; // ABAddressBookCreateWithOptions is iOS 6 and up. if (&ABAddressBookCreateWithOptions) { CFErrorRef error = nil; ab = ABAddressBookCreateWithOptions(NULL, &error); if (error) { NSLog(@"%@", error); } } if (ab == NULL) { ab = ABAddressBookCreate(); } if (ab) { // ABAddressBookRequestAccessWithCompletion is iOS 6 and up. 適配IOS6以上版本 if (&ABAddressBookRequestAccessWithCompletion) { ABAddressBookRequestAccessWithCompletion(ab, ^(bool granted, CFErrorRef error) { if (granted) { // constructInThread: will CFRelease ab. [NSThread detachNewThreadSelector:@selector(constructInThread:) toTarget:self withObject:CFBridgingRelease(ab)]; } else { // CFRelease(ab); // Ignore the error } }); } else { // constructInThread: will CFRelease ab. [NSThread detachNewThreadSelector:@selector(constructInThread:) toTarget:self withObject:CFBridgingRelease(ab)]; } } } //獲取到addressbook的權限 -(void)constructInThread:(ABAddressBookRef) ab { NSLog(@"we got the access right"); CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(ab); NSMutableArray* contactArray = [[NSMutableArray alloc]init]; for(int i = 0; i < CFArrayGetCount(results); i++) { ABRecordRef person = CFArrayGetValueAtIndex(results, i); //姓 NSString *firstName = (NSString*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty)); //姓音標 // NSString *firstNamePhonetic = (NSString*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty)); //名 NSString *lastname = (NSString*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); //名音標 // NSString *lastnamePhonetic = (NSString*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty)); //公司 NSString *Organization = (NSString*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonOrganizationProperty)); //讀取jobtitle工作 // NSString *jobtitle = (NSString*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonJobTitleProperty)); //讀取department部門 NSString *department = (NSString*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonDepartmentProperty)); //讀取birthday生日 NSDate *birthday = (NSDate*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonBirthdayProperty)); //讀取nickname呢稱 double birthdayString = [birthday timeIntervalSince1970]; NSString *nickname = (NSString*)CFBridgingRelease(ABRecordCopyValue(person, kABPersonNicknameProperty)); //讀取電話多值 NSString* phoneString = @""; ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); for (int k = 0; k