IOS开发 手机联系人获取与使用ABAddressBookRef

IOS提供了直接获取手机联系人信息的API,我们需要导入该包addressbook.framework;此包并没有包含在corefoundation.framework里;

而我们通常使用的是Foundation库,这辆个库的区别就是CoreFoundation库是一个C框架,但是这两个库里的内容是可以简单的进行转换的,

比如:CFString cstr = (CFString)@"NSStringTest";NSDate *date = (NSDate *)cfdate;CoreFoundation里也有类似retain和release的方法,CFRetain和CFRelease。

首先介绍几个类:

1:ABAddressBookRef:ABAddressBookRef像一个管理员,使用过Sqlite的朋友都知道Sqlite3对象的作用,可以说ABAddressBookRef实例的作用和sqlite3的实例的性质一样,都类似一个管理者,来管理这个通讯录,并给你提供一个访问通讯录的通道,并执行保存操作。初始化一个ABAddressBookRef的实例ABAddressBookCreate( )。

2:ABRecordRef:记录。一个属性的集合。类似通讯录中一个个的人,它包含这个人的所有属性,比如First and Last name,图片信息,电话号码,邮箱等等。初始化一个ABRecordRef的方法就是:ABRecordRef person = ABPersonCreate();

我们需要的信息主要包含在下面这2个类种:

1:ABPerson 联系人信息,包含姓名,电话号码,地址信息,照片等

2:ABGroup   联系人分组信息,包含组名,数量等

最后说明:

1:返回值使用CoreFoundation是一样的:可以认为CFString*=NSString,CFArray*=NSArray,ABMultiValueRef*=Dictionary,CFError*=NSError等等,这些都可以互相转换

2:返回联系人属性分为两种:一种是拥有唯一值的属性比如姓名,生日,性别等一般用CFString返回,一种是多值属性比如电话号码,地址等一般用ABMultiValue*等返回。

3:常使用的方法和宏:

ABRecordRef record=CFArrayGetValueAtIndex(CFArr,0);实际上和NSArr类似;

ABMultiValueRef mulitValue=ABRecordCopyValue(record,kABPersonPhoneProperty);获取电话号码,可能回多个;

像上面kABPersonPhoneProperty这种宏有许多,可以用来取名kABPersonFirstNameProperty,取公司kABPersonOrganizationProperty等等。

常用情景:

[cpp]  view plain  copy
 print ?
  1. ABAddressBookRef address=ABAddressBookCreate();//读取手机通讯录  
  2. CFArrayRef allperson =ABAddressBookCopyArrayOfAllPeople(addressBook);//取全部联系人  
  3. NSArray * persons=(NSArray*)ABAddressBookCopyPeopleWithName(address,CFStringRef);//取指定姓名的联系人  

一:添加联系人

[cpp]  view plain  copy
 print ?
  1. ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate();//初始化  
  2. ABRecordRef newPerson = ABPersonCreate();  
  3. CFErrorRef error = NULL;  
  4. ABRecordSetValue(newPerson, kABPersonFirstNameProperty, firsrName, &error);//以下几行设置用户基本属性,姓名,公司  
  5. ABRecordSetValue(newPerson, kABPersonLastNameProperty, lastName, &error);  
  6. ABRecordSetValue(newPerson, kABPersonOrganizationProperty, organization, &error);  
  7. ABRecordSetValue(newPerson, kABPersonFirstNamePhoneticProperty, firstNamePhonetic, &error);  
  8. ABRecordSetValue(newPerson, kABPersonLastNamePhoneticProperty, lastNamePhonetic, &error);  
  9. ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType);//号码可以是多个,用了多值属性  
  10. ABMultiValueAddValueAndLabel(multiPhone, homeFAX, kABPersonPhoneHomeFAXLabel, NULL);  
  11. ABMultiValueAddValueAndLabel(multiPhone, mobile, kABPersonPhoneMobileLabel, NULL);  
  12. ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone, &error);  
  13. CFRelease(multiPhone);  
  14. ABMutableMultiValueRef multiEmail = ABMultiValueCreateMutable(kABMultiStringPropertyType);//邮件可以是多个,用了多值属性  
  15. ABMultiValueAddValueAndLabel(multiEmail, email, kABWorkLabel, NULL);  
  16. ABRecordSetValue(newPerson, kABPersonEmailProperty, multiEmail, &error);  
  17. CFRelease(multiEmail);  
  18. NSData *dataRef = UIImagePNGRepresentation(headImage);//设置头像  
  19. ABPersonSetImageData(newPerson, (CFDataRef)dataRef, &error);  
  20. ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error);  
  21. ABAddressBookSave(iPhoneAddressBook, &error);  
  22. CFRelease(newPerson);    
  23. CFRelease(iPhoneAddressBook);  

