iOS.访问通讯录.02.写入联系人
一、创建联系人
1、创建联系人记录
ABRecord person = ABPersonCreate();
2、保存或修改单值属性
bool ABRecordSetValue(ABRecordRef record,ABPropertyID property,CFTypeRef value,CFErrorRef *error );
例子:
CFError error = NULL;// 保存姓名 ABRecordSetValue(person,kABPersonFirstNameProperty,(__bridge CFTypeRef)self.txtFirstName.text,&error);ABRecordSetValue(person,kABPersonLastNameProperty,(__bridge CFTypeRef)self.txtLastName.text,&error);
3、保存或修改多值属性
bool ABMultiValueAddValueAndLabel(ABMutableMultiValueRef multiValue,CFTypeRef value,CFStringRef label,ABMultiValueIdentifier *outIdentifier);
例:
// 创建可变多值类型对象 ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringProper); // 设置电话号码 ABMultiValueAddValueAndLabel(multi,(__bridge CFTypeRef)self.txtMobile.text,kABPersonPhoneMobileLabel,NULL); ABMultiValueAddValueAndLabel(multi,(__bridge CFTypeRef)self.txtIPhone.text,kABPersonPhoneIPhoneLabel,NULL); // 添加电话号码到记录 ABRecordSetValue(person,kABPersonPhoneProperty,multi,&error); CFRelease(multi);
4、添加记录到数据库
bool ABAddressBookAddRecord(ABAddressBookRef addressBook,ABRecordRef record,CFErrorRef *error);bool ABAddressBookSave(ABAddressBookSave addressBook,CFErrorRef *error);
例:
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL,&error);ABAddressBookAddRecord(addressBook,person,&error);ABAddressBookSave(addressBook,&error);CFRelease(person);CFRelease(addressBook);
二、修改联系人信息
1、获取联系人记录
ABRecordRef ABAddressBookGetPersonWithRecordID(ABAddressBookRef addressBook,ABRecordID recordID);
三、删除联系人信息
bool ABAddressBookRemoveRecord(ABAddressBookRef addressBook,ABRecordRef record,CFErrorRef *error);
四、实战代码
#import <UIKit/UIKit.h> #import <AddressBook/AddressBook.h> #import "T20140622161906DetailViewController.h"@interface T20140622161906ViewController : UITableViewController@property (strong,nonatomic) NSArray *listContacts;@end
#import "T20140622161906ViewController.h"@interface T20140622161906ViewController ()@end@implementation T20140622161906ViewController- (void)viewDidLoad {[super viewDidLoad];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {if (granted) {//查询所有self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));[self.tableView reloadData];CFRelease(addressBook);}}); } // 删除联系人后 重新加载列表信息 - (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:YES];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));CFRelease(addressBook);[self.tableView reloadData];} - (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated. }#pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return 1; }- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return [self.listContacts count]; }- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *CellIdentifier = @"reUseCell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];}ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]]);NSString *firstName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonFirstNameProperty));firstName = firstName != nil?firstName:@"";NSString *lastName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonLastNameProperty));lastName = lastName != nil?lastName:@"";cell.textLabel.text = [NSString stringWithFormat:@"%@ %@",firstName,lastName];CFRelease(thisPerson);return cell; }- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {if ([[segue identifier] isEqualToString:@"showDetail"]) {NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]]);T20140622161906DetailViewController *detailViewController = [segue destinationViewController];ABRecordID personID = ABRecordGetRecordID(thisPerson);NSNumber *personIDAsNumber = [NSNumber numberWithInt:personID];detailViewController.personIDAsNumber = personIDAsNumber;CFRelease(thisPerson);} } @end
#import <UIKit/UIKit.h> #import <AddressBook/AddressBook.h>@interface T20140622161906DetailViewController : UITableViewController@property (weak, nonatomic) IBOutlet UIImageView *imageView;@property (weak, nonatomic) IBOutlet UILabel *lblName; @property (weak, nonatomic) IBOutlet UITextField *txtMobile;@property (weak, nonatomic) IBOutlet UITextField *txtIPhone;@property (weak, nonatomic) IBOutlet UITextField *txtWorkEmail; @property (weak, nonatomic) IBOutlet UITextField *txtHomeEmail;@property (strong, nonatomic) NSNumber* personIDAsNumber;- (IBAction)saveClick:(id)sender; - (IBAction)deleteClick:(id)sender;@end
#import "T20140622161906DetailViewController.h"@interface T20140622161906DetailViewController ()@end@implementation T20140622161906DetailViewController- (id)initWithStyle:(UITableViewStyle)style {self = [super initWithStyle:style];if (self) {// Custom initialization }return self; }- (void)viewDidLoad {[super viewDidLoad];ABRecordID personID = [self.personIDAsNumber intValue];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID);//取得姓名属性NSString *firstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));firstName = firstName != nil?firstName:@"";NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));lastName = lastName != nil?lastName:@"";[self.lblName setText: [NSString stringWithFormat:@"%@ %@",firstName,lastName]];//取得Email属性ABMultiValueRef emailsProperty = ABRecordCopyValue(person, kABPersonEmailProperty);NSArray* emailsArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(emailsProperty));for(int index = 0; index< [emailsArray count]; index++){NSString *email = [emailsArray objectAtIndex:index];NSString *emailLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(emailsProperty, index));if ([emailLabel isEqualToString:(NSString*)kABWorkLabel]) {[self.txtWorkEmail setText:email];} else if ([emailLabel isEqualToString:(NSString*)kABHomeLabel]) {[self.txtHomeEmail setText:email];} else {NSLog(@"%@: %@", @"其它Email", email);}}CFRelease(emailsProperty);//取得电话号码属性ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);NSArray* phoneNumberArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(phoneNumberProperty));for(int index = 0; index< [phoneNumberArray count]; index++){NSString *phoneNumber = [phoneNumberArray objectAtIndex:index];NSString *phoneNumberLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phoneNumberProperty, index));if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) {[self.txtMobile setText:phoneNumber];} else if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) {[self.txtIPhone setText:phoneNumber];} else {NSLog(@"%@: %@", @"其它电话", phoneNumber);}}CFRelease(phoneNumberProperty);//取得个人图片if (ABPersonHasImageData(person)) {NSData *photoData = CFBridgingRelease(ABPersonCopyImageData(person));if(photoData){[self.imageView setImage:[UIImage imageWithData:photoData]];}}CFRelease(addressBook);}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];}- (IBAction)saveClick:(id)sender {ABRecordID personID = [self.personIDAsNumber intValue];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID);// 设置电话号码ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)self.txtMobile.text,kABPersonPhoneMobileLabel, NULL);ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)self.txtIPhone.text,kABPersonPhoneIPhoneLabel, NULL);// 添加电话号码到数据库ABRecordSetValue(person, kABPersonPhoneProperty, multi, &error);CFRelease(multi);// 设置Email属性multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)self.txtHomeEmail.text,kABHomeLabel, NULL);ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)self.txtWorkEmail.text,kABWorkLabel, NULL);// 添加Email到数据库ABRecordSetValue(person, kABPersonEmailProperty, multi, &error);CFRelease(multi);// 保存到数据库ABAddressBookSave(addressBook, &error);CFRelease(addressBook);//导航回根视图控制器ViewController [self.navigationController popToRootViewControllerAnimated:YES]; }- (IBAction)deleteClick:(id)sender {ABRecordID personID = [self.personIDAsNumber intValue];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID);//删除记录ABAddressBookRemoveRecord(addressBook,person,&error);// 保存到数据库ABAddressBookSave(addressBook, &error);CFRelease(addressBook);//导航回根视图控制器ViewController [self.navigationController popToRootViewControllerAnimated:YES];} @end
#import <UIKit/UIKit.h> #import <AddressBook/AddressBook.h>@interface T20140622161906AddViewController : UITableViewController@property (weak, nonatomic) IBOutlet UITextField *txtLastName; @property (weak, nonatomic) IBOutlet UITextField *txtFirstName;@property (weak, nonatomic) IBOutlet UITextField *txtMobile; @property (weak, nonatomic) IBOutlet UITextField *txtIPhone;@property (weak, nonatomic) IBOutlet UITextField *txtWorkEmail; @property (weak, nonatomic) IBOutlet UITextField *txtHomeEmail;- (IBAction)saveClick:(id)sender; - (IBAction)cancelClick:(id)sender;@end
#import "T20140622161906AddViewController.h"@interface T20140622161906AddViewController ()@end@implementation T20140622161906AddViewController- (id)initWithStyle:(UITableViewStyle)style {self = [super initWithStyle:style];if (self) {// Custom initialization }return self; }- (void)viewDidLoad {[super viewDidLoad];// Uncomment the following line to preserve selection between presentations.// self.clearsSelectionOnViewWillAppear = NO;// Uncomment the following line to display an Edit button in the navigation bar for this view controller.// self.navigationItem.rightBarButtonItem = self.editButtonItem; }- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated. }- (IBAction)saveClick:(id)sender {CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABRecordRef person = ABPersonCreate();//保存姓名 ABRecordSetValue(person, kABPersonFirstNameProperty,(__bridge CFTypeRef)self.txtFirstName.text, &error);ABRecordSetValue(person, kABPersonLastNameProperty,(__bridge CFTypeRef)self.txtLastName.text, &error);// 设置电话号码ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)self.txtMobile.text,kABPersonPhoneMobileLabel, NULL);ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)self.txtIPhone.text,kABPersonPhoneIPhoneLabel, NULL);// 添加电话号码到记录ABRecordSetValue(person, kABPersonPhoneProperty, multi, &error);CFRelease(multi);// 设置Email属性multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)self.txtHomeEmail.text,kABHomeLabel, NULL);ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)self.txtWorkEmail.text,kABWorkLabel, NULL);// 添加Email到记录ABRecordSetValue(person, kABPersonEmailProperty, multi, &error);CFRelease(multi);// 增加记录到数据库ABAddressBookAddRecord(addressBook, person, &error);// 保存到数据库ABAddressBookSave(addressBook, &error);CFRelease(person);CFRelease(addressBook);[self dismissViewControllerAnimated:YES completion:nil];}- (IBAction)cancelClick:(id)sender {[self dismissViewControllerAnimated:YES completion:nil]; }@end
转载于:https://www.cnblogs.com/cqchen/p/3803254.html
iOS.访问通讯录.02.写入联系人相关推荐
- iOS从通讯录中选择联系人
有时候APP需要用户输入一位联系人的姓名和电话,除了用户手动输入,一般也允许用户从通讯录中选择一位联系人(图1),下面的代码就是使用系统的<AddressBookUI/AddressBookUI ...
- Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)
1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...
- IOS如何访问通讯录
实现方法: [plain] view plaincopy //读取所有联系人 -(void)ReadAllPeoples { //取得本地通信录名柄 ABAddressBookRef tmpAddre ...
- 分享了iOS获取通讯录的4种方式
本文实例为大家分享了iOS获取通讯录的4种方式,供大家参考,具体内容如下 使用场景 一些App通过手机号码来推荐好友,如 微博.支付宝 首先客户端会获取通讯录中的所有手机号然后将这些手机号提交到App ...
- ios 绕过mfi_如何让联系人绕过iOS的免打扰模式
ios 绕过mfi Khamosh Pathak Khamosh Pathak The iPhone's Do Not Disturb feature is a great way to make s ...
- Android中访问通讯录,数据的增删改查
1.权限 <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-pe ...
- 关于iOS的通讯录开发权限的说明笔记
由于接手同事的通讯录相关模块的开发工作,涉及到通讯录权限的确认,故笔记如下:(不涉及代码实现,仅对权限作说明记录) 如下表所示,iOS关于通讯录的开发有两种方式: 由于我们采用的是第一种方式[调用的系 ...
- iOS 获取通讯录的4种方式详解
分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 使用场景 一些App通过手机号码来推荐好友,如 微博.支付宝 首先客户端会获取通讯录中的所有手机号然后将这些手机号提交到A ...
- android通讯录管理(获取联系人,通话记录,短信消息),Android通讯录管理(获取联系人、通话记录、短信消息)(二)...
Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 界面布局: /Contact_Demo/res/layout ...
最新文章
- 在Ubuntu上安装Snort入侵检测系统。
- 他22岁在家自造芯片,性能接近英特尔初代,连光刻机都有解决方案
- Exchange server 2003迁移到2010后,手动更新地址列表,提示OAB Versions无效
- Windows下Caffe的学习与应用(一)——训练自己的数据模型(GoogleNet)
- Koa -- 基于 Node.js 平台的下一代 web 开发框架
- 为什么建议学生积极参与开源项目?
- DELPHI之常用函数
- ionic 上拉加载更多
- Redis势不可挡系列之概念剖析
- Thumb指令集与ARM指令集的区别
- 毕业论文酒店管理系统java,基于J2EE酒店管理系统设计与实现
- python 多线程测试_【Python】多线程网站死链检测工具
- html网站计数器代码,如何在网站添加计数器代码
- windows 2008 server R2 服务器docker安装
- 末学者笔记--Python基础三玄
- 华为MA5300配置RADIUS认证
- 机器学习:kNN算法(一)—— 原理与代码实现(不调用库)
- 2022年的ISTQB,你考了没?
- Haproxy启动故障:Starting proxy:cannot bind socke
- 章泽天加入微软实习 网友:提升程序员整体形象