1

私は問題があります。私はiOS6でアドレス帳から連絡先を取得するアプリを作成していますが、Facebookで連絡先オプションを有効にしている場合は、アドレス帳とFacebookからすべての連絡先を取得します。コードで可能であればFacebookを取得しないでください。連絡先。私が考えている解決策は、同じ名前の連絡先をマージするか、@facebook.comの電子メールを持つ連絡先を削除することだけです。

他の解決策?

4

2 に答える 2

0

デフォルトのソースを使用すると、電話の連絡先(Facebookの連絡先ABAddressBookCopyDefaultSourceではありません)が得られました。ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering

アドレス帳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 に答える
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 に答える