當在所有地址簿聯繫人中循環時,有一種方法可以查看記錄是否是僅限Facebook的記錄?這是在iOS設置中添加Facebook時插入的地址簿記錄。ABRecordRef檢查記錄是否僅限Facebook?
我想跳過這些記錄,只查看用戶輸入或從其他來源同步的記錄。
謝謝
當在所有地址簿聯繫人中循環時,有一種方法可以查看記錄是否是僅限Facebook的記錄?這是在iOS設置中添加Facebook時插入的地址簿記錄。ABRecordRef檢查記錄是否僅限Facebook?
我想跳過這些記錄,只查看用戶輸入或從其他來源同步的記錄。
謝謝
每ABPerson
記錄屬於一個ABSource
。
當您遍歷所有人員記錄時,請分別撥打ABPersonCopySource(person)
。 Facebook記錄應該全部與特定的源記錄相關聯。我不知道如何識別它:可能該源記錄的kABSourceNameProperty
將包含「Facebook」。
我試過這個,但沒有一個「Facebook」源名稱,不幸的是。它只是輸出一個空白字符串:( – runmad 2013-04-23 13:19:38
有了這個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;
}
這似乎爲我工作,它並不直接檢測的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);
}
新版本(無內存舔):
+ (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; }
請編輯更多信息。只有代碼和「試試這個」的答案是不鼓勵的,因爲它們是con沒有可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。我們在這裏努力成爲知識的資源。 – 2016-08-30 13:33:25
同時通過地址簿中的聯繫人循環,循環通過個人組。所有的Facebook聯繫人留在FACEBOOK組..這樣ü可以限制你的程序。 – ibiren 2013-04-22 13:35:54
有沒有辦法看到哪一組ABRecord屬於,因爲我沒有循環通過每個組的聯繫人,但我使用'ABAddressBookCopyArrayOfAllPeople()' – runmad 2013-04-22 13:42:16