私は問題があります。私はiOS6でアドレス帳から連絡先を取得するアプリを作成していますが、Facebookで連絡先オプションを有効にしている場合は、アドレス帳とFacebookからすべての連絡先を取得します。コードで可能であればFacebookを取得しないでください。連絡先。私が考えている解決策は、同じ名前の連絡先をマージするか、@facebook.comの電子メールを持つ連絡先を削除することだけです。
他の解決策?
私は問題があります。私はiOS6でアドレス帳から連絡先を取得するアプリを作成していますが、Facebookで連絡先オプションを有効にしている場合は、アドレス帳とFacebookからすべての連絡先を取得します。コードで可能であればFacebookを取得しないでください。連絡先。私が考えている解決策は、同じ名前の連絡先をマージするか、@facebook.comの電子メールを持つ連絡先を削除することだけです。
他の解決策?
デフォルトのソースを使用すると、電話の連絡先(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
@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) を読み取ることができます。その値は、リンクされているネイティブの連絡先と同じになります。