如何安卓自定义通讯录iOS通讯录

推荐到广播
81520 人聚集在这个小组
第三方登录:iOS(404)
苹果给用户提供了自己的通讯录,但是根据业务的需求,需要自定义通讯录,我们就需要根据业务需求来自定义&
首先我们需要知道苹果的提供的一些Foundation、UIKit框架,了解其中的一些特性,可以打开手机查看苹果系统提供的
原生的通讯录,可以看到:
2.右侧搜索条&
3.联系人分组
4.添加联系人&
5.获取联系人头像及联系方式&
根据需求,可以总结出自定义通讯录需要做的一些功能,一项大的功能可以差分成一些小的功能,然后
一个一个实现,将复杂的问题差分成小问题解决。&
1.自定义搜索框
2.获取首字母
3.权限判断&
5.自定义搜索
6.自定义联系人界面(考虑多值的情况,获取通讯录头像)
简答介绍下排序:
IOS项目中会用到对通讯录的联系人或是会员按姓名为关键字排序,因为NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完成按A~Z的排序,这看起来是个头疼的问题,因为牵扯到汉字转为拼音,获取汉字的首字的首字母,如将“王”变成“W”。
函数原理是:我们知道,在Objective C语言中,字符串是以unicode进行编码的。在unicode字符集中,汉字的编码范围为4E00 到 9FA5 之间(即从第19968开始的20902个字符是字符)。我们把这些字符的拼音首字母按照顺序都存放在一个char数组中。当我们查找一个汉字的拼音首字母时,只需把这个汉字的(即char为int)减去19968,然后用这个数字作为索引去找char数组中存放的字母即可。
给出项目的源码,注释很清楚。代码如:
RYAddressBook.h
#import &Foundation/Foundation.h&
#import &RYPersonInfo.h&
typedef void (^AddressBookBlock) (NSArray *personInfos);
@interface RYAddressBook : NSObject
将数字转化为字母 0~26 1~25=a~z 26=#
NSString* SpellFromIndex(int index);
int Index(NSString *firstSpell);
获取用户所有通讯录信息
@return 所有通讯录数据信息数组
+ (void)getPersonInfo:(AddressBookBlock)addressBookB
根据关键字匹配所有用户信息
@param keyWord 匹配关键字
@return 匹配到的通讯录数据信息数组
+ (void)searchPersonInfo:(NSString *)keyWord addressBookBlock:(AddressBookBlock)addressBookB
根据姓名进行数组的重排序
@param personInfos 获取的通讯录数据信息数组
+ (NSArray *)sortPersonInfos:(NSArray *)personI
RYAddressBook.m
#import &RYAddressBook.h&
@interface RYAddressBook ()
@property (nonatomic, copy) AddressBookBlock addressBookB
@implementation RYAddressBook
NSString* SpellFromIndex(int index)
if (index == 26)
return @&#&;
return [NSString stringWithFormat:@&%c&, [@&A& characterAtIndex:0]+index];
int Index(NSString *firstSpell)
int i = [firstSpell characterAtIndex:0] - [@&a& characterAtIndex:0];
if ([firstSpell isEqualToString:@&#&] || i & 0 || i & 26) {
return 26;
return [firstSpell characterAtIndex:0] - [@&a& characterAtIndex:0];
获取用户所有通讯录信息
+ (void)getPersonInfo:(AddressBookBlock)addressBookBlock
[[self alloc] getPersonInfo:addressBookBlock];
根据关键字匹配所有用户信息
+ (void)searchPersonInfo:(NSString *)keyWord addressBookBlock:(AddressBookBlock)addressBookBlock
[[self alloc] searchPersonInfo:keyWord addressBookBlock:addressBookBlock];
根据姓名进行数组的重排序
+ (NSArray *)sortPersonInfos:(NSArray *)personInfos
return [[self alloc] sortPersonInfos:personInfos];
- (void)getPersonInfo:(AddressBookBlock)addressBookBlock
self.addressBookBlock = addressBookB
[self searchPersonInfo:@&&];
- (void)searchPersonInfo:(NSString *)keyWord addressBookBlock:(AddressBookBlock)addressBookBlock
self.addressBookBlock = addressBookB
[self searchPersonInfo:keyWord];
- (NSArray *)sortPersonInfos:(NSArray *)personInfos
if (![personInfos isKindOfClass:[NSArray class]]) {
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i & 27; i++) {
[arr addObject:[NSMutableArray array]];
for (NSObject *obj in personInfos) {
if (![obj isKindOfClass:[RYPersonInfo class]]) {
RYPersonInfo *personInfo = (RYPersonInfo *)
NSMutableArray *subArr = [arr objectAtIndex:Index(personInfo.firstSpell)];
[subArr addObject:personInfo];
根据关键字查询通讯录信息
- (void)searchPersonInfo:(NSString *)keyWord
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
// 开始查询通讯录
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
[self filterContentForSearchText:keyWord];
开始匹配通讯录信息
- (void)filterContentForSearchText:(NSString*)searchText
//如果没有授权则退出
if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
NSArray *blockArray = [NSArray array];
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if([searchText length]==0)
//查询所有
blockArray = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
//条件查询
CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText);
blockArray = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText));
CFRelease(cfSearchText);
// 类型转换
blockArray = transformElements(blockArray);
// 返回BlockArray
self.addressBookBlock(blockArray);
将所有元素转化为JXPersonInfo类型数组
NSArray* transformElements(NSArray* arr)
NSMutableArray *rtnArray = [NSMutableArray array];
for (int i = 0; i & arr. i++) {
ABRecordRef recordRef = CFBridgingRetain([arr objectAtIndex:i]);
RYPersonInfo *personInfo = [RYPersonInfo personInfoWithABRecordRef:recordRef];
[rtnArray addObject:personInfo];
return rtnA
RYPersonInfo.h
#import &Foundation/Foundation.h&
#import &AddressBook/AddressBook.h&
@interface RYPersonInfo : NSObject
#define PROPERTY_STR_READONLY(name) @property (nonatomic, copy) NSString *
PROPERTY_STR_READONLY(firstName)
PROPERTY_STR_READONLY(lastName)
PROPERTY_STR_READONLY(middlename)
PROPERTY_STR_READONLY(fullName)
// 搜索索引
PROPERTY_STR_READONLY(firstSpell)
PROPERTY_STR_READONLY(prefix)
PROPERTY_STR_READONLY(suffix)
PROPERTY_STR_READONLY(nickname)
// 姓_音标
PROPERTY_STR_READONLY(firstnamePhonetic)
// 名_音标
PROPERTY_STR_READONLY(lastnamePhonetic)
// 中间名_音标
PROPERTY_STR_READONLY(middlenamePhonetic)
PROPERTY_STR_READONLY(organization)
PROPERTY_STR_READONLY(jobtitle)
PROPERTY_STR_READONLY(department)
PROPERTY_STR_READONLY(birthday)
PROPERTY_STR_READONLY(note)
// 第一次创建用户信息的时间
PROPERTY_STR_READONLY(firstknow)
// 最后一次更改用户信息的时间
PROPERTY_STR_READONLY(lastknow)
// 名片类型(company/person)
PROPERTY_STR_READONLY(kind)
// 多值信息
#define PROPERTY_ARR_READONLY(name) @property (nonatomic, strong) NSArray *
PROPERTY_ARR_READONLY(email)
PROPERTY_ARR_READONLY(address)
PROPERTY_ARR_READONLY(dates)
// iMessage
PROPERTY_ARR_READONLY(iMessage)
// 电话号码
PROPERTY_ARR_READONLY(phone)
// URL链接
PROPERTY_ARR_READONLY(url)
#define PROPERTY_IMG_READONLY(name) @property (nonatomic, strong) UIImage *
//PROPERTY_IMG_READONLY(image)
初始化方法
@param ref 联系人属性
@return 实例对象
- (id)initWithABRecordRef:(ABRecordRef)
初始化类方法
@param ref 联系人属性
@return 实例对象
+ (id)personInfoWithABRecordRef:(ABRecordRef)
RYPersonInfo.m
#import &RYPersonInfo.h&
#define nullStrToEmpty(str) \
[str rangeOfString:@&null&].location==0? @&& : str
#define GET_PROPERTY_METHOD(property, property_key) \
- (NSString *)property {\
return (NSString *)CFBridgingRelease(ABRecordCopyValue(_recordRef, property_key));\
#define DICT_ADD_STR_FOR_KEY(dict, str, key) \
if (str) {\
[dict setObject:str forKey:key];\
#define GET_PROPERTY_SIGLE_VALUE_METHOD(property, property_key)\
- (NSArray *)property\
NSMutableArray *rtnArray = [NSMutableArray array];\
ABMultiValueRef ref = ABRecordCopyValue(_recordRef, property_key);\
long count = ABMultiValueGetCount(ref);\
for (int i = 0; i & i++)\
NSString* label = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(ref, i));\
NSString* content = (__bridge NSString*)ABMultiValueCopyValueAtIndex(ref, i);\
NSMutableDictionary *dict = [NSMutableDictionary dictionary];\
DICT_ADD_STR_FOR_KEY(dict, content, label);\
[rtnArray addObject:dict];\
return rtnA\
@interface RYPersonInfo ()
@property (nonatomic , assign)ABRecordRef recordR
@implementation RYPersonInfo
- (id)initWithABRecordRef:(ABRecordRef)ref {
if (self = [super init]) {
_recordRef =
+ (id)personInfoWithABRecordRef:(ABRecordRef)ref {
return [[[self class] alloc] initWithABRecordRef:ref];
GET_PROPERTY_METHOD( firstName
, kABPersonFirstNameProperty);
GET_PROPERTY_METHOD( lastName
, kABPersonLastNameProperty);
GET_PROPERTY_METHOD( middlename
, kABPersonMiddleNameProperty);
GET_PROPERTY_METHOD( prefix
, kABPersonPrefixProperty);
GET_PROPERTY_METHOD( suffix
, kABPersonSuffixProperty);
GET_PROPERTY_METHOD( nickname
, kABPersonNicknameProperty);
GET_PROPERTY_METHOD( organization , kABPersonOrganizationProperty);
GET_PROPERTY_METHOD( jobtitle
, kABPersonJobTitleProperty);
GET_PROPERTY_METHOD( department
, kABPersonDepartmentProperty);
GET_PROPERTY_METHOD( birthday
, kABPersonBirthdayProperty);
GET_PROPERTY_METHOD( note
, kABPersonNoteProperty);
GET_PROPERTY_METHOD( firstknow
, kABPersonCreationDateProperty);
GET_PROPERTY_METHOD( lastknow
, kABPersonModificationDateProperty);
GET_PROPERTY_METHOD( firstnamePhonetic , kABPersonFirstNamePhoneticProperty);
GET_PROPERTY_METHOD( lastnamePhonetic
, kABPersonLastNamePhoneticProperty);
GET_PROPERTY_METHOD( middlenamePhonetic, kABPersonMiddleNamePhoneticProperty);
GET_PROPERTY_SIGLE_VALUE_METHOD(email, kABPersonEmailProperty)
GET_PROPERTY_SIGLE_VALUE_METHOD(dates, kABPersonDateProperty)
GET_PROPERTY_SIGLE_VALUE_METHOD(url
, kABPersonURLProperty)
GET_PROPERTY_SIGLE_VALUE_METHOD(phone, kABPersonPhoneProperty)
- (NSString *)kind
NSString *rtnStr =
CFNumberRef recordType = ABRecordCopyValue(_recordRef, kABPersonKindProperty);
if (recordType == kABPersonKindOrganization) {
rtnStr = @&company&;
rtnStr = @&person&;
return rtnS
- (NSArray *)iMessage
NSMutableArray *rtnArray = [NSMutableArray array];
ABMultiValueRef instantMessage = ABRecordCopyValue(_recordRef, kABPersonInstantMessageProperty);
for (int i = 1; i & ABMultiValueGetCount(instantMessage); i++)
NSString* label = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(instantMessage, i);
NSDictionary* content =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(instantMessage, i);
NSMutableDictionary *imessageInfoDict = [NSMutableDictionary dictionary];
NSString* username = [content valueForKey:(NSString *)kABPersonInstantMessageUsernameKey];
NSString* service = [content valueForKey:(NSString *)kABPersonInstantMessageServiceKey];
DICT_ADD_STR_FOR_KEY(imessageInfoDict, username, @&username&);
DICT_ADD_STR_FOR_KEY(imessageInfoDict, service,
@&service&);
NSDictionary *imessageDict = @{label: imessageInfoDict};
[rtnArray addObject:imessageDict];
return rtnA
-(NSArray *)address
NSMutableArray *rtnArray = [NSMutableArray array];
ABMultiValueRef address = ABRecordCopyValue(_recordRef, kABPersonAddressProperty);
long count = ABMultiValueGetCount(address);
for(int i = 0; i & i++)
NSString* addressLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(address, i);
NSDictionary* personaddress =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(address, i);
NSMutableDictionary *addressInfoDict = [NSMutableDictionary dictionary];
NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];
NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];
NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];
NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];
NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];
NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];
DICT_ADD_STR_FOR_KEY(addressInfoDict, country,
@&country&);
DICT_ADD_STR_FOR_KEY(addressInfoDict, city,
DICT_ADD_STR_FOR_KEY(addressInfoDict, state,
@&state&);
DICT_ADD_STR_FOR_KEY(addressInfoDict, street,
@&street&);
DICT_ADD_STR_FOR_KEY(addressInfoDict, zip,
DICT_ADD_STR_FOR_KEY(addressInfoDict, coutntrycode, @&coutntrycode&);
NSDictionary *addressDict = @{addressLabel: addressInfoDict};
[rtnArray addObject:addressDict];
return rtnA
//- (UIImage *)image
NSData *data = (__bridge NSData*)ABPersonCopyImageData(_recordRef);
return [UIImage imageWithData:data];
#pragma mark -
#pragma mark - CustomProperty
- (NSString *)fullName
return [NSString stringWithFormat:@&%@%@%@&,
nullStrToEmpty(self.lastName),
nullStrToEmpty(self.middlename),
nullStrToEmpty(self.firstName)];
- (NSString *)firstSpell
return getFirstSpell(self.fullName);
输出模型所有信息
- (NSString *)description
return [NSString stringWithFormat:@&%@ -- InfoPacket&,
self.fullName];
获取首字母
NSString* getFirstSpell(NSString *fullName)
NSMutableString *ms = [[NSMutableString alloc] initWithString:fullName];
CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformMandarinLatin, NO);
CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformStripDiacritics, NO);
if (fullName.length & 0)
return [[ms substringWithRange:NSMakeRange(0, 1)] lowercaseString];
return @&#&;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:212506次
积分:8595
积分:8595
排名:第1628名
原创:648篇
转载:59篇
评论:70条
(4)(6)(7)(5)(3)(6)(6)(6)(44)(10)(50)(63)(3)(38)(105)(67)(145)(37)(104)如何批量删除iPhone通讯录的自定义标签?
&img src=&/e2feaf73d095d0feefb057_b.jpg& data-rawwidth=&640& data-rawheight=&1136& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/e2feaf73d095d0feefb057_r.jpg&&之前装了搜狗号码通lite,发现在通讯录里给加了这好多标签,而且删除不掉。&br&试了用QQ通讯录和微博通讯录都不行,想问怎么解决。批量删除最好,初步估计得有几千个。
请期待搜狗号码通LITE即将推出的新版本可以批量删除标签
从来没有用过这么shit的软件,搞得我每次打开电话本都要等几分钟,微信里面也莫名其妙多出来无数的好友,还都是广告什么的,删了软件之后还留下一大堆自定义标签,如果不能说脏话,那我无话可说。
已有帐号?
无法登录?
社交帐号登录教程:自定义联系人在 iOS 8 应用程序切换界面的显示 - 少数派
教程:自定义联系人在 iOS 8 应用程序切换界面的显示
教程:自定义联系人在 iOS 8 应用程序切换界面的显示
iOS 8 推出了很多针对 iOS 7 的优化何调整,尤其是在细节方面。比如当用户切换应用程序时,iOS 8 默认在选项卡预览图上方显示你收藏的联系人,以及你最近联系过的联系人。这一点的确非常方便,可以为你节省不少时间。但是如果你担心联系人隐私在切换应用程序时不经意泄漏,我们也可以选择只显示收藏的联系人,或者干脆不显示。
接下来笔者将演示如何选择性显示这些联系人信息,或者是隐藏这些联系人信息。
设置应用程序切换界面只显示「个人收藏」的联系人
也许你不希望在应用程序切换界面看到你最近联系过的人(不希望他人看见吧),我们可以选择只显示「个人收藏」的联系人。
第一步:打开「设置」应用程序。
第二步:找到并选择「邮件、通讯录、日历」项。
第三步:向下滚动,找到「在应用程序切换器中显示」项。
第四步:关闭「最近通话」右方的按钮。
注:你可以在「电话」应用程序中定制「我的收藏」联系人,目前还不能设置某个(些)特定的联系人在应用程序切换界面显示。
在应用程序切换界面关闭联系人显示
也许你觉得在应用程序切换器显示的这些联系人并没有真正意义上节省你的时间,很少用得到的话,那么你还可以彻底关闭应用程序切换界面的联系人显示。
第一步:打开「设置」应用程序。
第二步:找到并选择「邮件、通讯录、日历」项。
第三步:向下滚动,找到「在应用程序切换器中显示」项。
第四步:关闭「电话收藏」和「最近通话」右方的按钮即可。
更改将会立即生效。以下是动图版:
当然,如果你以后改变了主意,你可以随时回来打开这些开关来将联系人显示在应用程序切换界面。
你怎么处理这些联系人显示选项的?欢迎在下方评论栏留下你的想法。
更多 iOS 8 相关文章:
分享到微信
iBooks 指南图书《LET'S TALK iPHONE》、《LET'S TALK ?WATCH》作者;少数派撰稿人;爱啃苹果。
Email 登录
微信订阅二维码后使用快捷导航没有帐号?
只需一步,快速开始
查看: 6242|回复: 3
积分10精华0主题帖子威望0 活跃5 PP币34 PP豆0 阅读权限10最后登录
, 积分 10, 距离下一级还需 90 积分
该用户从未签到威望0 活跃5 PP币34 PP豆0 设备iPhone4s
& && & 求助给位大神。 通讯录里面的自定义标签要怎么搞才可以删除啊 ?
积分6959精华0主题帖子威望360 活跃11694 PP币1526 PP豆472 阅读权限90最后登录
, 积分 6959, 距离下一级还需 3041 积分
TA的每日心情开心昨天&11:18签到天数: 1157 天连续签到: 49 天[LV.10]以坛为家III威望360 活跃11694 PP币1526 PP豆472
选择联系人-编辑,删除你想删除的自定义就可以了,然后保存
积分10精华0主题帖子威望0 活跃5 PP币34 PP豆0 阅读权限10最后登录
, 积分 10, 距离下一级还需 90 积分
该用户从未签到威望0 活跃5 PP币34 PP豆0 设备iPhone4s
& & 谢谢 版主的回答 。进去通讯录按编辑就是没有删除
积分10精华0主题帖子威望0 活跃5 PP币34 PP豆0 阅读权限10最后登录
, 积分 10, 距离下一级还需 90 积分
该用户从未签到威望0 活跃5 PP币34 PP豆0 设备iPhone4s
andywang 发表于
选择联系人-编辑,删除你想删除的自定义就可以了,然后保存
之前在IOS6里可以删除自定义标签,但是升级到7.1之后发现只能添加自定标签却无法删除了.还有没有其他办法啊?
论坛优秀版主
论坛雷锋好模范
论坛回帖之王
Powered by
Copyright&
Aihe Internet Technology Co.,Ltd. All Rights Reserved.广州爱禾网络技术有限公司 版权所有&&

我要回帖

更多关于 ios10如何导出通讯录 的文章

 

随机推荐