我了个去啊,写了一遍博文,上传后,不见了,不见了,不见了。。。这次就随便写写了,看代码去吧。。。

1、获取权限,网上也很多,直接copy就行了:

func initContact(){//定义一个错误标记对象,判断是否成功var error:Unmanaged<CFErrorRef>?mAddressBook = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue()//发出授权信息let sysAddressBookStatus = ABAddressBookGetAuthorizationStatus()if (sysAddressBookStatus == ABAuthorizationStatus.NotDetermined) {print("requesting access...")var errorRef:Unmanaged<CFError>? = nil//addressBook = extractABAddressBookRef(ABAddressBookCreateWithOptions(nil, &errorRef))ABAddressBookRequestAccessWithCompletion(mAddressBook, { success, error inif success {//获取并遍历所有联系人记录self.readRecords();}else {print("error")}})}else if (sysAddressBookStatus == ABAuthorizationStatus.Denied ||sysAddressBookStatus == ABAuthorizationStatus.Restricted) {print("access denied")}else if (sysAddressBookStatus == ABAuthorizationStatus.Authorized) {print("access granted")//获取并遍历所有联系人记录self.readRecords();}}

2、遍历电话本,获取联系人信息,这里用了别人的MobileAddressBook的类,存储contact信息的,包括姓名、phone、email和图片,自己写了一个swift的,添加了一些小功能,没有贴上来,反正大致功能都是有的,不要说name写得那么复杂,因为公司里的手机上存得千奇百怪。。。

这里用的ios9以前的接口,ios9以后的可以参考:https://github.com/dsxNiubility/SXEasyAddressBook

    //获取并遍历所有联系人记录func readRecords(){let sysContacts:NSArray = ABAddressBookCopyArrayOfAllPeople(mAddressBook).takeRetainedValue() as NSArrayfor contact in sysContacts {var phoneBook: MobileAddressBook? = MobileAddressBook()//获取姓
//            var contactInfo: ContactInfo? = ContactInfo()let lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as! String? ?? ""print("姓:\(lastName)")//获取名let firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as! String? ?? ""print("名:\(firstName)")var name:String? = ""if( lastName != "" && firstName != ""){name = lastName + " " + firstName}else{if( lastName != "" ){name = lastName}else{if( firstName != "" ){name = firstName}else{//获取名let middleName = ABRecordCopyValue(contact, kABPersonMiddleNameProperty)?.takeRetainedValue() as! String? ?? ""print("中间名:\(middleName)")if(middleName != ""){name = middleName}else{//昵称let nikeName = ABRecordCopyValue(contact, kABPersonNicknameProperty)?.takeRetainedValue() as! String? ?? ""print("昵称:\(nikeName)")if( nikeName != "" ){name = nikeName}else{//公司(组织)let organization = ABRecordCopyValue(contact, kABPersonOrganizationProperty)?.takeRetainedValue() as! String? ?? ""print("公司(组织):\(organization)")if( organization != "" ){name = organization}else{let jobTitle = ABRecordCopyValue(contact, kABPersonJobTitleProperty)?.takeRetainedValue() as! String? ?? ""print("职位:\(jobTitle)")if(jobTitle != ""){name = jobTitle}else{let department = ABRecordCopyValue(contact, kABPersonDepartmentProperty)?.takeRetainedValue() as! String? ?? ""print("部门:\(department)")if( department != "" ){name = department}else{let note = ABRecordCopyValue(contact, kABPersonNoteProperty)?.takeRetainedValue() as! String? ?? ""print("备注:\(note)")if( note != "" ){name = note}else{name = "#"}}}}}}}}}phoneBook!.recordID = Int(ABRecordGetRecordID(contact))phoneBook!.name = nameprint("recordID:\(phoneBook?.recordID)")//获取电话let phoneValues:ABMutableMultiValueRef? =ABRecordCopyValue(contact, kABPersonPhoneProperty).takeRetainedValue()if phoneValues != nil {phoneBook?.tel = []print("电话:")for i in 0 ..< ABMultiValueGetCount(phoneValues){// 获得标签名let phoneLabel = ABMultiValueCopyLabelAtIndex(phoneValues, i).takeRetainedValue()as CFStringRef;// 转为本地标签名(能看得懂的标签名,比如work、home)let localizedPhoneLabel = ABAddressBookCopyLocalizedLabel(phoneLabel).takeRetainedValue() as! Stringlet value = ABMultiValueCopyValueAtIndex(phoneValues, i)let phone = value.takeRetainedValue() as! Stringprint("\(localizedPhoneLabel):\(phone)")
//                    contactInfo?.setPhone("\(localizedPhoneLabel):\(phone)")phoneBook?.tel.addObject(phone)}}//获取Emaillet emailValues:ABMutableMultiValueRef? = ABRecordCopyValue(contact, kABPersonEmailProperty).takeRetainedValue()if emailValues != nil {phoneBook?.email = []print("Email:")for i in 0 ..< ABMultiValueGetCount(emailValues){// 获得标签名let label = ABMultiValueCopyLabelAtIndex(emailValues, i).takeRetainedValue()as CFStringRef;let localizedLabel = ABAddressBookCopyLocalizedLabel(label).takeRetainedValue() as! Stringlet value = ABMultiValueCopyValueAtIndex(emailValues, i)let email = value.takeRetainedValue() as! Stringprint("  \(localizedLabel):\(email)")
//                    contactInfo?.setEmail(email)phoneBook?.email.addObject(email)}}//获取地址
//            let addressValues:ABMutableMultiValueRef? =
//                ABRecordCopyValue(contact, kABPersonAddressProperty).takeRetainedValue()
//            if addressValues != nil {
//                print("地址:")
//                for i in 0 ..< ABMultiValueGetCount(addressValues){
//
//                    // 获得标签名
//                    let label = ABMultiValueCopyLabelAtIndex(addressValues, i).takeRetainedValue()
//                        as CFStringRef;
//                    let localizedLabel = ABAddressBookCopyLocalizedLabel(label)
//                        .takeRetainedValue() as! String
//
//                    let value = ABMultiValueCopyValueAtIndex(addressValues, i)
//                    let addrNSDict:NSMutableDictionary = value.takeRetainedValue()
//                        as! NSMutableDictionary
//                    let country:String = addrNSDict.valueForKey(kABPersonAddressCountryKey as String)
//                        as? String ?? ""
//                    let state:String = addrNSDict.valueForKey(kABPersonAddressStateKey as String)
//                        as? String ?? ""
//                    let city:String = addrNSDict.valueForKey(kABPersonAddressCityKey as String)
//                        as? String ?? ""
//                    let street:String = addrNSDict.valueForKey(kABPersonAddressStreetKey as String)
//                        as? String ?? ""
//                    let contryCode:String = addrNSDict
//                        .valueForKey(kABPersonAddressCountryCodeKey as String) as? String ?? ""
//                    print("  \(localizedLabel): Contry:\(country) State:\(state) ")
//                    print("City:\(city) Street:\(street) ContryCode:\(contryCode) ")
//                    contactInfo?.setAddress("\(localizedLabel): Contry:\(country) State:\(state) City:\(city) Street:\(street) ContryCode:\(contryCode) ")
//                }
//            }//获取纪念日
//            let dateValues:ABMutableMultiValueRef? =
//                ABRecordCopyValue(contact, kABPersonDateProperty).takeRetainedValue()
//            if dateValues != nil {
//                print("纪念日:")
//                for i in 0 ..< ABMultiValueGetCount(dateValues){
//
//                    // 获得标签名
//                    let label = ABMultiValueCopyLabelAtIndex(emailValues, i).takeRetainedValue()
//                        as CFStringRef;
//                    let localizedLabel = ABAddressBookCopyLocalizedLabel(label)
//                        .takeRetainedValue() as String
//
//                    let value = ABMultiValueCopyValueAtIndex(dateValues, i)
//                    let date = (value.takeRetainedValue() as? NSDate)?.description ?? ""
//                    print("  \(localizedLabel):\(date)")
//                    contactInfo?.setDate("\(localizedLabel):\(date)")
//                }
//            }//获取即时通讯(IM)
//            let imValues:ABMutableMultiValueRef? =
//                ABRecordCopyValue(contact, kABPersonInstantMessageProperty).takeRetainedValue()
//            if imValues != nil {
//                print("即时通讯(IM):")
//                for i in 0 ..< ABMultiValueGetCount(imValues){
//                    // 获得标签名
//                    let label = ABMultiValueCopyLabelAtIndex(imValues, i).takeRetainedValue()
//                        as CFStringRef;
//                    let localizedLabel = ABAddressBookCopyLocalizedLabel(label)
//                        .takeRetainedValue() as String
//
//                    let value = ABMultiValueCopyValueAtIndex(imValues, i)
//                    let imNSDict:NSMutableDictionary = value.takeRetainedValue()
//                        as! NSMutableDictionary
//                    let serves:String = imNSDict
//                        .valueForKey(kABPersonInstantMessageServiceKey as String) as? String ?? ""
//                    let userName:String = imNSDict
//                        .valueForKey(kABPersonInstantMessageUsernameKey as String) as? String ?? ""
//                    print("  \(localizedLabel): Serves:\(serves) UserName:\(userName)")
//                    contactInfo?.setIM("\(localizedLabel): Serves:\(serves) UserName:\(userName)")
//                }
//            }
//            var image: UIImage = UIImage.init(named: "contacts_head")!if(ABPersonHasImageData(contact)){let imageData: NSData? = ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail).takeRetainedValue() as? NSDataimage = UIImage.init(data: imageData!)!}
//            contactInfo?.setImage(image)phoneBook?.image = image//            mName?.addObject((contactInfo?.mName)!)
//            mContacts.append(contactInfo!)mAllContacts.addObject(phoneBook!)}print("there is \(mAllContacts.count) in book")}

3、排序,网上一搜一大把吧,不说了,demo 里有pinyin.h,pinyin.c,ChineseString.h,ChineseString.m,然后用个桥接文件就好了。里面注释掉一行去除特殊字符的,上面说了,公司存的号码千奇百怪的,不注释掉,就被删掉了,个数就不对了。

4、排序后,按name和recordID把其他信息add进去就好了

 let count: NSInteger = (sortName.count)var array: NSArray = []var i :Int = 0var j: Int = 0for(i = 0 ; i < count ; i += 1){array = (sortName.objectAtIndex(i)) as! NSArraylet arrCnt :NSInteger = array.countlet showArr:NSMutableArray = []for( j = 0 ; j < arrCnt ; j += 1 ){let tempStr: NSString = array.objectAtIndex(j) as! NSStringprint("j= \(j):\(tempStr)")for addItem in mAllContacts {let string :NSString? = addItem.nameprint("additem : \(string!)")if(string != nil && string!.isEqualToString(tempStr as String)){if mCurrentID != addItem.recordID{showArr.addObject(addItem)mCurrentID = addItem.recordIDbreak}}}}mSortName?.addObject(showArr)}

5、tableview的处理也不说了,就几点:phone的个数为多个时,只显示一个,可以多加一行显示,也可以显示成其他的随便自己处理了,还有就是点击的效果没添加

参考:

http://www.hangge.com/blog/cache/detail_789.html

http://blog.csdn.net/u011622479/article/details/51276461 这篇不错,还加了搜索功能,只是同名的不能处理,用的MobilePhoneBook类也是他的。

代码下载地址:

点击打开链接

ios自制电话本-swift相关推荐

  1. android 手机号码去重,微信电话本和qq通讯录有什么不同?微信电话本常见问题汇总...

    微信电话本可谓是QQ通讯录的全新升级产品,重新整合进微信团队后,不仅仅UI界面更加类似微信,且功能上可将联系人对应的微信头像导入通讯录中,还可以识别陌生号码,支持来电号码归属地显示等等.对很多从QQ通 ...

  2. 我为什么没有高估微信电话本?

    微信电话本推出之后,我第一时间的解读<微信电话本来了,又一次虎口夺食>受到不少人的质疑,大都认为我高估了微信能量,有捧杀之嫌.尽管评论者看好还是不看好微信对其并无多大影响,但我还是想正面回 ...

  3. 用结构体实现一个电话本

    结构体是c语言又一个存储数据的类型,那么用结构体怎么实现一个简单的可以存储1000个人信息的电话本呢?     一.首先需要定义一个结构体,包含一个人的信息(比如姓名,性别,年龄,电话,住址等等).我 ...

  4. python程序实例电话本-利用Python电话本小程序!这波操作你给几分?

    原标题:利用Python电话本小程序!这波操作你给几分? 最近比较忙,只能抽空的写写文章,其实我也是一个上班族,python完全是个人想学然后希望以后对工作有所帮助,2019年了,祝大家新年快乐. 2 ...

  5. python程序实例电话本-Python示例

    本例是Python基础示例.涉及Python基础,包括语法.字典型数据结构.类.引入库.pickle实现的存储器.异常处理等. 示例是一个电话本.可以对电话本进行增加.删除.修改.获取列表和获取单人的 ...

  6. C#中教你一步步实现一个电话本窗体程序

    场景 使用C#窗体程序实现一个电话本应用程序. 实现 新建窗体程序,PhoneBook 然后打开工具箱,拖拽一个ListView到窗体中 拖拽完成后点击右上角三角符号,编辑选项--编辑列. 点击添加, ...

  7. MTK优美代码赏析6:电话本里的快速排序和插入排序算法

    MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实 ...

  8. 单链表的应用(电话本)

    单链表 单链表的定义就不说了, 很简单, 请自行百度; 那么从今天的主题<单链表的应用>入手; 利用单链表实现电话本的模拟程序:定义单链表的数据类型,将头插法和尾插法.插入.逆置.删除.查 ...

  9. 顺序表的应用__电话本

    顺序表的建立及使用 顺序表: 就所谓的数组式操作 编程实现顺序存储结构中的基本操作的实现(电话本的建立.插入.删除.修改.逆置.查找.输出) 整个操作过于简陋, 只对上述功能做叙述, 采用结构体数组实 ...

最新文章

  1. Docker Desktop添加对Kubernetes的支持
  2. linux c 链接详解4-共享库
  3. WCF分布式开发步步为赢(0):WCF学习经验分享,如何更好地学习WCF?
  4. @Scheduled执行阻塞解决办法
  5. python数据分析知识点_Python数据分析--Pandas知识点(三)
  6. asp.net mvc使用mysql_如何使用MySQL设置ASP.NET MVC 2?
  7. 爬取网易,搜狐,凤凰和澎湃网站评论数据,正负面情感分析
  8. PageHelper测试分页插件
  9. 深圳大学计算机与软件学院自考,如何坐公交 或 地铁去深圳的深圳大学南校区计算机与软件学院自考办| Moovit...
  10. 您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX AVX2
  11. 11-新闻发布系统数据库-新闻数据操作
  12. php 长链接生成短链接
  13. Minecraft 从安装到入门
  14. MapWindow GIS二次开发
  15. python输出成绩分析代码_Python根据成绩分析系统浅析
  16. 我的世界怎么在服务器中显示键位,我的世界神奇宝贝mod怎么玩 基本键位介绍...
  17. 【转载】Java导入导出excel
  18. 文件服务器升级方案,如何进行SOLIDWORKS PDM文件服务器的升级
  19. PTA枚举和模拟类型八道题型
  20. 谷歌54亿收购Mandiant:提高自身谷歌云竞争性

热门文章

  1. FastReport_V6.X for Delphi 10.4 ,最快的报表控件上市了!
  2. 职业生涯规划之自我探索论文
  3. 智捷教育关东升老师Java视频
  4. Redis之Redis基础、环境搭建、主从切换
  5. CTF信息搜集/泄露
  6. 2019-12-24
  7. 性能测试培训总结-强大的nmon监控
  8. java毕业设计车牌信息管理系统Mybatis+系统+数据库+调试部署
  9. java好用吗_你准备好使用Java9了吗?
  10. 计算机从图灵到冯诺依曼,电脑是谁发明的 冯·诺依曼和图灵(两人都起到了重要作用)...