Swift - 访问通讯录联系人(使用纯代码实现)
1,通讯录访问介绍
work、home)。要不然打印出来的是_$!<Home>!$_,_$!<Work>!$_这样的数据。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
import UIKitimport AddressBookimport AddressBookUIclass ViewController: UIViewController { //address Book对象,用来获取电话簿句柄 var addressBook:ABAddressBookRef? override func viewDidLoad() { super.viewDidLoad() //定义一个错误标记对象,判断是否成功 var error:Unmanaged<CFErrorRef>? addressBook = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() //发出授权信息 let sysAddressBookStatus = ABAddressBookGetAuthorizationStatus() if (sysAddressBookStatus == ABAuthorizationStatus.NotDetermined) { println("requesting access...") var errorRef:Unmanaged<CFError>? = nil //addressBook = extractABAddressBookRef(ABAddressBookCreateWithOptions(nil, &errorRef)) ABAddressBookRequestAccessWithCompletion(addressBook, { success, error in if success { //获取并遍历所有联系人记录 self.readRecords(); } else { println("error") } }) } else if (sysAddressBookStatus == ABAuthorizationStatus.Denied || sysAddressBookStatus == ABAuthorizationStatus.Restricted) { println("access denied") } else if (sysAddressBookStatus == ABAuthorizationStatus.Authorized) { println("access granted") //获取并遍历所有联系人记录 self.readRecords(); } } //获取并遍历所有联系人记录 func readRecords(){ var sysContacts:NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook) .takeRetainedValue() as NSArray for contact in sysContacts { //获取姓 var lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)? .takeRetainedValue() as! String? ?? "" println("姓:\(lastName)") //获取名 var firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)? .takeRetainedValue() as! String? ?? "" println("名:\(firstName)") //昵称 var nikeName = ABRecordCopyValue(contact, kABPersonNicknameProperty)? .takeRetainedValue() as! String? ?? "" println("昵称:\(nikeName)") //公司(组织) var organization = ABRecordCopyValue(contact, kABPersonOrganizationProperty)? .takeRetainedValue() as! String? ?? "" println("公司(组织):\(organization)") //职位 var jobTitle = ABRecordCopyValue(contact, kABPersonJobTitleProperty)? .takeRetainedValue() as! String? ?? "" println("职位:\(jobTitle)") //部门 var department = ABRecordCopyValue(contact, kABPersonDepartmentProperty)? .takeRetainedValue() as! String? ?? "" println("部门:\(department)") //备注 var note = ABRecordCopyValue(contact, kABPersonNoteProperty)? .takeRetainedValue() as! String? ?? "" println("备注:\(note)") //获取电话 var phoneValues:ABMutableMultiValueRef? = ABRecordCopyValue(contact, kABPersonPhoneProperty).takeRetainedValue() if phoneValues != nil { println("电话:") for i in 0 ..< ABMultiValueGetCount(phoneValues){ // 获得标签名 var phoneLabel = ABMultiValueCopyLabelAtIndex(phoneValues, i).takeRetainedValue() as CFStringRef; // 转为本地标签名(能看得懂的标签名,比如work、home) var localizedPhoneLabel = ABAddressBookCopyLocalizedLabel(phoneLabel) .takeRetainedValue() as! String var value = ABMultiValueCopyValueAtIndex(phoneValues, i) var phone = value.takeRetainedValue() as! String println(" \(localizedPhoneLabel):\(phone)") } } //获取Email var emailValues:ABMutableMultiValueRef? = ABRecordCopyValue(contact, kABPersonEmailProperty).takeRetainedValue() if emailValues != nil { println("Email:") for i in 0 ..< ABMultiValueGetCount(emailValues){ // 获得标签名 var label = ABMultiValueCopyLabelAtIndex(emailValues, i).takeRetainedValue() as CFStringRef; var localizedLabel = ABAddressBookCopyLocalizedLabel(label) .takeRetainedValue() as! String var value = ABMultiValueCopyValueAtIndex(emailValues, i) var email = value.takeRetainedValue() as! String println(" \(localizedLabel):\(email)") } } //获取地址 var addressValues:ABMutableMultiValueRef? = ABRecordCopyValue(contact, kABPersonAddressProperty).takeRetainedValue() if addressValues != nil { println("地址:") for i in 0 ..< ABMultiValueGetCount(addressValues){ // 获得标签名 var label = ABMultiValueCopyLabelAtIndex(addressValues, i).takeRetainedValue() as CFStringRef; var localizedLabel = ABAddressBookCopyLocalizedLabel(label) .takeRetainedValue() as! String var value = ABMultiValueCopyValueAtIndex(addressValues, i) var addrNSDict:NSMutableDictionary = value.takeRetainedValue() as! NSMutableDictionary var country:String = addrNSDict.valueForKey(kABPersonAddressCountryKey as String) as? String ?? "" var state:String = addrNSDict.valueForKey(kABPersonAddressStateKey as String) as? String ?? "" var city:String = addrNSDict.valueForKey(kABPersonAddressCityKey as String) as? String ?? "" var street:String = addrNSDict.valueForKey(kABPersonAddressStreetKey as String) as? String ?? "" var contryCode:String = addrNSDict .valueForKey(kABPersonAddressCountryCodeKey as String) as? String ?? "" print(" \(localizedLabel): Contry:\(country) State:\(state) ") println("City:\(city) Street:\(street) ContryCode:\(contryCode) ") } } //获取纪念日 var dateValues:ABMutableMultiValueRef? = ABRecordCopyValue(contact, kABPersonDateProperty).takeRetainedValue() if dateValues != nil { println("纪念日:") for i in 0 ..< ABMultiValueGetCount(dateValues){ // 获得标签名 var label = ABMultiValueCopyLabelAtIndex(emailValues, i).takeRetainedValue() as CFStringRef; var localizedLabel = ABAddressBookCopyLocalizedLabel(label) .takeRetainedValue() as! String var value = ABMultiValueCopyValueAtIndex(dateValues, i) var date = (value.takeRetainedValue() as? NSDate)?.description ?? "" println(" \(localizedLabel):\(date)") } } //获取即时通讯(IM) var imValues:ABMutableMultiValueRef? = ABRecordCopyValue(contact, kABPersonInstantMessageProperty).takeRetainedValue() if imValues != nil { println("即时通讯(IM):") for i in 0 ..< ABMultiValueGetCount(imValues){ // 获得标签名 var label = ABMultiValueCopyLabelAtIndex(imValues, i).takeRetainedValue() as CFStringRef; var localizedLabel = ABAddressBookCopyLocalizedLabel(label) .takeRetainedValue() as! String var value = ABMultiValueCopyValueAtIndex(imValues, i) var imNSDict:NSMutableDictionary = value.takeRetainedValue() as! NSMutableDictionary var serves:String = imNSDict .valueForKey(kABPersonInstantMessageServiceKey as String) as? String ?? "" var userName:String = imNSDict .valueForKey(kABPersonInstantMessageUsernameKey as String) as? String ?? "" println(" \(localizedLabel): Serves:\(serves) UserName:\(userName)") } } } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }} |
Swift - 访问通讯录联系人(使用纯代码实现)的更多相关文章
- Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)
1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...
- Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现
1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...
- iOS访问通讯录开发-读取联系人信息
读取通信录中的联系人一般的过程是先查找联系人记录,然后再访问记录的属性,属性又可以分为单值属性和多值属性.通过下面例子介绍联系人的查询,以及单值属性和多值属性的访问,还有读取联系人中的图片数据. 本案 ...
- swift 之 纯代码创建 cell
初学swift 但是网上只有很多swift用xib创建的cell,就算是有也不是我想要的.今天自己弄了一个不用xib纯代码写的,来上代码 博客地址: https://github.com/liguol ...
- swift 纯代码自定义控件
1.创建自定义控件 import UIKit class CustomView: UIView { var lab:UILabel! var btn:UIButton! /************ 将 ...
- Android软件开发之获取通讯录联系人信息
Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来. 这一篇文章我主要带领同学们熟悉Android的通讯录机制. 图中选中 ...
- IOS开发笔记 IOS如何访问通讯录
IOS开发笔记 IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...
- 【iOS开发】多屏尺的自动适配 AutoLayout (纯代码方式)
关于AutoLayout,最早从iOS6开始引入使用. 主要功能是使用约束,对视图进行相对布局,以适应不同屏尺的变换. 网上大量的资料都在介绍xib和storyboard,如何使用AutoLa ...
- IOS之UI--小实例项目--添加商品和商品名(纯代码终结版)
前言:这个小实例项目是完完全全以MJ视频传授的优化方案一步一个思路从零开始敲出代码的,而且每一步都有思路,都有逻辑所以然.敲代码讲究思路,我个人不建议记忆太多东西,反正我记性很差的. 小贴士:文章末尾 ...
随机推荐
- BitNami一键安装Redmine
1. 简单介绍 对于一个新手,假设严格依照官方文档来安装redmine,我想会"疯"掉的.有没有一种简便的方法.有滴,那就是BitNami. BitNami提供redmine的一键 ...
- c/c++内存分配方式(转)
原文链接:http://blog.csdn.net/jing0611/article/details/4030237 1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在 程序编译 ...
- ThinkPHP - 图片水印
图片添加水印 可以通过使用Image类的水印方法给图片添加水印支持,例如:water 给图片添加水印 用法 water($source, $water, $savename=null, $alph ...
- Latex(一)公式自动编号与自动引用
在进行latex引用时,有两种办法: 一,被动引用. 如有这样一段代码: $$ x^2+y^2= z^2.\eqno(1.1) $$ In this paper, we investigated (1 ...
- linux脚本:ftp自动传输文件
使用Shell脚本实现ftp的自动上传下载 http://liwenge.iteye.com/blog/566515 open 192.168.1.171 user guest 123456cd /h ...
- html5 学习笔记
一.ie8及以下对html5相关语义标签的支持 <!-[if lt IE9]> <script src="html5.js"></script> ...
- USACO Preface Numbering 构造
一开始看到这道题目的时候,感觉好难 还要算出罗马的规则. 但是仔细一看,数据规模很小, n 只给到3500 看完题目给出了几组样例之后就有感觉了 解题方法就是: n的每个十进制数 转换成相应的罗马数字 ...
- (Problem 21)Amicable numbers
Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into ...
- jquery.zclip—复制剪贴板(兼容各大浏览器)
开始前说两句 WEB开发中,要让用户复制页面中的一段代码.URL地址等信息,为了避免用户拖动鼠标再进行右键复制操作而可能出现的差错,我们可以直接在页面中放置一个复制按钮,只需要轻轻一点这个复制按钮,内 ...
- 安装Tomcat指定JDK(转)
一.应用实例 一般情况下一台服务器只跑一个业务,那么就直接配置一套环境,设置好Java环境变量即可.某些时候一台服务器上会安装多个业务,而且各个业务需要的JDK版本各不相同,或者为了使业务独立开来,需 ...