1

我有个问题。我正在 ios 6 中制作一个应用程序,可以从我的通讯录中获取联系人,但是如果我启用了 facebook 的联系人选项,则可以从我的通讯录和 facebook 获取我的所有联系人,我想是否有可能使用代码不获取 facebook联系人。只有我认为的解决方案或合并具有相同名称的联系人或删除与@facebook.com 有电子邮件的联系人。

其他解决方案?

4

2 回答 2

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) - 该值在链接到它的本地联系人上将是相同的。

于 2013-02-13T23:28:51.187 回答
0

使用默认来源,即ABAddressBookCopyDefaultSourceinABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering给了我电话联系人(不是 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

于 2014-05-15T06:12:03.560 回答