ios自制电话本-swift
我了个去啊,写了一遍博文,上传后,不见了,不见了,不见了。。。这次就随便写写了,看代码去吧。。。
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相关推荐
- android 手机号码去重,微信电话本和qq通讯录有什么不同?微信电话本常见问题汇总...
微信电话本可谓是QQ通讯录的全新升级产品,重新整合进微信团队后,不仅仅UI界面更加类似微信,且功能上可将联系人对应的微信头像导入通讯录中,还可以识别陌生号码,支持来电号码归属地显示等等.对很多从QQ通 ...
- 我为什么没有高估微信电话本?
微信电话本推出之后,我第一时间的解读<微信电话本来了,又一次虎口夺食>受到不少人的质疑,大都认为我高估了微信能量,有捧杀之嫌.尽管评论者看好还是不看好微信对其并无多大影响,但我还是想正面回 ...
- 用结构体实现一个电话本
结构体是c语言又一个存储数据的类型,那么用结构体怎么实现一个简单的可以存储1000个人信息的电话本呢? 一.首先需要定义一个结构体,包含一个人的信息(比如姓名,性别,年龄,电话,住址等等).我 ...
- python程序实例电话本-利用Python电话本小程序!这波操作你给几分?
原标题:利用Python电话本小程序!这波操作你给几分? 最近比较忙,只能抽空的写写文章,其实我也是一个上班族,python完全是个人想学然后希望以后对工作有所帮助,2019年了,祝大家新年快乐. 2 ...
- python程序实例电话本-Python示例
本例是Python基础示例.涉及Python基础,包括语法.字典型数据结构.类.引入库.pickle实现的存储器.异常处理等. 示例是一个电话本.可以对电话本进行增加.删除.修改.获取列表和获取单人的 ...
- C#中教你一步步实现一个电话本窗体程序
场景 使用C#窗体程序实现一个电话本应用程序. 实现 新建窗体程序,PhoneBook 然后打开工具箱,拖拽一个ListView到窗体中 拖拽完成后点击右上角三角符号,编辑选项--编辑列. 点击添加, ...
- MTK优美代码赏析6:电话本里的快速排序和插入排序算法
MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实 ...
- 单链表的应用(电话本)
单链表 单链表的定义就不说了, 很简单, 请自行百度; 那么从今天的主题<单链表的应用>入手; 利用单链表实现电话本的模拟程序:定义单链表的数据类型,将头插法和尾插法.插入.逆置.删除.查 ...
- 顺序表的应用__电话本
顺序表的建立及使用 顺序表: 就所谓的数组式操作 编程实现顺序存储结构中的基本操作的实现(电话本的建立.插入.删除.修改.逆置.查找.输出) 整个操作过于简陋, 只对上述功能做叙述, 采用结构体数组实 ...
最新文章
- Docker Desktop添加对Kubernetes的支持
- linux c 链接详解4-共享库
- WCF分布式开发步步为赢(0):WCF学习经验分享,如何更好地学习WCF?
- @Scheduled执行阻塞解决办法
- python数据分析知识点_Python数据分析--Pandas知识点(三)
- asp.net mvc使用mysql_如何使用MySQL设置ASP.NET MVC 2?
- 爬取网易,搜狐,凤凰和澎湃网站评论数据,正负面情感分析
- PageHelper测试分页插件
- 深圳大学计算机与软件学院自考,如何坐公交 或 地铁去深圳的深圳大学南校区计算机与软件学院自考办| Moovit...
- 您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX AVX2
- 11-新闻发布系统数据库-新闻数据操作
- php 长链接生成短链接
- Minecraft 从安装到入门
- MapWindow GIS二次开发
- python输出成绩分析代码_Python根据成绩分析系统浅析
- 我的世界怎么在服务器中显示键位,我的世界神奇宝贝mod怎么玩 基本键位介绍...
- 【转载】Java导入导出excel
- 文件服务器升级方案,如何进行SOLIDWORKS PDM文件服务器的升级
- PTA枚举和模拟类型八道题型
- 谷歌54亿收购Mandiant:提高自身谷歌云竞争性
热门文章
- FastReport_V6.X for Delphi 10.4 ,最快的报表控件上市了!
- 职业生涯规划之自我探索论文
- 智捷教育关东升老师Java视频
- Redis之Redis基础、环境搭建、主从切换
- CTF信息搜集/泄露
- 2019-12-24
- 性能测试培训总结-强大的nmon监控
- java毕业设计车牌信息管理系统Mybatis+系统+数据库+调试部署
- java好用吗_你准备好使用Java9了吗?
- 计算机从图灵到冯诺依曼,电脑是谁发明的 冯·诺依曼和图灵(两人都起到了重要作用)...