2013-04-22 43 views
2

当在所有地址簿联系人中循环时,有一种方法可以查看记录是否是仅限Facebook的记录?这是在iOS设置中添加Facebook时插入的地址簿记录。ABRecordRef检查记录是否仅限Facebook?

我想跳过这些记录,只查看用户输入或从其他来源同步的记录。

谢谢

+0

同时通过地址簿中的联系人循环,循环通过个人组。所有的Facebook联系人留在FACEBOOK组..这样ü可以限制你的程序。 – ibiren 2013-04-22 13:35:54

+0

有没有办法看到哪一组ABRecord属于,因为我没有循环通过每个组的联系人,但我使用'ABAddressBookCopyArrayOfAllPeople()' – runmad 2013-04-22 13:42:16

回答

0

ABPerson记录属于一个ABSource

当您遍历所有人员记录时,请分别拨打ABPersonCopySource(person)。 Facebook记录应该全部与特定的源记录相关联。我不知道如何识别它:可能该源记录的kABSourceNameProperty将包含“Facebook”。

+0

我试过这个,但没有一个“Facebook”源名称,不幸的是。它只是输出一个空白字符串:( – runmad 2013-04-23 13:19:38

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 2013-06-04 19:16:51

+0

没有抱歉,但没有“Facebook联系人”标志:( 您可以在此检查后尝试编辑联系人,当你不能添加一个新的电话号码或什么的,它应该是一个Facebook联系人! – 2013-06-05 12:48:19

+0

不幸的是,它允许我编辑联系人并保存,而不会抛出任何错误,而不是数据不' t出现在地址簿中 – runmad 2013-06-11 18:02:36

0

这似乎为我工作,它并不直接检测的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没有可搜索的内容,也不解释为什么有人应该“尝试这个”。我们在这里努力成为知识的资源。 – 2016-08-30 13:33:25