通讯录功能的实现

iOS 提供了对通讯录操作的组建,其中一个是直接操作通讯录,另一个是调用通讯录的 UI 组建。实现方法如下:

添加AddressBook.framework到工程中。

代码实现:

 1  -(IBAction)onClickbutton:(id)sender
2 {
3 NSMutableArray* personArray = [[[NSMutableArray alloc] init] autorelease];
4 ABAddressBookRef addressBook = ABAddressBookCreate();
5 NSString *firstName, *lastName, *fullName;
6 personArray = (NSMutableArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
7 if ([sender tag]==0) {
8
9 for (id *person in personArray)
10 {
11 firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
12 firstName = [firstName stringByAppendingFormat:@" "];
13 lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
14 fullName = [firstName stringByAppendingFormat:@"%@",lastName];
15 NSLog(@"===%@",fullName);
16 ABMultiValueRef phones = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonPhoneProperty);
17 for(int i = 0 ;i < ABMultiValueGetCount(phones); i++)
18 {
19 NSString *phone = (NSString *)ABMultiValueCopyValueAtIndex(phones, i);
20 NSLog(@"===%@",phone);
21 }
22 ABMultiValueRef mails = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonEmailProperty);
23 for(int i = 0 ;i < ABMultiValueGetCount(mails); i++)
24 {
25 NSString *mail = (NSString *)ABMultiValueCopyValueAtIndex(mails, i);
26 NSLog(@"==%@",mail);
27 }
28 }
29 }else {
30 //删除信息
31 //返回所有联系人到一个数组中
32 CFArrayRef personArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
33 CFIndex personCount = ABAddressBookGetPersonCount(addressBook);
34 for (int i =0;i<personCount;i++){
35 ABRecordRef ref = CFArrayGetValueAtIndex(personArray, i);
36 CFStringRef firstName1 = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
37 CFStringRef lastName1 = ABRecordCopyValue(ref, kABPersonLastNameProperty);
38 NSString *contactFirstLast = [NSString stringWithFormat: @"%@%@", (NSString *)firstName1,(NSString *)lastName1];
39 if ([contactFirstLast isEqualToString:@"徐梦"]) {
40 //删除联系人
41 ABAddressBookRemoveRecord(addressBook, ref, nil);
42 }
43 }
44 //保存电话本
45 ABAddressBookSave(addressBook, nil);
46 //释放内存
47 //CFRelease(personRef);
48 // CFRelease(addressbookRef);
49 }
50 }

完整实现(一个项目要求app能读取手机的通讯录)

其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的。幸好ios6.0 以后给了个权限控制。当打开app的时候你可以选择拒绝。
 
 

实现方法:

  1 //读取所有联系人
