1,通讯录访问介绍
通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息。要实现访问通讯录有如下两种方式:
(1)
AddressBook.framework框架 : 没有界面,通过代码来获取所有联系人信息(本文样例使用此方式)
(2)
AddressBookUI.framework框架 : 通过系统提供的通讯录交互界面来访问
2,联系人记录的属性
在一条联系人记录中,有很多属性,而这些属性又分为单值属性和多值属性。
(1)单值属性是只有一个值的属性:
kABPersonLastNameProperty :姓
kABPersonFirstNameProperty :名
kABPersonMiddleNameProperty :中间名
kABPersonPrefixProperty :前缀
kABPersonSuffixProperty :后缀
kABPersonLastNamePhoneticProperty :姓氏汉语拼音或音标
kABPersonFirstNamePhoneticProperty :名字汉语拼音或音标
kABPersonNicknameProperty :昵称
kABPersonOrganizationProperty :公司(组织)
kABPersonJobTitleProperty :职位
kABPersonDepartmentProperty :部门
kABPersonNoteProperty :备注
(2)多值属性是包含多个值的集合类型:
kABPersonPhoneProperty :电话
kABPersonEmailProperty :Email
kABPersonAddressProperty :地址
kABPersonURLProperty : URL属性
kABPersonDateProperty :纪念日
kABPersonInstantMessageProperty :获取即时通讯(IM)
kABPersonSocialProfileProperty :社交账号
kABPersonRelatedNamesProperty :亲属关系人
3,多值属性标签的本地名称
在多值属性中包含了label(标签)、value(值)和ID等部分,其中标签和值都是可以重复的,而ID是不能重复的。
对于标签,我们可以使用ABAddressBookCopyLocalizedLabel()方法转为本地标签名(即能看得懂的标签名,比如 work、home)。要不然打印出来的是_$!<Home>!$_,_$!<Work>!$_这样的数据。
4,下面样例使用代码遍历所有的联系人,并打印输出相关属性
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()
}
}
|