4

ユーザーのアドレス帳から連絡先の電話番号を読み取れるようにする必要があります。問題は、ユーザーがこれらの連絡先を Facebook 経由で同期することを選択した場合、次のコードを介してアクセスできなくなることです (同期されていない連絡先に対しては機能します)。

ABMultiValueRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
DLog(@"Found %ld phones", ABMultiValueGetCount(phones));
for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++)
{        
    CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j);
    CFStringRef locLabel = ABMultiValueCopyLabelAtIndex(phones, j);
    NSString *phoneLabel =(__bridge NSString*) ABAddressBookCopyLocalizedLabel(locLabel);
    NSString *phoneNumber = (__bridge NSString *)phoneNumberRef;
    CFRelease(phoneNumberRef);
    CFRelease(locLabel);
    DLog(@"  - %@ (%@)", phoneNumber, phoneLabel);
    [numbersArr addObject:phoneNumber];
}

ログ結果は[Line 126] Found 0 phones

を使用しようとしましCFArrayRef userNumbers = ABMultiValueCopyArrayOfAllValues(phoneNumbers);
たが、これも何も返しません。[Line 118] Got user numbers: (null)

だから私はソーシャルプロファイルを掘り下げようとしましたが、これも何も返されません!

// Try to get phone numbers from social profile
        ABMultiValueRef profiles = ABRecordCopyValue(record, kABPersonSocialProfileProperty);
        CFIndex multiCount = ABMultiValueGetCount(profiles);
        for (CFIndex i=0; i<multiCount; i++) {
            NSDictionary* profile = (__bridge NSDictionary*)ABMultiValueCopyValueAtIndex(profiles, i);
            NSLog(@"TESTING - Profile: %@", profile);

        }
        DLog(@"Got profiles: %@", profiles);
        CFRelease(profiles);

それでもログエントリは次のとおりです。 [Line 161] Got profiles: ABMultiValueRef 0x1ddbb5c0 with 0 value(s)

上記の結果がすべて私に何ももたらさない場合、どうすれば彼らが Facebook ユーザーであることを知り、電話情報を取得できるのでしょうか?

4

1 に答える 1

2

Apple サポートから:

統一されたアドレス帳の連絡先を返す API はありません。ただし、最初に ABPersonCopyArrayOfAllLinkedPeople を使用してリンクされたすべての連絡先を取得し、次にこれらの連絡先を反復処理してそれぞれの電話番号を取得することにより、デバイスの連絡先に統合されて表示される連絡先の電話番号を取得できます。連絡先の UI に表示されない電話番号は、アドレス帳 API によって返されないことに注意してください。これを可能にするコードのスニペットについては、以下を参照してください。

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person

{

//Fetch all linked contacts

CFArrayRef linkedPerson = ABPersonCopyArrayOfAllLinkedPeople(person);

//Iterate through each linked contact to fetch the phone numbers

for (CFIndex i = 0; i < CFArrayGetCount(linkedPerson); i++)

{

ABRecordRef contact = CFArrayGetValueAtIndex(linkedPerson,i);

ABMutableMultiValueRef multi = ABRecordCopyValue(contact, kABPersonPhoneProperty);

for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++)

{

CFStringRef label = ABMultiValueCopyLabelAtIndex(multi, i);

CFStringRef number = ABMultiValueCopyValueAtIndex(multi, i);

CFRelease(label);

CFRelease(number);

}

CFRelease(multi);

}

CFRelease(linkedPerson);

return YES;
于 2013-03-25T18:21:08.497 に答える