【问题标题】:ABRecordRef check if record is Facebook-only?ABRecordRef 检查记录是否仅限 Facebook?
【发布时间】:2013-04-15 09:43:34
【问题描述】:

当遍历所有通讯录联系人时,有没有办法查看一条记录是否为 Facebook 专用记录?也就是在 iOS 设置中添加 Facebook 时插入的通讯录记录。

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

谢谢

【问题讨论】:

  • 在遍历通讯录联系人时,遍历各个组。所有 Facebook 联系人都保留在 FACEBOOK 组中。这样你可以限制你的程序。
  • 有没有办法查看 ABRecord 属于哪个组,因为我没有按组循环访问联系人,但我使用 ABAddressBookCopyArrayOfAllPeople()

标签: ios abrecord


【解决方案1】:

每条ABPerson 记录只属于一个ABSource

当您遍历所有人员记录时,请在每个记录上调用 ABPersonCopySource(person)。 Facebook 记录都应该与特定的源记录相关联。我不确定如何识别它:可能该源记录的kABSourceNameProperty 将包含“Facebook”。

【讨论】:

  • 我试过这个,但不幸的是没有“Facebook”源名称。它只是输出一个空白字符串:(
【解决方案2】:

使用这个 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;
}

【讨论】:

  • 这是否足够现实,以至于它肯定只是本机插入的 FB 条目?
  • 不抱歉,但没有“Facebook-Contact”标志:(您可以在此检查后尝试编辑联系人,当您无法添加新电话号码或其他内容时,它应该成为 Facebook 联系人!
  • 不幸的是,它允许我编辑联系人并保存,而不会抛出任何错误,除了数据没有出现在地址簿中。
  • 调用 ABRecordSetValue() 时出现错误 .... 我也认为返回值为 FALSE .... 但我目前在我的范围内没有带有 facebook 帐户的设备.. . sry :D
【解决方案3】:

这似乎对我有用,它不能直接检测到 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);

}

【讨论】:

    【解决方案4】:

    新版本(没有记忆舔):

    + (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; }
    

    【讨论】:

    • 请编辑更多信息。不鼓励使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2011-02-20
    • 2016-08-22
    • 1970-01-01
    • 2015-01-21
    • 2012-08-13
    相关资源
    最近更新 更多