我有个问题。我正在 ios 6 中制作一个应用程序,可以从我的通讯录中获取联系人,但是如果我启用了 facebook 的联系人选项,则可以从我的通讯录和 facebook 获取我的所有联系人,我想是否有可能使用代码不获取 facebook联系人。只有我认为的解决方案或合并具有相同名称的联系人或删除与@facebook.com 有电子邮件的联系人。
其他解决方案?
我有个问题。我正在 ios 6 中制作一个应用程序,可以从我的通讯录中获取联系人,但是如果我启用了 facebook 的联系人选项,则可以从我的通讯录和 facebook 获取我的所有联系人,我想是否有可能使用代码不获取 facebook联系人。只有我认为的解决方案或合并具有相同名称的联系人或删除与@facebook.com 有电子邮件的联系人。
其他解决方案?
检查@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) - 该值在链接到它的本地联系人上将是相同的。
使用默认来源,即ABAddressBookCopyDefaultSource
inABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
给了我电话联系人(不是 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
}
}