3

Facebook の友達の名前、姓、誕生日を読み取ることはできますが、アドレス帳から Facebook のユーザー名 ID を読み取ることができません。

Facebook の詳細が携帯電話のアドレス帳にある場合は問題なく読み取れますが、CardDAV サーバーからのものである場合は読み取れません。

電話/シミュレーターで にアクセスするとAddressBook、ユーザー名が表示されるので、利用できます。

、、、、権限がread_streamあります。emailread_friendlistspublish_streampublish_actions

助けてください... アイデアが尽きた

iOS6、XCode 4.5、Facebook SDK 3.1

// Extract
// These all return values

CFStringRef cfsPrefix       = ABRecordCopyValue((__bridge ABRecordRef)recPerson, kABPersonPrefixProperty);
CFStringRef cfsFirstname    = ABRecordCopyValue((__bridge ABRecordRef)recPerson, kABPersonFirstNameProperty);
CFStringRef cfsLastname     = ABRecordCopyValue((__bridge ABRecordRef)recPerson, kABPersonLastNameProperty);
CFStringRef cfsCompany      = ABRecordCopyValue((__bridge ABRecordRef)recPerson, kABPersonOrganizationProperty);
NSDate*     datBirthday     = (NSDate*) CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)recPerson, kABPersonBirthdayProperty));
NSDate*     datCreate       = (NSDate*) CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)recPerson, kABPersonCreationDateProperty));
NSDate*     datModify       = (NSDate*) CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)recPerson, kABPersonModificationDateProperty));

// This never returns a value in strFacebook

NSString *strFacebook;

ABMultiValueRef socialMulti = ABRecordCopyValue((__bridge ABRecordRef) recPerson, kABPersonSocialProfileProperty);

// ABMultiValueGetCount(socialMulti) always returns 0 ?

for (CFIndex i = 0; i < ABMultiValueGetCount(socialMulti); i++) {
    NSDictionary* social = (__bridge NSDictionary*)ABMultiValueCopyValueAtIndex(socialMulti, i);

    if ([social[@"service"] isEqualToString:(__bridge NSString*)kABPersonSocialProfileServiceFacebook]) {
        strFacebook = (NSString*)social[@"username"];
        NSLog(@"we got a facebook. username is %@ %@", [self nameForSource:(__bridge ABRecordRef)recPerson], cFacebook);
    }
}
4

3 に答える 3

1

Facebook IM を取得して、この名前を www.facebook.com/(fbName) に追加できます。

 ABMultiValueRef profile = ABRecordCopyValue(who,  kABPersonInstantMessageProperty);
if (ABMultiValueGetCount(profile) > 0)
{
    // collect all emails in array

    for (CFIndex i = 0; i < ABMultiValueGetCount(profile); i++)
    {
        NSDictionary *socialItem = (__bridge NSDictionary*)ABMultiValueCopyValueAtIndex(profile, i);
        NSString* SocialLabel =  [socialItem objectForKey:(NSString *)kABPersonInstantMessageServiceKey];

         if([SocialLabel isEqualToString:(NSString *)kABPersonInstantMessageServiceFacebook])
        {

            NSString *facebookProfile = ([socialItem objectForKey:(NSString *)kABPersonInstantMessageUsernameKey]);
            NSLog(@"fbName %@",facebookProfile);
        }

    }
    CFRelease(profile);
}
于 2013-06-01T10:34:43.423 に答える
1

私は次のことをしていますが、うまくいきます。
私はこれがあなたがやっていることとまったく同じではないことを知っていますが、それでも - 私のABMultiValueGetCount作品はうまくいきます。

ABAddressBookRef addressBook;
addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

NSMutableArray *socialArray = [[NSMutableArray alloc] init];
ABMultiValueRef socialProfiles = ABRecordCopyValue(record, kABPersonSocialProfileProperty);
for (int i=0; i<ABMultiValueGetCount(socialProfiles); i++) {
    NSDictionary *socialItem = (__bridge NSDictionary*)ABMultiValueCopyValueAtIndex(socialProfiles, i);
    [socialArray addObject:socialItem];
}
于 2013-01-16T12:45:28.933 に答える
0

連絡先の Facebook エイリアスがない場合は、空の NSString ("") を返します。

- (NSString*)facebookAliasForContact:(ABRecordRef)person {
    ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty);
    NSString *facebookAlias = @"";

    if (instantMessage) {
        for (NSInteger i=0 ; i < ABMultiValueGetCount(instantMessage); i++) {
            CFDictionaryRef instantMessageValue = ABMultiValueCopyValueAtIndex(instantMessage, i);
            CFStringRef instantMessageString = CFDictionaryGetValue(instantMessageValue, kABPersonSocialProfileUsernameKey);

    if (CFStringCompare(instantMessageString, kABPersonInstantMessageServiceFacebook, 0) == kCFCompareEqualTo) {
            facebookAlias = (__bridge NSString *)instantMessageString;
        }        

    CFRelease(instantMessageString);
            CFRelease(instantMessageValue);
        }
    }

    CFRelease(instantMessage);

    return facebookAlias;
}
于 2014-10-17T20:20:46.930 に答える