我即将推出的应用的一些测试用户报告说,联系人列表包含大量重复记录.我正在使用结果ABAddressBookCopyArrayOfAllPeople作为我自定义的联系人表视图的数据源,这让我感到困惑,结果与iPhone的"联系人"应用程序不同.
当仔细查看"联系人"应用程序时,重复项似乎来自具有"链接卡"的条目.下面的屏幕截图有点混淆,但正如你在我最右边的应用程序中看到的那样,"Celine"显示两次,而在左边的Contacts应用程序中只有一个"Celine".如果您单击该单个联系人的行,您将获得一张带有两个"链接卡"的"统一信息"卡(如中心所示,我没有使用Celine的联系方式,因为它们不适用于一个屏幕截图):

围绕"联卡"的问题,有相当一几个主题上苹果的论坛上为最终用户,但除了一个事实,即许多点到404支持页面,我不能真实地去周围固定了我所有的应用程序的用户的地址簿.我更愿意优雅地处理它而不会打扰用户.更糟糕的是,似乎我不是唯一一个有这个问题的人,因为WhatsApp显示的是包含重复联系人的相同列表.
为了清楚重复联系人的起源,我不是存储,缓存或以其他方式试图聪明地了解数组ABAddressBookCopyArrayOfAllPeople返回.因此,重复记录直接来自API调用.
有谁知道如何处理或检测这些链接卡,防止重复记录显示?Apple的联系人应用程序可以做到,我们其他人也可以这样做吗?
更新:我写了一个库并把它放在Cocoapods上以解决手头的问题.请参阅下面的答案
我正在存储一个ABRecordID(实际上包裹在NSNumber中)的数组NSUserDefaults.到目前为止这么好,但现在我需要将其加载到ABRecordRef无法找到要使用的功能.
我只是在寻找从ABRecordID创建ABRecordRef的函数,就是这样.
我正在开发一个聊天应用程序.我需要保存联系人.所以我在我的核心数据实体中保存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) 我是新手,我在Xcode 4.2中有一个ABRecordSetValue的问题.我有这个代码:
ABRecordSetValue(aContact, kABPersonLastNameProperty, lastName, &anError);
Run Code Online (Sandbox Code Playgroud)
但是,我继续收到此错误消息:
使用ARC不允许将Objective-C指针隐式转换为'CFTypeRef'(又名'const void*')
我将'lastName'字段作为NSString.我的代码出了什么问题?
先感谢您.
我正在使用这个简单的代码来获取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) 我目前正在从地址簿中提取所有联系人,并希望保存我遇到特定联系人的最后日期.因此,我在同一时间获取日历如下:
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()发生故障...有任何建议如何解决这个问题?
我收到一个错误:
将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) abrecord ×7
addressbook ×2
cocoa-touch ×2
ios ×2
iphone ×2
objective-c ×2
abperson ×1
abrecordref ×1
calendar ×1
contacts ×1
duplicates ×1
ios5 ×1
xcode4.2 ×1