我有问题。 我正在ios 6中制作一个应用程序从我的地址簿中获取联系人但是如果我已经启用了facebook的联系人选项从我的地址簿和Facebook获取所有联系人,我想如果有可能的代码不得到facebook联系人。 只有我想要的解决方案是合并具有相同名称的联系人或删除拥有@ facebook.com电子邮件的联系人。
其他解决方案?
答案 0 :(得分:0)
检查@ facebook.com电子邮件地址不可靠。用户可以选择不发布,非Facebook地址簿条目可以将其作为电子邮件地址。
地址簿中有一个名为ExternalRepresentation的特殊字段,似乎带有一些关于从facebook联系人同步的额外信息。第一部分似乎总是一样。
警告:这可能不会一直有效,并且可能会在将来的某一天中断。这是没有证件的。
static NSData *facebookExtRepPrefix = [NSData dataWithBytes:"bplist00\xd4\x01\x02\x03" length:12];
#define kABPersonExternalRepresentationProperty 39
然后
NSData *extRep = (__bridge NSData *)ABRecordCopyValue(theRecord, kABPersonExternalRepresentationProperty);
BOOL isFacebook = [[extRep subdataWithRange:NSMakeRange(0, facebookExtRepPrefix.length)] isEqualToData:facebookExtRepPrefix];
然后您可以阅读kABPersonPersonLinkProperty(#42) - 该值将与链接到它的本机联系人相同。
答案 1 :(得分:0)
使用ABAddressBookCopyDefaultSource
中的默认来源ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
给了我电话联系人(不是Facebook联系人)。
我没有将地址簿中的人数统计为ABAddressBookGetPersonCount
,而是使用allPeople数组(从上面开始)来获取人数。
if (accessGranted) {
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName);
CFIndex nPeople = CFArrayGetCount(allPeople);//Not ABAddressBookGetPersonCount(addressBook) as that returns all contacts, Facebook included;
items = [NSMutableArray arrayWithCapacity:nPeople];
for (int i = 0; i < MIN(nPeople, 20); i++)
{
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
//Do something with this person
}
}
参考:获取所有联系人:https://stackoverflow.com/a/17976915/1349663