2013-04-22 1 views
2

При переходе по всем контактам адресной книги есть ли способ увидеть, является ли запись записью только для Facebook? Это записи адресной книги, которые вставляются при добавлении Facebook в настройки iOS.ABRecordRef проверить, является ли запись Facebook-only?

Я пытаюсь пропустить эти записи и просматривать только записи, которые вводятся пользователем или синхронизируются из других источников.

Спасибо

+0

во время цикла по адресной книге контактов, петля через отдельные группы .. Все контакты Facebook остаются в FACEBOOK группе .. что путь у может ограничить программу ur. – ibiren

+0

Есть ли способ увидеть, к какой группе принадлежит ABRecord, поскольку я не перебираю контакты по каждой группе, но я использую 'ABAddressBookCopyArrayOfAllPeople()' – runmad

ответ

0

Каждый ABPerson рекорд принадлежит ровно один ABSource.

Когда вы перебираете все записи человека, звоните по номеру ABPersonCopySource(person). Записи Facebook должны быть связаны с конкретной исходной записью. Я не уверен, как его идентифицировать: возможно, kABSourceNameProperty для этой записи источника будет содержать «Facebook».

+0

Я пробовал это, но нет «Facebook», имя источника, к сожалению. Он просто выводит пустую строку :( – runmad

3

С этой snipplet вы можете обнаружить Facebook-Контакты:

+ (BOOL)isPersonFacebookContact:(ABRecordRef)person { 
    ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty); 

    BOOL returnValue = NO; 

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

      if (CFStringCompare(instantMessageString, kABPersonInstantMessageServiceFacebook, 0) == kCFCompareEqualTo) { 
       returnValue = YES; 
      } 

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

    CFRelease(instantMessage); 

    return returnValue; 
} 
+0

Будет ли это достаточно реалистично, что это определенно ТОЛЬКО встроенные в FB записи? – runmad

+0

Нет сожаления, но флаг «Facebook-Contact» отсутствует :( Вы можете попробовать после этой проверки, чтобы изменить контакт и когда вы не можете добавить новый номер телефона или что-то в этом роде, это должно быть Facebook-Contact! –

+0

К сожалению, он позволяет мне редактировать контакт и сохранять также, не бросая никаких ошибок, кроме факта, t появляется в адресной книге. – runmad

0

Это, кажется, работает для меня, Ее не обнаруживает фейсбук напрямую, но вы могли бы оценить источники дальше и есть социальный профиль связан то есть facebook, и связанный контакт с контактом facebook, тогда вы вполне уверены, что это его facebook. Я использовал это, чтобы получить только те контакты, на которые я мог бы написать. Пользователи могут изменить свою учетную запись создания контактов по умолчанию, но на основе моего теста источник только для контактов Facebook никогда не совпадает с ABAddressBookCopyDefaultSource.

CFArrayRef people = ABAddressBookCopyArrayOfAllPeopleInSource(ab , kABSourceTypeLocal); 
AllContacts = CFArrayCreateMutableCopy(kCFAllocatorDefault, CFArrayGetCount(people), people); 


// Remove all the contacts that we cant write back to 
for (int i = CFArrayGetCount(AllContacts)-1; i >-1 ; i--) 
{ 
    ABRecordRef person = CFArrayGetValueAtIndex(AllContacts, i); 
    if((ABPersonCopySource(person) !=ABAddressBookCopyDefaultSource(ab))) 
    { 
     NSString *fName = (NSString *)CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty)); 
     NSString *lName = (NSString *)CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); 

     DLog(@"Removed a read only contact %@ %@", fName , lName); 
     CFArrayRemoveValueAtIndex(AllContacts, i); 
    }// else its not something you can write back to, like facebook, twitter. 
    CFRelease(person); 

} 
0

Новая версия (без лижет памяти):

+ (BOOL)isPersonFacebookContact:(ABRecordRef)person { 
    ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty); 

    BOOL returnValue = NO; 

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

      if (instantMessageString) { 
       if (CFStringCompare(instantMessageString, kABPersonInstantMessageServiceFacebook, 0) == kCFCompareEqualTo) { 
        returnValue = YES; 
       } 
      } 
      CFRelease(instantMessageValue); 
     } 

     CFRelease(instantMessage); 
    } 

    return returnValue; } 
+1

Пожалуйста, отредактируйте с дополнительной информацией. Ответы только на код и «попробуйте» не приветствуются, потому что они con не просматривайте контент, доступный для поиска, и не объясняйте, почему кто-то должен «попробовать это». Мы прилагаем усилия, чтобы стать источником знаний. –