2
3 -(void)ReadAllPeoples
4
5 {
6
7 //取得本地通信录名柄
8
9 ABAddressBookRef tmpAddressBook = nil;
10
11 if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {
12 tmpAddressBook=ABAddressBookCreateWithOptions(NULL, NULL);
13 dispatch_semaphore_t sema=dispatch_semaphore_create(0);
14 ABAddressBookRequestAccessWithCompletion(tmpAddressBook, ^(bool greanted, CFErrorRef error){
15 dispatch_semaphore_signal(sema);
16 });
17
18 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
19 dispatch_release(sema);
20 }
21 else
22 {
23 tmpAddressBook =ABAddressBookCreate();
24 }
25 //取得本地所有联系人记录
26
27
28 if (tmpAddressBook==nil) {
29 return ;
30 };
31 NSArray* tmpPeoples = (NSArray*)ABAddressBookCopyArrayOfAllPeople(tmpAddressBook);
32
33 for(id tmpPerson in tmpPeoples)
34
35 {
36
37 //获取的联系人单一属性:First name
38
39 NSString* tmpFirstName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonFirstNameProperty);
40
41 NSLog(@"First name:%@", tmpFirstName);
42
43 [tmpFirstName release];
44
45 //获取的联系人单一属性:Last name
46
47 NSString* tmpLastName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonLastNameProperty);
48
49 NSLog(@"Last name:%@", tmpLastName);
50
51 [tmpLastName release];
52
53 //获取的联系人单一属性:Nickname
54
55 NSString* tmpNickname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNicknameProperty);
56
57 NSLog(@"Nickname:%@", tmpNickname);
58
59 [tmpNickname release];
60
61 //获取的联系人单一属性:Company name
62
63 NSString* tmpCompanyname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonOrganizationProperty);
64
65 NSLog(@"Company name:%@", tmpCompanyname);
66
67 [tmpCompanyname release];
68
69 //获取的联系人单一属性:Job Title
70
71 NSString* tmpJobTitle= (NSString*)ABRecordCopyValue(tmpPerson, kABPersonJobTitleProperty);
72
73 NSLog(@"Job Title:%@", tmpJobTitle);
74
75 [tmpJobTitle release];
76
77 //获取的联系人单一属性:Department name
78
79 NSString* tmpDepartmentName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonDepartmentProperty);
80
81 NSLog(@"Department name:%@", tmpDepartmentName);
82
83 [tmpDepartmentName release];
84
85 //获取的联系人单一属性:Email(s)
86
87 ABMultiValueRef tmpEmails = ABRecordCopyValue(tmpPerson, kABPersonEmailProperty);
88
89 for(NSInteger j = 0; ABMultiValueGetCount(tmpEmails); j++)
90
91 {
92
93 NSString* tmpEmailIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpEmails, j);
94
95 NSLog(@"Emails%d:%@", j, tmpEmailIndex);
96
97 [tmpEmailIndex release];
98
99 }
100
101 CFRelease(tmpEmails);
102
103 //获取的联系人单一属性:Birthday
104
105 NSDate* tmpBirthday = (NSDate*)ABRecordCopyValue(tmpPerson, kABPersonBirthdayProperty);
106
107 NSLog(@"Birthday:%@", tmpBirthday);
108
109 [tmpBirthday release];
110
111 //获取的联系人单一属性:Note
112
113 NSString* tmpNote = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNoteProperty);
114
115 NSLog(@"Note:%@", tmpNote);
116
117 [tmpNote release];
118
119 //获取的联系人单一属性:Generic phone number
120
121 ABMultiValueRef tmpPhones = ABRecordCopyValue(tmpPerson, kABPersonPhoneProperty);
122
123 for(NSInteger j = 0; j < ABMultiValueGetCount(tmpPhones); j++)
124
125 {
126
127 NSString* tmpPhoneIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpPhones, j);
128
129 NSLog(@"tmpPhoneIndex%d:%@", j, tmpPhoneIndex);
130
131 [tmpPhoneIndex release];
132
133 }
134
135 CFRelease(tmpPhones);
136
137 }
138
139 //释放内存&nbsp;
140
141 [tmpPeoples release];
142
143 CFRelease(tmpAddressBook);
144
145 }

解释下代码:由于ios6.0系统的升级,对客户隐私有了一个较大的提示。

以前

1 tmpAddressBook =ABAddressBookCreate();这样就可以读取了,但是现在要做一个判断了。可以具体看看代码。
  1. 把通讯录取出来放在一个array里面。这样你就可以对数组进行你的要求了。
 

备注:

苹果中文语言貌似有点问题。ios6.0  会提示你的app访问日历。。。。
然后网上查了下资料。可以参照微信访问通讯录的形式,给客户一个提示
他是在plist中  添加一项在XCode里显示的是Privacy - Contacts Usage Description。后面的string就是你要想提示的文字内容
“Privacy - Location Usage Description”。这个是定位位置提示。其他类似。

备注二:

分享一个测试经验,也是从网上看到的。
一把苹果的app访问位置或者通讯录,第一次都会有一个提示让你选择。
但是第二次及以后,即时删掉,也不会再出现了。
如果想再次出现,可以  设置-通用-还原-还原位置与隐私
这样你再次点击你的app就会再次出现了。
 

