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 UIKit import AddressBook import AddressBookUI class 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视频传授的优化方案一步一个思路从零开始敲出代码的,而且每一步都有思路,都有逻辑所以然.敲代码讲究思路,我个人不建议记忆太多东西,反正我记性很差的. 小贴士:文章末尾 ...
随机推荐
- 解题报告 HDU1087 Super Jumping! Jumping! Jumping!
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9658 Accepted: ...
- vim下使用YouCompleteMe实现代码提示、补全以及跳转设置
配置YouCompleteMe 1. 安装vundle vundle是一个管理vim插件的工具,使用vundle安装YouCompleteMe比较方便. 按照作者在https://github.com ...
- css3属性——border-radius用法
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <style> ...
- c++,类的组合
1. 在A类中以B类的对象作为成员变量,称为类的组合(composition). 可以先看看这篇文章理解组合的用处: C++中组合的使用 http://blog.csdn.net/jia_xiaoxi ...
- [转]Mysql自动备份并保存近15天记录脚本
本脚本主要现实在CentOS中实现对MySQL数据库的备份和保留最近十五天的备份文件.避免太多无用陈旧的备份占用空间. #!/bin/bash id='root' #用户名 pwd='123123' ...
- spring-mvc关键点掌握 high level
在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...
- 函数嵌套 lisp表达式求值
问题 D: lisp表达式求值 时间限制: 1 Sec 内存限制: 128 MB提交: 105 解决: 43[提交][状态][讨论版] 题目描述 lisp是一种非常古老的计算机语言,是由约翰·麦卡 ...
- Week1(9月12日):很激动的第一次课
Part I:课程介绍 =========================== 1. 学时 8*16=128 2. 时间 周二1234,周五1234 3. 地点 E307 4. 考试方式 笔试+上机 ...
- ubuntu 安装python,easy_install和pip
ubuntu12.04默认安装的python为 ms@ubuntums:~$ pythonPython 2.7.3 (default, Aug 1 2012, 05:16:07) 我需要用python ...