IOS开发笔记  IOS如何访问通讯录

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


实现方法:

[plain] view
plain
copy

  1. //读取所有联系人
  2. -(void)ReadAllPeoples
  3. {
  4. //取得本地通信录名柄
  5. ABAddressBookRef tmpAddressBook = nil;
  6. if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {
  7. tmpAddressBook=ABAddressBookCreateWithOptions(NULL, NULL);
  8. dispatch_semaphore_t sema=dispatch_semaphore_create(0);
  9. ABAddressBookRequestAccessWithCompletion(tmpAddressBook, ^(bool greanted, CFErrorRef error){
  10. dispatch_semaphore_signal(sema);
  11. });
  12. dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
  13. dispatch_release(sema);
  14. }
  15. else
  16. {
  17. tmpAddressBook =ABAddressBookCreate();
  18. }
  19. //取得本地所有联系人记录
  20. if (tmpAddressBook==nil) {
  21. return ;
  22. };
  23. NSArray* tmpPeoples = (NSArray*)ABAddressBookCopyArrayOfAllPeople(tmpAddressBook);
  24. for(id tmpPerson in tmpPeoples)
  25. {
  26. //获取的联系人单一属性:First name
  27. NSString* tmpFirstName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonFirstNameProperty);
  28. NSLog(@"First name:%@", tmpFirstName);
  29. [tmpFirstName release];
  30. //获取的联系人单一属性:Last name
  31. NSString* tmpLastName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonLastNameProperty);
  32. NSLog(@"Last name:%@", tmpLastName);
  33. [tmpLastName release];
  34. //获取的联系人单一属性:Nickname
  35. NSString* tmpNickname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNicknameProperty);
  36. NSLog(@"Nickname:%@", tmpNickname);
  37. [tmpNickname release];
  38. //获取的联系人单一属性:Company name
  39. NSString* tmpCompanyname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonOrganizationProperty);
  40. NSLog(@"Company name:%@", tmpCompanyname);
  41. [tmpCompanyname release];
  42. //获取的联系人单一属性:Job Title
  43. NSString* tmpJobTitle= (NSString*)ABRecordCopyValue(tmpPerson, kABPersonJobTitleProperty);
  44. NSLog(@"Job Title:%@", tmpJobTitle);
  45. [tmpJobTitle release];
  46. //获取的联系人单一属性:Department name
  47. NSString* tmpDepartmentName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonDepartmentProperty);
  48. NSLog(@"Department name:%@", tmpDepartmentName);
  49. [tmpDepartmentName release];
  50. //获取的联系人单一属性:Email(s)
  51. ABMultiValueRef tmpEmails = ABRecordCopyValue(tmpPerson, kABPersonEmailProperty);
  52. for(NSInteger j = 0; ABMultiValueGetCount(tmpEmails); j++)
  53. {
  54. NSString* tmpEmailIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpEmails, j);
  55. NSLog(@"Emails%d:%@", j, tmpEmailIndex);
  56. [tmpEmailIndex release];
  57. }
  58. CFRelease(tmpEmails);
  59. //获取的联系人单一属性:Birthday
  60. NSDate* tmpBirthday = (NSDate*)ABRecordCopyValue(tmpPerson, kABPersonBirthdayProperty);
  61. NSLog(@"Birthday:%@", tmpBirthday);
  62. [tmpBirthday release];
  63. //获取的联系人单一属性:Note
  64. NSString* tmpNote = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNoteProperty);
  65. NSLog(@"Note:%@", tmpNote);
  66. [tmpNote release];
  67. //获取的联系人单一属性:Generic phone number
  68. ABMultiValueRef tmpPhones = ABRecordCopyValue(tmpPerson, kABPersonPhoneProperty);
  69. for(NSInteger j = 0; j < ABMultiValueGetCount(tmpPhones); j++)
  70. {
  71. NSString* tmpPhoneIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpPhones, j);
  72. NSLog(@"tmpPhoneIndex%d:%@", j, tmpPhoneIndex);
  73. [tmpPhoneIndex release];
  74. }
  75. CFRelease(tmpPhones);
  76. }
  77. //释放内存
  78. [tmpPeoples release];
  79. CFRelease(tmpAddressBook);
  80. }

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

以前

[plain] view
plain
copy

  1. tmpAddressBook =ABAddressBookCreate();这样就可以读取了,但是现在要做一个判断了。可以具体看看代码。
[plain] view
plain
copy

  1. 把通讯录取出来放在一个array里面。这样你就可以对数组进行你的要求了。
[plain] view
plain
copy

备注:

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

备注二:

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


IOS开发笔记 IOS如何访问通讯录的更多相关文章

  1. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  2. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  3. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  4. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  5. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  6. 菜鸟手下的iOS开发笔记(swift)

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

  7. 玩转iOS开发:iOS中的GCD开发(三)

    上一章, 我们了解到了GCD里的一些队列和任务的知识, 也实践了一下, 同时我们也对主队列的一些小情况了解了一下, 比如上一章讲到的卡线程的问题, 如果没有看的朋友可以去看看玩转iOS开发:iOS中的 ...

  8. iOS开发笔记4:HTTP网络通信及网络编程

    这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的 ...

  9. iOS开发笔记5:多线程之NSThread、NSOperation及GCD

    这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方 ...

随机推荐

  1. 事件绑定之.bind()

    .bind(eventType[,eventData],handler(eventObject)) 描述:为一个元素绑定一个事件处理程序,bind()绑定方法的时候元素必须已经存在. -eventTy ...

  2. sqlserver 常用函数(转)

    1.字符串函数 : len(expression) 返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格. datalength(Char_expr) 返回字符串包含字符数,但不包含后面的 ...

  3. ODI中删除数据的处理

    ODI中删除数据的处理 一.前提知识:数据从源数据库向数据仓库抽取时,一般采用以下几种方式: 全抽取模式如果表的数据量较小,则可以采取全表抽取方式,以TRUNCATE/INSERT方式进行数据抽取. ...

  4. android process bar 几种style

    process bar 圆形style记录 1. style="?android:attr/progressBarStyleSmall" //根据主题变颜色 2. holo 主题下 ...

  5. poj 3259 (Bellman_Ford判断负环)

    题意:John的农场里n块地,m条路连接两块地,k个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己. 思路:虫洞 ...

  6. 运行预构建 Linux 映像的 Windows Azure 虚拟机中的交换空间 – 第 1 部分

    本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 随着基础结构服务(虚拟机和虚拟网络)近期在 Windows Azure 上正式发布,越来越多的企业工作负荷正在向 ...

  7. cf-A. Wet Shark and Odd and Even(水)

    A. Wet Shark and Odd and Even time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  8. android中退出当前应用程序的四种方法

    android中退出当前应用程序的四种方法 [IT168 技术]Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何 ...

  9. HTML之学习笔记(十一)其它标签

    1.下拉列表和下拉框(select标签) winform中的ComboBox和ListBox在HTML中都是<select>标签,使用option标签添加列表中的数据. 格式: <s ...

  10. NGINX 多个域名配置

    多个域名配置: 依赖于 include  这个功能会加在 这2个文件夹下的所有配置文件. 所以我们可以配置多个   conf  放置于这些文件夹中.这样就是先了多个域名配置 conf 内容大致如下 s ...