iOS开发——高级技术&通讯录功能的实现的更多相关文章

  1. iOS开发——高级技术&通讯录服务

    通讯录服务 AddressBook iOS中带有一 个Contacts应用程序来管理联系人,但是有些时候我们希望自己的应用能够访问或者修改这些信息,这个时候就要用到 AddressBook.frame ...

  2. iOS开发——高级技术&广告功能的实现

    广告功能的实现 iPhone/iPad的程序,即使是Free的版本,也可以通过广告给我们带来收入.前提是你的程序足够吸引人,有足够的下载量.这里,我将介绍一下程序中集成广告的方法.主要有两种广告iAd ...

  3. iOS开发——高级技术&密码锁功能的实现

    密码锁功能的实现 一个ios手势密码功能实现 ipad/iphone 都可以用 没有使用图片,里面可以通过view自己添加 keychain做的数据持久化,利用苹果官方KeychainItemWrap ...

  4. iOS开发——高级技术&支付宝功能的实现

    支付宝功能的实现   现在不少app内都集成了支付宝功能 使用支付宝进行一个完整的支付功能,大致有以下步骤: 1>先与支付宝签约,获得商户ID(partner)和账号ID(seller) (这个 ...

  5. iOS开发——高级技术&摇一摇功能的实现

    摇一摇功能的实现 在AppStore中多样化功能越来越多的被使用了,所以今天就开始介绍一些iOS开发的比较实用,但是我们接触的比较少的功能,我们先从摇一摇功能开始 在 UIResponder中存在这么 ...

  6. iOS开发——高级技术OC篇&运行时(Runtime)机制

    运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...

  7. iOS开发——高级技术精选OC篇&Runtime之字典转模型实战

    Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://w ...

  8. iOS开发——高级技术&广告服务

    广告服务 上 面也提到做iOS开发另一收益来源就是广告,在iOS上有很多广告服务可以集成,使用比较多的就是苹果的iAd.谷歌的Admob,下面简单演示一下如何 使用iAd来集成广告.使用iAd集成广告 ...

  9. iOS开发——高级技术&内购服务

    内购服务 大家都知道做iOS开发本身的收入有三种来源:出售应用.内购和广告.国内用户通常很少直接 购买应用,因此对于开发者而言(特别是个人开发者),内购和广告收入就成了主要的收入来源.内购营销模式,通 ...

随机推荐

  1. Cadence16.6安装破解

    1.软件安装 1.运行stepup.exe.出现下面界面后开始安装License manager和project installation. 注意:只安装第一项License manager和第二项p ...

  2. win7 64位 mongodb2.6.0 安装服务启动

    Workaround to install as a service You can manually install 2.6.0 as a service on Windows from an Ad ...

  3. Python:生成器

    生成器:使用了 yield 的函数被称为生成器(generator).它记住上一次返回时在函数体中的位置. yeild运行过程:当你向生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器 ...

  4. Android学习之 Intent详解

    一. Intent 作用 Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯.比如说调用startActivity()来 ...

  5. OA项目之导入

    内容显示页: protected void btnIMP_Click(object sender, EventArgs e)         {             Response.Redire ...

  6. 复利test

    因为上节课老师有给我们讲了单元测试的概念及其基本操作,我就对我之前的复利计算器进行了改进和测试.因为从控制台的简单输入输出对单元测试来说不够完善,便参考了其他同学的优秀编程又重新写了一个复利计算器的框 ...

  7. 【转】Linux下查看文件和文件夹大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    du可以查看文件及文件夹的大小. ...

  8. EF 实践

    一.CodeFirst 1.新建MVCEFManger(业务层)项目 在该项目下引入entityframework 安装包(用来生成数据库或者实体) PM> install-package en ...

  9. php array转json、xml

    class Encode{ public static function jsonEncode($code,$message,$data){ $result = array( 'code' => ...

  10. 去哪儿网mysql语法审核工具Inception正式开源

    Inception不仅仅是一个自动化审核工具,同时还具备执行SQL,并且生成对影响数据的回滚语句(类似于闪回的功能),这样一条龙便捷服务的工具.