- 浏览: 30565 次
- 性别:
- 来自: 北京
最新评论
iphone如许app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和AddressBook两个包,具体实现方法如下
////////////////////////////////////////////////////////////////////////////
//定义通讯录名字为addressbook
ABAddressBookRef addressBook = ABAddressBookCreate();
//将通讯录中的信息用数组方式读出
CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook);
//获取通讯录中联系人
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
iphoneContactList = [[NSMutableArray alloc] initWithCapacity:0];
for (int i = 0; i < nPeople; i++)
{
IphoneContact * iphoneContact = [[IphoneContact alloc] init];
NSData *imageData = [[[NSData alloc] init]autorelease];
NSString *address = [[[NSString alloc] init]autorelease];
ABRecordRef person = CFArrayGetValueAtIndex(contacts, i);//取出某一个人的信息
NSInteger lookupforkey =(NSInteger)ABRecordGetRecordID(person);//读取通讯录中联系人的唯一标识
NSDate * createDate = (NSDate *)ABRecordCopyValue(person, kABPersonCreationDateProperty);// 读取通讯录中联系人的创建日期
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSString* birthDay = [formatter stringFromDate:createDate];
[formatter release];
NSString *createDate1 = [birthDay stringByReplacingOccurrencesOfString:@"-" withString:@""];
NSString *createDate2 = [createDate1 stringByReplacingOccurrencesOfString:@":" withString:@""];
NSString *createDate3 = [createDate2 stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"1111========%@",createDate3);
NSLog(@"222222========%@",birthDay);
NSString *indexInIphone = [NSString stringWithFormat:@"%i",lookupforkey];
iphoneContact.lookUpKey = [createDate3 stringByAppendingString:indexInIphone];
//上诉操作是将某个联系人的标识号与创建日期进行组合,得到唯一的标识,是为了当时特殊的需要,一般不会有这种变态应用,这是因为ABRecordGetRecordID在一个手机中是唯一的,即使删掉某一个联系人,这个号也不会在被占用。
//读取联系人姓名属性
if (ABRecordCopyValue(person, kABPersonLastNameProperty)&&(ABRecordCopyValue(person, kABPersonFirstNameProperty))== nil) {
iphoneContact.contactName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
}else if (ABRecordCopyValue(person, kABPersonLastNameProperty) == nil&&(ABRecordCopyValue(person, kABPersonFirstNameProperty))){
iphoneContact.contactName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
}else if (ABRecordCopyValue(person, kABPersonLastNameProperty)&&(ABRecordCopyValue(person, kABPersonFirstNameProperty))){
NSString *first =(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *last = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
iphoneContact.contactName = [NSString stringWithFormat:@"%@%@",last,first];
}
//读取联系人姓名的第一个汉语拼音,用于排序,调用此方法需要在程序中加载pingyin.h pingyin.c,如有需要请给我联系。
iphoneContact.pinyin =[[NSString stringWithFormat:@"%c",pinyinFirstLetter([iphoneContact.contactName characterAtIndex:0])] uppercaseString];
//读取联系人公司信息
iphoneContact.contactCompany = (NSString *)ABRecordCopyValue(person, kABPersonOrganizationProperty);
//读取联系人工作
iphoneContact.contactJob = (NSString *)ABRecordCopyValue(person, kABPersonJobTitleProperty);
//读取联系人email信息,email有好几种,比如工作邮箱,家庭邮箱,通过ABMultiValueCopyLabelAtIndex 属性来判断,下面给出了例子
ABMultiValueRef emailForWORK = ABRecordCopyValue(person, kABPersonEmailProperty);
if ((emailForWORK != nil)&&ABMultiValueGetCount(emailForWORK)>0) {
for (int k = 0; k < ABMultiValueGetCount(emailForWORK); k++) {
NSString * aEmail = (NSString *)ABMultiValueCopyValueAtIndex(emailForWORK, k);
NSString * aEmailLabel = (NSString *)ABMultiValueCopyLabelAtIndex(emailForWORK, k);
if ([aEmailLabel isEqualToString:@"_$!<Work>!$_"]) {
iphoneContact.contactEmail = aEmail;
}
}
}
//读取通信地址信息,在ios中国家,省份,城市,区,街道,号都是单独存储的,需要单独读取然后在组合(根据需要)
ABMultiValueRef addressTotal = ABRecordCopyValue(person, kABPersonAddressProperty);
if (addressTotal) {
int count = ABMultiValueGetCount(addressTotal);
for(int j = 0; j < count; j++)
{
NSDictionary* personaddress =(NSDictionary*) ABMultiValueCopyValueAtIndex(addressTotal, j);
NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];
if(country != nil)
address = [NSString stringWithFormat:@"%@",country];
NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];
if(city != nil)
address = [address stringByAppendingFormat:@"%@",city];
NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];
if(state != nil)
address = [address stringByAppendingFormat:@"%@",state];
NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];
if(street != nil)
address = [address stringByAppendingFormat:@"%@",street];
}
iphoneContact.contactAdress = address;
}
//读取电话信息,和emial类似,也分为工作电话,家庭电话,工作传真,家庭传真。。。。
ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
if ((phone != nil)&&ABMultiValueGetCount(phone)>0) {
for (int m = 0; m < ABMultiValueGetCount(phone); m++) {
NSString * aPhone = [(NSString *)ABMultiValueCopyValueAtIndex(phone, m) autorelease];
NSString * aLabel = [(NSString *)ABMultiValueCopyLabelAtIndex(phone, m) autorelease];
if ([aLabel isEqualToString:@"_$!<Mobile>!$_"]) {
iphoneContact.contactMobile= aPhone;
}
if ([aLabel isEqualToString:@"_$!<WorkFAX>!$_"]) {
iphoneContact.contactFax = aPhone;
}
if ([aLabel isEqualToString:@"_$!<Work>!$_"]) {
iphoneContact.contactTelephone= aPhone;
}
}
}
//读取照片信息
imageData = (NSData *)ABPersonCopyImageData(person);
UIImage *myImage = [UIImage imageWithData:imageData];
CGSize newSize = CGSizeMake(55, 55);
UIGraphicsBeginImageContext(newSize);
[myImage drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();//上诉代码实现图片压缩,可根据需要选择,现在是压缩到55*55
imageData = UIImagePNGRepresentation(newImage);
if (imageData) {
NSData * BimageData = [GTMBase64 encodeData:imageData];
iphoneContact.headImage= [[NSString alloc] initWithData:BimageData encoding:NSUTF8StringEncoding];
}
iphoneContact.isSelected = NO;
[iphoneContactList addObject:iphoneContact]; //将读取的某一个人信息放到我们自定义的可变数组中
}
////////////////////////////////////////////////////////////////////////////
//定义通讯录名字为addressbook
ABAddressBookRef addressBook = ABAddressBookCreate();
//将通讯录中的信息用数组方式读出
CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook);
//获取通讯录中联系人
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
iphoneContactList = [[NSMutableArray alloc] initWithCapacity:0];
for (int i = 0; i < nPeople; i++)
{
IphoneContact * iphoneContact = [[IphoneContact alloc] init];
NSData *imageData = [[[NSData alloc] init]autorelease];
NSString *address = [[[NSString alloc] init]autorelease];
ABRecordRef person = CFArrayGetValueAtIndex(contacts, i);//取出某一个人的信息
NSInteger lookupforkey =(NSInteger)ABRecordGetRecordID(person);//读取通讯录中联系人的唯一标识
NSDate * createDate = (NSDate *)ABRecordCopyValue(person, kABPersonCreationDateProperty);// 读取通讯录中联系人的创建日期
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSString* birthDay = [formatter stringFromDate:createDate];
[formatter release];
NSString *createDate1 = [birthDay stringByReplacingOccurrencesOfString:@"-" withString:@""];
NSString *createDate2 = [createDate1 stringByReplacingOccurrencesOfString:@":" withString:@""];
NSString *createDate3 = [createDate2 stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"1111========%@",createDate3);
NSLog(@"222222========%@",birthDay);
NSString *indexInIphone = [NSString stringWithFormat:@"%i",lookupforkey];
iphoneContact.lookUpKey = [createDate3 stringByAppendingString:indexInIphone];
//上诉操作是将某个联系人的标识号与创建日期进行组合,得到唯一的标识,是为了当时特殊的需要,一般不会有这种变态应用,这是因为ABRecordGetRecordID在一个手机中是唯一的,即使删掉某一个联系人,这个号也不会在被占用。
//读取联系人姓名属性
if (ABRecordCopyValue(person, kABPersonLastNameProperty)&&(ABRecordCopyValue(person, kABPersonFirstNameProperty))== nil) {
iphoneContact.contactName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
}else if (ABRecordCopyValue(person, kABPersonLastNameProperty) == nil&&(ABRecordCopyValue(person, kABPersonFirstNameProperty))){
iphoneContact.contactName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
}else if (ABRecordCopyValue(person, kABPersonLastNameProperty)&&(ABRecordCopyValue(person, kABPersonFirstNameProperty))){
NSString *first =(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *last = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
iphoneContact.contactName = [NSString stringWithFormat:@"%@%@",last,first];
}
//读取联系人姓名的第一个汉语拼音,用于排序,调用此方法需要在程序中加载pingyin.h pingyin.c,如有需要请给我联系。
iphoneContact.pinyin =[[NSString stringWithFormat:@"%c",pinyinFirstLetter([iphoneContact.contactName characterAtIndex:0])] uppercaseString];
//读取联系人公司信息
iphoneContact.contactCompany = (NSString *)ABRecordCopyValue(person, kABPersonOrganizationProperty);
//读取联系人工作
iphoneContact.contactJob = (NSString *)ABRecordCopyValue(person, kABPersonJobTitleProperty);
//读取联系人email信息,email有好几种,比如工作邮箱,家庭邮箱,通过ABMultiValueCopyLabelAtIndex 属性来判断,下面给出了例子
ABMultiValueRef emailForWORK = ABRecordCopyValue(person, kABPersonEmailProperty);
if ((emailForWORK != nil)&&ABMultiValueGetCount(emailForWORK)>0) {
for (int k = 0; k < ABMultiValueGetCount(emailForWORK); k++) {
NSString * aEmail = (NSString *)ABMultiValueCopyValueAtIndex(emailForWORK, k);
NSString * aEmailLabel = (NSString *)ABMultiValueCopyLabelAtIndex(emailForWORK, k);
if ([aEmailLabel isEqualToString:@"_$!<Work>!$_"]) {
iphoneContact.contactEmail = aEmail;
}
}
}
//读取通信地址信息,在ios中国家,省份,城市,区,街道,号都是单独存储的,需要单独读取然后在组合(根据需要)
ABMultiValueRef addressTotal = ABRecordCopyValue(person, kABPersonAddressProperty);
if (addressTotal) {
int count = ABMultiValueGetCount(addressTotal);
for(int j = 0; j < count; j++)
{
NSDictionary* personaddress =(NSDictionary*) ABMultiValueCopyValueAtIndex(addressTotal, j);
NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];
if(country != nil)
address = [NSString stringWithFormat:@"%@",country];
NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];
if(city != nil)
address = [address stringByAppendingFormat:@"%@",city];
NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];
if(state != nil)
address = [address stringByAppendingFormat:@"%@",state];
NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];
if(street != nil)
address = [address stringByAppendingFormat:@"%@",street];
}
iphoneContact.contactAdress = address;
}
//读取电话信息,和emial类似,也分为工作电话,家庭电话,工作传真,家庭传真。。。。
ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
if ((phone != nil)&&ABMultiValueGetCount(phone)>0) {
for (int m = 0; m < ABMultiValueGetCount(phone); m++) {
NSString * aPhone = [(NSString *)ABMultiValueCopyValueAtIndex(phone, m) autorelease];
NSString * aLabel = [(NSString *)ABMultiValueCopyLabelAtIndex(phone, m) autorelease];
if ([aLabel isEqualToString:@"_$!<Mobile>!$_"]) {
iphoneContact.contactMobile= aPhone;
}
if ([aLabel isEqualToString:@"_$!<WorkFAX>!$_"]) {
iphoneContact.contactFax = aPhone;
}
if ([aLabel isEqualToString:@"_$!<Work>!$_"]) {
iphoneContact.contactTelephone= aPhone;
}
}
}
//读取照片信息
imageData = (NSData *)ABPersonCopyImageData(person);
UIImage *myImage = [UIImage imageWithData:imageData];
CGSize newSize = CGSizeMake(55, 55);
UIGraphicsBeginImageContext(newSize);
[myImage drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();//上诉代码实现图片压缩,可根据需要选择,现在是压缩到55*55
imageData = UIImagePNGRepresentation(newImage);
if (imageData) {
NSData * BimageData = [GTMBase64 encodeData:imageData];
iphoneContact.headImage= [[NSString alloc] initWithData:BimageData encoding:NSUTF8StringEncoding];
}
iphoneContact.isSelected = NO;
[iphoneContactList addObject:iphoneContact]; //将读取的某一个人信息放到我们自定义的可变数组中
}
发表评论
-
MFMessageComposeViewController发送短信
2013-04-11 13:33 1275MFMessageComposeViewController ... -
RESTful HTTP的实践
2013-04-11 12:20 1016本文对RESTful HTTP的基础原理做了一个概览,探讨了开 ... -
IOS使用第三方工具(RegexKitLite)实现正则表达式
2013-04-10 18:19 1878在IOS应用中,经常要输入数据,然输入数据,就要 ... -
iPhone:动态获取UILabel的高度和宽度
2013-04-09 18:10 805在使用UILabel存放字符串时,经常需要获取label的长宽 ... -
获得通讯录中联系人的所有属性ABAddressBookRef
2013-04-09 13:11 1011获得通讯录中联系人的所有属性 ,看代码: ABA ... -
iOS 绘制直线、矩形、文字的方式
2013-04-08 10:35 4306首先,获取上下文 CGContextRef context = ... -
iOS 开发小技巧(二)
2013-04-08 09:36 7091、获取全局的Delegate对象,这样我们可以调用这个对象里 ... -
iOS 开发小技巧(一)
2013-04-08 09:27 6781.取字符串中的某段字符串 [plain] view pla ... -
IOS导航栏的创建方法
2013-04-07 15:45 1013基本思路是: 1.创建一个导航栏(UINavigationB ... -
iOS 绘制UIImage的方式
2013-04-07 13:03 2405一:在绘制到context前通过矩阵垂直翻转坐标系 // ui ... -
理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
2013-04-07 12:59 1746在VC++6.0的include有一个stdarg.h头文件, ... -
iOS 开发小技巧(三)
2013-04-06 09:21 6601.判断邮箱格式是否正确的代码 //利用正则表达式验证 -(B ...
相关推荐
在iOS9中,苹果引入了全新的Contacts框架,以替换之前的AddressBook框架,为开发者提供了更加高效、安全且灵活的方式来访问和管理用户的联系人信息。这个Demo项目“iOS9 通讯录新框架Demo”旨在演示如何利用这个新...
本教程将详细讲解如何在iOS 6.0及更高版本中读取通讯录,并提供一个简单的DEMO来展示姓名和手机号的获取方法。在这个过程中,我们将涉及到几个关键的Apple框架,包括AddressBook和UIKit,以及相关的API调用。 首先...
在这个场景下,我们主要关注的是iOS的AddressBook框架,它是苹果官方提供用来与设备上的通讯录数据进行交互的API。 通讯录的实现主要涉及到两个核心对象:`ABAddressBookRef` 和 `ABRecordRef`。`ABAddressBookRef`...
"iOS通讯录优化"这个项目,通过创建一个简单的demo,展示了如何高效地处理和展示本机通讯录信息。在这个过程中,开发者会涉及到苹果的Contacts框架,以及数据归档与优化的相关技术。以下是对这些知识点的详细讲解: ...
2. **读取通讯录** 如果权限已获得,我们可以通过`ABAddressBookCopyArrayOfAllPeople`方法获取所有联系人的数组。每个元素都是一个`ABRecordRef`,代表一个联系人。 3. **拼音处理** 要按照汉字拼音排序,我们...
在iOS开发中,访问和管理用户的通讯录是一项重要的功能,这通常涉及到苹果的AddressBook框架。这个"iOS通讯录的demo"就是一个实例,演示了如何使用AddressBookDemo来操作iOS设备上的联系人数据。下面我们将深入探讨...
在iOS开发中,读取和操作用户通讯录是一项常见的功能,尤其在社交应用或需要集成联系人管理的...通过上述知识点的学习和实践,开发者可以有效地在iOS应用中实现读取通讯录和录音播放功能,为用户提供更丰富的交互体验。
它取代了旧的AddressBook框架,提供了一种更加安全和隐私友好的方式来访问通讯录。在使用Contacts框架时,你需要获取用户授权才能访问他们的联系人数据。 2. **授权访问通讯录**: 在iOS中,应用需要请求用户的...
在iOS开发中,实现“通讯录时时读取并按照首字母排序”的功能涉及到多个关键知识点。首先,我们需要理解和使用苹果的Contacts框架,这是iOS系统提供用于访问和管理用户联系人数据的核心API。接下来,让我们深入探讨...
在实现过程中,开发者还需要关注iOS系统的AddressBook框架,这是一个系统级的API,用于读取和修改用户的设备通讯录。虽然这个字典版通讯录不直接依赖于AddressBook框架,但理解其工作原理和权限管理对于提高应用的...
在iOS平台上,模仿通讯录是一项常见的开发任务,旨在创建一个类似于原生苹果手机通讯录的应用程序,提供便捷的联系人管理功能。这个项目的核心在于理解并实现iOS中的联系人框架,以及相关的用户界面设计和交互体验。...
本项目专注于“ios应用程序之通讯录”,利用plist文件存储联系人信息,并能从模拟器中获取图片作为头像,提供了基本的添加、删除和修改联系人的功能。下面我们将深入探讨这些知识点。 首先,`plist`文件是iOS中常用...
AddressBook框架提供了一系列API,允许开发者读取、修改用户设备上的联系人信息。请注意,从iOS 9开始,苹果引入了Core Contact框架,但在iOS 8及更早版本中,AddressBook仍然是主要的接口。 首先,我们需要请求...
1. **AddressBook框架介绍**:AddressBook框架是iOS SDK的一部分,允许开发者读取、修改和创建用户设备上的联系人信息。它包括一系列的类和枚举,如ABAddressBookRef(地址簿引用)、ABPersonRef(联系人引用)和...
PPGetAddressBook对AddressBook框架(iOS9之前)和Contacts框架(iOS9之后)做了对应的封装处理; 支持获取按联系人姓名首字拼音A~Z排序(重点:已经对姓名的第二个字做了处理,排序更准确!);
在iOS SDK中,`AddressBook.framework`提供了与设备上的通讯录进行交互的能力,使得开发人员能够读取、插入或修改通讯录数据。要在应用程序中使用这些功能,首先需要在项目中添加`AddressBook.framework`框架。以下...
而在iOS系统中,我们可以利用AddressBook框架进行操作。 接下来,考虑到隐私保护,通讯录信息的提取必须遵循严格的安全策略。这包括获取用户授权,确保数据加密传输,以及遵循数据最小化原则,只提取必要的信息。在...
在iOS应用开发中,通讯录的管理通常涉及到访问系统的AddressBook框架,这是一个原生的API,用于处理用户设备上的联系人信息。然而,如果需要在应用内部存储或处理大量联系人数据,或者需要自定义的数据结构,那么...
在iOS应用程序中,如果需要读取用户的通讯录信息,就需要使用AddressBook API。本文将详细介绍如何在iOS开发中实现读取addressbook的实例。 首先,为了访问AddressBook功能,你需要在项目中引入必要的框架。在Xcode...
- 提供清晰的隐私政策,告知用户应用如何使用他们的通讯录信息。 8. **国际化与本地化**: - 考虑到全球用户,通讯录选择器应支持多种语言。在Android中,通过res/values目录下的strings.xml文件进行翻译;在iOS...