二:删除联系人

[cpp]  view plain  copy
 print ?
  1. CFErrorRef error = NULL;  
  2. ABRecordRef deletedPeople = ABAddressBookGetPersonWithRecordID(addressBook, recordID);  
  3. if (deletedPeople) {  
  4.     ABAddressBookRemoveRecord(addressBook, deletedPeople, &error);  
  5.     ABAddressBookSave(addressBook, &error);  
  6. }  

三:获取分组信息
[cpp]  view plain  copy
 print ?
  1. CFArrayRef array = ABAddressBookCopyArrayOfAllGroups(address);  
  2. for (id group in (NSArray *)array) {  
  3.     NSLog(@"group name = %@", ABRecordCopyValue(group, kABGroupNameProperty));  
  4.     NSLog(@"group id = %d", ABRecordGetRecordID(group));  
  5. }  
四:删除分组信息
[cpp]  view plain  copy
 print ?
  1. ABRecordRef deletedGroup = ABAddressBookGetGroupWithRecordID(address, RecordID);  
  2. ABAddressBookRemoveRecord(address, deletedGroup, nil);  
  3. ABAddressBookSave(address, nil);  
五:添加分组信息
[cpp]  view plain  copy
 print ?
  1. ABRecordRef  newGroup = ABGroupCreate();  
  2. ABRecordSetValue(newGroup, kABGroupNameProperty, groupName, nil);  
  3. ABAddressBookAddRecord(address, newGroup, nil);  
  4. ABAddressBookSave(address, nil);  
六:常用基本属性

