通讯录

【链接】CNContact对通讯录的基本使用(第二篇)
http://www.cnblogs.com/lantu1989/p/5469346.html

**
 *  注意:iOS9才有能使用
 *  首先在工程里导入ContactsUI.framework和Contacts.framework两个框架
 *
 *
 *   源代码的链接地址
 *   链接: http://pan.baidu.com/s/1jHDsvGU 密码: 7tfj
 */
#import "RootViewController.h"
#import <Contacts/Contacts.h>
#import <ContactsUI/ContactsUI.h>
@interface RootViewController ()<CNContactPickerDelegate>
{
    UITableView *_contactTableView;
    NSMutableArray *data;
}
@end
@implementation RootViewController
- (void)loadView{
    [super loadView];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 100, 120, 60);
    [button setTitle:@"显示联系人" forState:0];
    [button setTitleColor:[UIColor cyanColor] forState:0];
    [button addTarget:self action:@selector(showContact:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
}
- (void)viewDidLoad {
    [super viewDidLoad];
//    CNMutableContact *contact = [self initializeContact];
    
    //添加联系人
//    [self addContact:contact];
    // 查询
//    NSArray *arr = [self queryContactWithName:@"雨路"];
    //将不可变的CNContact转成CNMutableContact,便可执行以下操作
//    CNMutableContact *contact = [arr[1] mutableCopy];
    // 更新
//    contact.givenName = @"LF";
//    [self updateContact:contact];
    // 删除
//    [self deleteContact:contact];
    //添加群组
//    [self addGroupWithName:@"friend"];
    
//    NSArray *array = [self queryGroup];
//    NSLog(@"==%@",array);
    // 删除group操作
//    CNMutableGroup *group = [array[3] mutableCopy];
//    [self deleteWithGroup:group];
    
    // 更新group
//    CNMutableGroup *group = [array[3] mutableCopy];
//    group.name = @"i need you";
//    [self updateGroup:group];
    
    // 向group添加成员
//    NSArray *results = [self queryContactWithName:@"甘"];
//    CNGroup *group = array[3];
//    [self addMemberWithContact:results[0] toGroup:group];
    
    
    // 在group里删除成员
//    NSArray *results = [self queryContactWithName:@"甘"];
//    CNGroup *group = array[3];
//    [self deleteMemberWithContact:results[0] toGroup:group];
}
/**
 *  在group里删除成员
 *
 *  @param contact 被删除的联系人
 *  @param group   在该group里删除联系人
 */
- (void)deleteMemberWithContact:(CNContact *)contact toGroup:(CNGroup *)group{
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest removeMember:contact fromGroup:group];
    // 写入
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
    
}
/**
 *  向group添加成员
 *
 *  @param contact 被添加的联系人
 *  @param group   添加到该group
 */
- (void)addMemberWithContact:(CNContact *)contact toGroup:(CNGroup *)group{
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest addMember:contact toGroup:group];
    // 写入
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}
/**
 *  更新group
 *
 *  @param group 被更新的group
 */
- (void)updateGroup:(CNMutableGroup *)group{
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest updateGroup:group];
    // 写入
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}
/**
 *  删除group操作
 *
 *  @param group 被删除的group
 */
- (void)deleteWithGroup:(CNMutableGroup *)group{
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest deleteGroup:group];
    // 写入
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}
/**
 *  查询
 *
 *  @return 返回数组
 */
- (NSArray *)queryGroup{
    CNContactStore *store = [[CNContactStore alloc] init];
    // 查询所有的group(predicate参数为空时会查询所有的group)
    NSArray *arr = [store groupsMatchingPredicate:nil error:nil];
    return arr;
}
/**
 *  添加群组
 *
 *  @param name 群组的名称
 */
- (void)addGroupWithName:(NSString *)name{
    CNMutableGroup *group = [[CNMutableGroup alloc] init];
    group.name = name;
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest addGroup:group toContainerWithIdentifier:nil];
    // 写入
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}
/**
 *  查询操作
 *
 *  @return 返回数组
 */
- (NSArray *)queryContactWithName:(NSString *)name{
    CNContactStore *store = [[CNContactStore alloc] init];
    // 检索条件
    NSPredicate *predicate = [CNContact predicateForContactsMatchingName:name];
    // 提取数据 (keysToFetch:@[CNContactGivenNameKey]是设置提取联系人的哪些数据)
    NSArray *contact = [store unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];
    return contact;
}
/**
 *  更新联系人
 *
 *  @param contact 被更新的联系人
 */
- (void)updateContact:(CNMutableContact *)contact{
    // 创建联系人请求
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest updateContact:contact];
    // 重新写入
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}
/**
 *  删除联系人
 *
 *  @param contact 被删除的联系人
 */
