标签: abrecord

由于iOS地址簿API中的链接卡而处理重复的联系人

我即将推出的应用的一些测试用户报告说,联系人列表包含大量重复记录.我正在使用结果ABAddressBookCopyArrayOfAllPeople作为我自定义的联系人表视图的数据源,这让我感到困惑,结果与iPhone的"联系人"应用程序不同.

当仔细查看"联系人"应用程序时,重复项似乎来自具有"链接卡"的条目.下面的屏幕截图有点混淆,但正如你在我最右边的应用程序中看到的那样,"Celine"显示两次,而在左边的Contacts应用程序中只有一个"Celine".如果您单击该单个联系人的行,您将获得一张带有两个"链接卡"的"统一信息"卡(如中心所示,我没有使用Celine的联系方式,因为它们不适用于一个屏幕截图):

截图

围绕"联卡"的问题,有相当几个主题苹果的论坛上为最终用户,但除了一个事实,即许多点到404支持页面,我不能真实地去周围固定了我所有的应用程序的用户的地址簿.我更愿意优雅地处理它而不会打扰用户.更糟糕的是,似乎我不是唯一一个有这个问题的人,因为WhatsApp显示的是包含重复联系人的相同列表.

为了清楚重复联系人的起源,我不是存储,缓存或以其他方式试图聪明地了解数组ABAddressBookCopyArrayOfAllPeople返回.因此,重复记录直接来自API调用.

有谁知道如何处理或检测这些链接卡,防止重复记录显示?Apple的联系人应用程序可以做到,我们其他人也可以这样做吗?

更新:我写了一个库并把它放在Cocoapods上以解决手头的问题.请参阅下面的答案

cocoa-touch objective-c duplicates abaddressbook abrecord

38
推荐指数
4
解决办法
1万
查看次数

从iOS中的ABRecordID加载ABRecordRef

我正在存储一个ABRecordID(实际上包裹在NSNumber中)的数组NSUserDefaults.到目前为止这么好,但现在我需要将其加载到ABRecordRef无法找到要使用的功能.

我只是在寻找从ABRecordID创建ABRecordRef的函数,就是这样.

abrecord ios abrecordref

8
推荐指数
1
解决办法
2512
查看次数

ABAddressBook - 如何查找是否从iPhone的地址簿中修改或删除了特定联系人?

我正在开发一个聊天应用程序.我需要保存联系人.所以我在我的核心数据实体中保存ABAddressBook中的所有联系人.问题是如何知道联系人是否被修改或从iPhone的地址簿中删除?这样我将从我的核心数据实体修改或删除该联系人.

if ABRecordGetRecordID(person) can be used as unique key or not
Run Code Online (Sandbox Code Playgroud)

给定belew是在核心数据中添加联系人的代码.

ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, nil);
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBookRef );
CFIndex nPeople = ABAddressBookGetPersonCount( addressBookRef );

for ( int i = 0; i < nPeople; i++ )
{
    ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i );
 } 

 NSString* firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty);


    if ([firstName hasPrefix:@"Protected by True"])
    {
        continue;
    }
    else if([firstName hasPrefix:@"Identified As Spam"])
    {
        continue;
    }


    NSString* lastName  = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonLastNameProperty);

    NSString *userEmail = …
Run Code Online (Sandbox Code Playgroud)

iphone contacts abaddressbook abrecord abperson

7
推荐指数
1
解决办法
387
查看次数

IOS 5 Xcode 4.2中的ABRecordSetValue

我是新手,我在Xcode 4.2中有一个ABRecordSetValue的问题.我有这个代码:

        ABRecordSetValue(aContact, kABPersonLastNameProperty, lastName, &anError);    
Run Code Online (Sandbox Code Playgroud)

但是,我继续收到此错误消息:

使用ARC不允许将Objective-C指针隐式转换为'CFTypeRef'(又名'const void*')

我将'lastName'字段作为NSString.我的代码出了什么问题?

先感谢您.

abrecord ios5 xcode4.2

3
推荐指数
1
解决办法
2710
查看次数

ABRecordCopyValue可以返回什么?(解决不良访问)

我正在使用这个简单的代码来获取ios 7中地址簿的所有联系人.我的地址中有155个联系人.当我记录人们的姓名时,我从我的地址簿中获取了34个正确的名字(显然是随机的),15个名称为null,然后在第50个项目上,一个糟糕的访问崩溃就行了

   NSString *firstNames = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty)
Run Code Online (Sandbox Code Playgroud)

我试过登录姓氏,或图像没有变化.我试图避免对null对象进行ABRecordCopyValue而不进行任何更改.我尝试在项目> 50上执行ABRecordCopyValue,并在50到150的项目上得到相同的结果.我做错了什么?什么ABRecordCopyValue可以返回正确的值旁边和null?

+(NSArray *)getAllContactsAddress
{
CFErrorRef *error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);

// SUPPOSE access has been granted
BOOL accessGranted = true;

if (accessGranted) {
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
    ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName);
    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
    NSMutableArray* items = [NSMutableArray arrayWithCapacity:nPeople];


    for (int i = 0; i < nPeople; i++)
    {
        ContactsData *contacts = [ContactsData new];

        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);

        NSString …
Run Code Online (Sandbox Code Playgroud)

addressbook abrecord ios

3
推荐指数
1
解决办法
1874
查看次数

ABRecordCopyValue()SIGSEGV

我目前正在从地址簿中提取所有联系人,并希望保存我遇到特定联系人的最后日期.因此,我在同一时间获取日历如下:

for (EKEvent* event in events) {
            for (EKParticipant* attende in [event attendees]) {
                ABRecordRef record = [attende ABRecordWithAddressBook:addressBook];
                if([contact.name isEqualToString:[NSString stringWithFormat:@"%@ %@", (__bridge NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty), (__bridge NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty)]]){
                        contact.lastMet = [NSString stringWithFormat:@"%@",[formatter stringFromDate:event.endDate]];
                    }

            }

        }
Run Code Online (Sandbox Code Playgroud)

遗憾的是,代码在信号SIGSEGV的"if"-statement行崩溃,崩溃日志表明ABRecordCopyValue()发生故障...有任何建议如何解决这个问题?

iphone calendar addressbook abrecord

1
推荐指数
1
解决办法
642
查看次数

将ABRecordRef添加到NSMutableArray会导致需要桥接转换的错误

我收到一个错误:

将C指针类型'ABRecordRef'(又名'const void*')隐式转换为Objective-C指针类型'id'需要桥接转换

从这段代码,尝试添加ABRecordRef一个NSMutableArray

ABRecordRef person = (__bridge ABRecordRef)[contactArr objectAtIndex:i];
[addressBookArray addObject:person];
Run Code Online (Sandbox Code Playgroud)

addressBookArray 被定义为

NSMutableArray *addressBookArray;
Run Code Online (Sandbox Code Playgroud)

cocoa-touch objective-c nsmutablearray abrecord

0
推荐指数
1
解决办法
1112
查看次数