[cpp]  view plain  copy
 print ?
  1. CFArrayRef allperson =ABAddressBookCopyArrayOfAllPeople(addressBook);  
  2. for (id person in (__bridge NSArray *)allperson) {  
  3.     ABMultiValueRef cfphone = ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonPhoneProperty);  
  4.     //获取firstname  
  5.     NSString *personName = (NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);  
  6.     //获取lastname kABPersonLastNameProperty  
  7.     //获取middlename kABPersonMiddleNameProperty  
  8.     //获取前缀 kABPersonPrefixProperty  
  9.     //获取后缀 kABPersonSuffixProperty  
  10.     //获取昵称 kABPersonNicknameProperty  
  11.     //获取firstname拼音音标 kABPersonFirstNamePhoneticProperty  
  12.     //获取lastname拼音音标  kABPersonLastNamePhoneticProperty  
  13.     //获取middlename拼音音标 kABPersonMiddleNamePhoneticProperty  
  14.     //获取organization公司 kABPersonOrganizationProperty  
  15.     //获取jobtitle工作 kABPersonJobTitleProperty  
  16.     //获取department部门 kABPersonDepartmentProperty  
  17.     //获取birthday生日 kABPersonBirthdayProperty  
  18.     //获取note备忘录 kABPersonNoteProperty  
  19.     //第一次添加该条记录的时间 kABPersonCreationDateProperty  
  20.     //最后一次修改該条记录的时间  kABPersonModificationDateProperty  
  21.       
  22.       
  23.     //获取照片  
  24.     NSData *image = (NSData*)ABPersonCopyImageData(person);  
  25.     UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(200, 0, 50, 50)];  
  26.     [myImage setImage:[UIImage imageWithData:image]];  
  27.     //==================以下是多值获取=========================  
  28.     //获取email多值  
  29.     ABMultiValueRef email = ABRecordCopyValue(person, kABPersonEmailProperty);  
  30.     int emailcount = ABMultiValueGetCount(email);  
  31.     for (int i = 0; i < emailcount; i++)  
  32.     {  
  33.         //获取email类型 Label  
  34.         NSString* emailLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(email, i));  
  35.         //获取email值  
  36.         NSString* emailContent = (NSString*)ABMultiValueCopyValueAtIndex(email, i);  
  37.     }  
  38.     //获取地址多值  
  39.     ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);  
  40.     int count = ABMultiValueGetCount(address);  
  41.       
  42.     for(int j = 0; j < count; j++)  
  43.     {  
  44.         //获取地址类型Label  
  45.         NSString* addressLabel = (NSString*)ABMultiValueCopyLabelAtIndex(address, j);  
  46.         //获取該label下的地址6属性  
  47.         NSDictionary* personaddress =(NSDictionary*) ABMultiValueCopyValueAtIndex(address, j);  
  48.         NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];  
  49.         NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];  
  50.         NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];  
  51.         NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];  
  52.         NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];  
  53.         NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];  
  54.     }  
  55.       
  56.     //获取dates多值  
  57.     ABMultiValueRef dates = ABRecordCopyValue(person, kABPersonDateProperty);  
  58.     int datescount = ABMultiValueGetCount(dates);  
  59.     for (int k = 0; k < datescount; k++)  
  60.     {  
  61.         //获取dates Label  
  62.         NSString* datesLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(dates, k));  
  63.         //获取dates值  
  64.         NSString* datesContent = (NSString*)ABMultiValueCopyValueAtIndex(dates, k);  
  65.     }  
  66.     //获取kind值  
  67.     CFNumberRef recordType = ABRecordCopyValue(person, kABPersonKindProperty);  
  68.     if (recordType == kABPersonKindOrganization) {  
  69.         // it's a company  
  70.     } else {  
  71.         // it's a person, resource, or room  
  72.     }  
  73.       
  74.       
  75.     //获取IM多值  
  76.     ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty);  
  77.     for (int l = 1; l < ABMultiValueGetCount(instantMessage); l++)  
  78.     {  
  79.         //获取IM类型 Label  
  80.         NSString* instantMessageLabel = (NSString*)ABMultiValueCopyLabelAtIndex(instantMessage, l);  
  81.         //获取該label下的2属性  
  82.         NSDictionary* instantMessageContent =(NSDictionary*) ABMultiValueCopyValueAtIndex(instantMessage, l);  
  83.         NSString* username = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageUsernameKey];  
  84.         NSString* service = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageServiceKey];  
  85.     }  
  86.       
  87.     //获取电话多值  
  88.     ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);  
  89.     for (int m = 0; m<ABMultiValueGetCount(phone); m++)  
  90.     {  
  91.         //获取电话Label类型  
  92.         NSString * personPhoneLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, m));  
  93.         //获取該Label下的电话值  
  94.         NSString * personPhone = (NSString*)ABMultiValueCopyValueAtIndex(phone, m);  
  95.     }  
  96.       
  97.     //获取URL多值  
  98.     ABMultiValueRef url = ABRecordCopyValue(person, kABPersonURLProperty);  
  99.     for (int n = 0; n < ABMultiValueGetCount(url); n++)  
  100.     {  
  101.         //获取电话Label  
  102.         NSString * urlLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(url, n));  
  103.         //获取該Label下的电话值  
  104.         NSString * urlContent = (NSString*)ABMultiValueCopyValueAtIndex(url,n);  
  105.     }  
  106. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值