- (void)deleteContact:(CNMutableContact *)contact{
    // 创建联系人请求
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest deleteContact:contact];
    // 写入操作
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}
/**
 *  添加联系人
 *
 *  @param contact 联系人
 */
- (void)addContact:(CNMutableContact *)contact{
    // 创建联系人请求
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest addContact:contact toContainerWithIdentifier:nil];
    // 写入联系人
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}
/**
 *  设置联系人的基本属性
 *
 *  @return 返回联系人的对象
 */
- (CNMutableContact *)initializeContact{
    // 创建联系人对象
    CNMutableContact *contact = [[CNMutableContact alloc] init];
    // 设置联系人的头像
    contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"animal"]);
    // 设置联系人姓名
    contact.givenName = @"雨路";
    // 设置姓氏
    contact.familyName = @"甘";
    // 设置联系人邮箱
    CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"12345qq.com"];
    CNLabeledValue *workEmail = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"32467@sina.cn"];
    CNLabeledValue *otherEmail = [CNLabeledValue labeledValueWithLabel:CNLabelOther value:@"lanaj.com"];
    contact.emailAddresses = @[homeEmail,workEmail,otherEmail];
    // 设置机构名
    contact.organizationName = @"互联网";
    // 设置部门
    contact.departmentName = @"物流";
    // 设置工作的名称
    contact.jobTitle = @"ios";
    // 设置社会的简述
    CNSocialProfile *profile = [[CNSocialProfile alloc] initWithUrlString:@"12306.cn" username:@"lily" userIdentifier:nil service:@"IT行业"];
    CNLabeledValue *socialProfile = [CNLabeledValue labeledValueWithLabel:CNSocialProfileServiceGameCenter value:profile];
    contact.socialProfiles = @[socialProfile];
    // 设置电话号码
    CNPhoneNumber *mobileNumber = [[CNPhoneNumber alloc] initWithStringValue:@"15201596724"];
    CNLabeledValue *mobilePhone = [[CNLabeledValue alloc] initWithLabel:CNLabelPhoneNumberMobile value:mobileNumber];
    contact.phoneNumbers = @[mobilePhone];
    // 设置与联系人的关系
    CNContactRelation *friend = [[CNContactRelation alloc] initWithName:@"好朋友"];
    CNLabeledValue *relation = [CNLabeledValue labeledValueWithLabel:CNLabelContactRelationFriend value:friend];
    contact.contactRelations = @[relation];
    // 设置生日
    NSDateComponents *birthday = [[NSDateComponents alloc] init];
    birthday.day = 6;
    birthday.month = 5;
    birthday.year = 2000;
    contact.birthday = birthday;
    
    return contact;
}
/**
 *  显示联系人
 */
- (void)showContact:(UIButton *)sender{
    // 初始化CNContactPickerViewController
    CNContactPickerViewController *contactPickerViewController = [[CNContactPickerViewController alloc] init];
    // 设置代理
    contactPickerViewController.delegate = self;
    // 显示联系人窗口视图
    [self presentViewController:contactPickerViewController animated:YES completion:nil];
}
#pragma mark -- CNContactPickerDelegate 代理 --
/**
 *  点击联系人控制器的Cancel按钮执行该方法
 *
 *  @param picker 联系人控制器
 */
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
    NSLog(@"取消");
}
/**
 *  选中联系人时执行该方法
 *
 *  @param picker  联系人控制器
 *  @param contact 联系人
 */
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{
    NSLog(@"联系人的资料:%@",contact);
    [self dismissViewControllerAnimated:YES completion:nil];
    //显示联系人详细页面
    CNContactViewController *contactVC = [CNContactViewController viewControllerForContact:contact];
    [self presentViewController:contactVC animated:YES completion:nil];
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,263评论 25 707
  • 在此特此声明:一下所有链接均来自互联网,在此记录下我的查阅学习历程,感谢各位原创作者的无私奉献 ! 技术一点一点积...
    远航的移动开发历程阅读 11,069评论 12 197
  • 晚自习下后,我独自走在小路上,夜深人静,如水的月光静静地洒在地上,树上,然后又悄悄的漫进屋里,使这个寂寞的秋夜,变...
    李科杰阅读 116评论 0 1
  • #事情太多了,精力体力还有脑子完全都跟不上,怎么破? #作为春节假期作息紊乱症的轻度患者,我昨天睡得很晚,今天早晨...
    无限爸爸阅读 258评论 3 1
  • 阴云密布有几日 始终未见滴雨下 昨夜雷公终梦醒 一夜狂飙未见停 不愿雷大雨点小 故憋三日下场大 为人成长也如是 厚...
    一往直前阅读 159评论 0 1