iOS开发——高级技术&通讯录功能的实现

通讯录功能的实现

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就会再次出现了。

时间: 2024-11-02 13:45:34

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

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

广告功能的实现 iPhone/iPad的程序,即使是Free的版本,也可以通过广告给我们带来收入.前提是你的程序足够吸引人,有足够的下载量.这里,我将介绍一下程序中集成广告的方法.主要有两种广告iAd和AdMob.(还有其他多种可被植入的广告SDK,这里就不都一一介绍了)一:iAd  从iOS 4开始,Apple增加了叫做 iAd 的架构,通过它我们可以在程序中提供Apple的广告服务.Apple会支付给开发者60%的广告收入.iAd Framework中有例程,我们可以下载学习.这里,把简单的

iOS开发——高级技术&amp;通讯录服务

通讯录服务 AddressBook iOS中带有一 个Contacts应用程序来管理联系人,但是有些时候我们希望自己的应用能够访问或者修改这些信息,这个时候就要用到 AddressBook.framework框架.iOS中的通讯录是存储在数据库中的,由于iOS的权限设计,开发人员是不允许直接访问通讯录数据库 的,必须依靠AddressBook提供的标准API来实现通讯录操作.通过AddressBook.framework开发者可以从底层去操作 AddressBook.framework的所有信息

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

密码锁功能的实现 一个ios手势密码功能实现 ipad/iphone 都可以用 没有使用图片,里面可以通过view自己添加 keychain做的数据持久化,利用苹果官方KeychainItemWrapper类 keychain存储的数据不会因为删除app而清除记录,请调用-(void)clear清除储存密码. 简单使用方式 下载后直接把 GesturePassword 下的GesturePassword文件丢到项目中去 在 TARGETS - Build Phases - "KeychainIt

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

摇一摇功能的实现 在AppStore中多样化功能越来越多的被使用了,所以今天就开始介绍一些iOS开发的比较实用,但是我们接触的比较少的功能,我们先从摇一摇功能开始 在 UIResponder中存在这么一套方法 1 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 2 3 - (void)motionEnded:

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

运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档. 下面就来看看什么是运行时,我们要怎么在iOS开发中去使用它. 官方介绍: 这里我们主要关注的是最后一种! 下面来看看Runtime的相关总结 #pragma mark 获取属性成员 /********************************************************

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

Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://www.cnblogs.com/iCocos/p/4676679.html http://www.cnblogs.com/iCocos/p/4725527.html 关于runtime的详细介绍及其相关的小实例 好了,这里就不多废话了,直接开干! 先来看看怎么使用Runtime给模型类赋值 iOS开发

iOS开发——高级技术&amp;签名机制

签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的认识.想了解详细内容建议大家还是去看原文好了. 下面是对此文章的理解再结合自己之前对该部分的认识写出的学习笔记.本文的前提是已经对非对称加密有了一定的了解. 一.数字签名(digital signature) 对指定信息使用哈希算法,得到一个固定长度的信息摘要,然后再使用 私钥 (注意必须是私钥)对该摘要加密

iOS开发——高级技术&amp;广告服务

广告服务 上 面也提到做iOS开发另一收益来源就是广告,在iOS上有很多广告服务可以集成,使用比较多的就是苹果的iAd.谷歌的Admob,下面简单演示一下如何 使用iAd来集成广告.使用iAd集成广告的过程比较简单,首先引入iAd.framework框架,然后创建ADBannerView来展示广告,通常 会设置ADBannerView的代理方法来监听广告点击并在广告加载失败时隐藏广告展示控件.下面的代码简单的演示了这个过程: 1 // 2 // ViewController.m 3 // kct

iOS开发——高级技术&amp;内购服务

内购服务 大家都知道做iOS开发本身的收入有三种来源:出售应用.内购和广告.国内用户通常很少直接 购买应用,因此对于开发者而言(特别是个人开发者),内购和广告收入就成了主要的收入来源.内购营销模式,通常软件本身是不收费的,但是要获得某些特权就 必须购买一些道具,而内购的过程是由苹果官方统一来管理的,所以和Game Center一样,在开发内购程序之前要做一些准备工作(下面的准备工作主要是针对真机的,模拟器省略Provisioning Profile配置过程): 前四步和Game Center基本