Objective c 联系人获取问题
我们正在使用CNContactStore从iphone获取联系人,但我们正在从我的iphone获取所有联系人,这也提供了所有同步联系人,如facebook和其他gmail联系人,但我只需要获取存储在iphone中的联系人。如何做到这一点,请帮我摆脱困境。导入这些Objective c 联系人获取问题,objective-c,ios9,xcode7,cncontact,Objective C,Ios9,Xcode7,Cncontact,我们正在使用CNContactStore从iphone获取联系人,但我们正在从我的iphone获取所有联系人,这也提供了所有同步联系人,如facebook和其他gmail联系人,但我只需要获取存储在iphone中的联系人。如何做到这一点,请帮我摆脱困境。导入这些 #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> - (void) fetchContactsFromDe
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
- (void) fetchContactsFromDevice {
//1
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (addressBook != nil) {
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:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
});
}
CFRelease(addressBook);
});
} else {
NSLog(@"Error reading Address Book : %@", error);
}
#导入
#进口
-(void)从设备获取联系人{
//1
CFErrorRef error=NULL;
ABAddressBookRef addressBook=ABAddressBookCreateWithOptions(NULL,错误(&R);
如果(地址簿!=nil){
ABAddressBookRequestAccessWithCompletion(addressBook,^(已授予bool,CFErrorRef错误){
如果(错误){
NSLog(@“ABAddressBookRequestAccessWithCompletion错误:%@”,CfBrigingRelease(错误));
}
如果(授予){
//如果他们允许你,那就继续吧
[self-listPeopleInAddressBook:addressBook];
}否则{
//但是,如果他们没有给你许可,你可以优雅地处理,例如。。。
dispatch\u async(dispatch\u get\u main\u queue()^{
//顺便说一句,这不在主线程上,因此调度UI更新回主队列
[[UIAlertView alloc]initWithTitle:nil消息:@“委托:nil取消按钮:@“确定”其他按钮:nil]show];
});
}
CFRelease(通讯录);
});
}否则{
NSLog(@“读取通讯簿时出错:%@”,错误);
}
}
此方法将帮助您仅获取通讯簿号码
然后用它来绘图
- (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];
NSMutableDictionary * user = [[NSMutableDictionary alloc] init];
NSString *firstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));
[user setObject:firstName forKey:@"firstname"];
[user setObject:lastName forKey:@"lastname"];
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex numberOfPhoneNumbers = ABMultiValueGetCount(phoneNumbers);
for (CFIndex i = 0; i < numberOfPhoneNumbers; i++) {
NSString *phoneNumber = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phoneNumbers, i));
[user setObject:phoneNumber forKey:@"phoneNumbers"];
}
CFRelease(phoneNumbers);
[self.contactDataArray addObject:user];
}
[yourtable reloadData];
-(void)listPeopleInAddressBook:(ABAddressBookRef)addressBook{
NSArray*allPeople=CfBrigingRelease(abAddressBookCopyArrayFallPeople(addressBook));
NSInteger numberOfPeople=[allPeople count];
对于(NSInteger i=0;i
}
希望这将有助于任何人都了解上述问题如果您查看
[store Containers Matching Predicate:nil error:&error]
,是否会获得多次点击(即一次点击FB,一次点击gmail等)?如果是这样,您可以使用谓词ForContactsInContainerWithiIdentifier:
仅获取感兴趣的容器的联系人。他询问的是联系人框架,而不是地址簿框架(除非您需要支持较旧的操作系统版本,否则不应使用该框架)。顺便说一句,这段代码看起来很像另一个答案中的代码:我真的很抱歉,但这段代码来自我的项目实现,但我知道这对他有帮助。