当在所有地址簿联系人中循环时,有一种方法可以查看记录是否是仅限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