iOS6 Чтение идентификатора пользователя Facebook из адресной книги

Я могу прочитать имя, фамилию, день рождения друзей Facebook, но не могу прочитать идентификатор пользователя Facebook из моей адресной книги.

Если подробности Facebook есть в адресной книге моего телефона, они читаются нормально, но не с сервера CardDAV.

Если я пойду к AddressBook на телефоне / симуляторе я вижу имена пользователей... так что они доступны.

я имею read_stream, email, read_friendlists, publish_stream, publish_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);
    }
}

3 ответа

Я делаю следующее, и это работает.
Я знаю, что это не совсем то, что вы делаете, но все же - мой 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];
}

Вы можете получить чат в Facebook и добавить это имя на 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);
}

Возвращает пустую строку NSString (""), если для контакта отсутствует псевдоним Facebook.

- (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;
}
Другие вопросы по тегам