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

iOS.访问通讯录.02.写入联系人

时间: 2024-08-12 13:50:05

iOS.访问通讯录.02.写入联系人的相关文章

iOS.访问通讯录.01.读取联系人信息

1.相关函数介绍 1.创建通讯录对象函数 ABAddressBookRef ABAddressBookCreateWithOptions( CFDictionaryRef options, CFErrorRef *error ); 例子: CFErrorRef error = NULL; ABAdressBookRef addressBook = ABAdressBookCreateWithOptions(NULL,&error); ABAddressBookRequestAccessWithC

iOS.访问通讯录.00.概述

1.移动设备上都有一个很重要的内置数据库 -- 通讯录,苹果把它扩展到了iCloud上,使苹果设备间可以共享通讯录信息. 2.在iOS上,通讯录放在SQLite3数据库中,但是应用之间不能直接访问,也就是说我们自己编写的应用不能采用数据持久化技术直接访问通讯录数据库.为了实现通讯录数据库的访问,苹果开放了一些专门的API. 3.处于安全考虑,iOS6之后的应用访问通讯录时,需要获得用户的授权,与其他应用(如定位服务授权)不同的是,通讯录对一个应用只授权一次,即便是这个应用删除后重新安装,也不必再

iOS 访问通讯录

1.构建UI 2.向用户申请通讯录的授权 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 // 请求访问通讯录的权限 6 [self requestAccessAddressBook]; 7 } 8 9 // 请求访问通讯录的权限 10 - (void)requestAccessAddressBook 11 { 12 // 创建通讯录实例对象 13 ABAddressBookRef addressbook = ABAddressBookC

iOS 修改通讯录联系人地址(address)崩溃原因分析

目前项目中需要对iOS系统通讯录进行读取,修改操作.在进行对地址修改的时候,出现了一个奇怪现象: ● 如果contact没有address字段(或者一个全新的contact),对它的address进行修改是可以成功的, ● 如果这个人有过address字段,此时对它就行修改就崩溃.控制台打出: *** -[CFString release]: message sent to deallocated instance 0x81d26f0 这应该是一个僵尸对象,重复释放某一个对象.首先我对修改通讯录

关于访问iOS系统通讯录方法。

一.在iOS中,有2个框架可以访问用户的通讯录: 1.AddressBookUI.framework>提供了系统自带联系人列表界面.联系人详情界面.添加联系人界面等.>一般用于选择联系人. 2.AddressBook.framework>纯C语言的API,仅仅是获得联系人数据.>没有提供UI界面展示,需要自己搭建联系人展示界面.>里面的数据类型大部分基于Core Foundation框架,使用较难. 二.但是从iOS6开始,需要得到用户的授权才能访问通讯录,因此在使用之前,需

Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)

1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码来获取所有联系人信息 (2)AddressBookUI.framework框架 : 通过系统提供的通讯录交互界面来访问(本文样例使用此方式) 2,联系人记录的属性 在一条联系人记录中,有很多属性,而这些属性又分为单值属性和多值属性. 单值属性是只有一个值的属性:如姓氏.名字.部门.备注等. 多值属性

Swift - 访问通讯录联系人(使用纯代码实现)

1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码来获取所有联系人信息(本文样例使用此方式) (2)AddressBookUI.framework框架 : 通过系统提供的通讯录交互界面来访问 2,联系人记录的属性 在一条联系人记录中,有很多属性,而这些属性又分为单值属性和多值属性. (1)单值属性是只有一个值的属性: kABPersonLastNa

IOS开发- 访问通讯录,并将通讯录中姓名-头像-手机号码 发给服务器

现在很多软件都会访问通讯录,并将通讯录的信息取得,发给服务器,然后服务器会返回相应电话号码的用户是否注册. 现在分享一下前两步,访问通讯录并处理通讯录的信息 1.导入框架 #import <AddressBook/AddressBook.h> 2.拥有属性 { ABAddressBookRef _book; } 以及 //联系人数组 @property (nonatomic, strong) NSMutableArray *telphoneContacts; 3.在viewDidLoad中创建

iOS获取通讯录 电话号码与姓名

// 还是导入 #import <AddressBook/AddressBook.h> - (void)fetchAddressBookBeforeIOS9{ ABAddressBookRef addressBook = ABAddressBookCreate(); //用户授权 if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {//首次访问通讯录 ABAddressBookRe