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