2013-04-22 61 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