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()
    }
}

Swift - 访问通讯录联系人(使用纯代码实现)的更多相关文章

  1. Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)

    1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...

  2. Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现

    1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...

  3. iOS访问通讯录开发-读取联系人信息

    读取通信录中的联系人一般的过程是先查找联系人记录,然后再访问记录的属性,属性又可以分为单值属性和多值属性.通过下面例子介绍联系人的查询,以及单值属性和多值属性的访问,还有读取联系人中的图片数据. 本案 ...

  4. swift 之 纯代码创建 cell

    初学swift 但是网上只有很多swift用xib创建的cell,就算是有也不是我想要的.今天自己弄了一个不用xib纯代码写的,来上代码 博客地址: https://github.com/liguol ...

  5. swift 纯代码自定义控件

    1.创建自定义控件 import UIKit class CustomView: UIView { var lab:UILabel! var btn:UIButton! /************ 将 ...

  6. Android软件开发之获取通讯录联系人信息

    Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来. 这一篇文章我主要带领同学们熟悉Android的通讯录机制. 图中选中 ...

  7. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  8. 【iOS开发】多屏尺的自动适配 AutoLayout (纯代码方式)

    关于AutoLayout,最早从iOS6开始引入使用.   主要功能是使用约束,对视图进行相对布局,以适应不同屏尺的变换.   网上大量的资料都在介绍xib和storyboard,如何使用AutoLa ...

  9. IOS之UI--小实例项目--添加商品和商品名(纯代码终结版)

    前言:这个小实例项目是完完全全以MJ视频传授的优化方案一步一个思路从零开始敲出代码的,而且每一步都有思路,都有逻辑所以然.敲代码讲究思路,我个人不建议记忆太多东西,反正我记性很差的. 小贴士:文章末尾 ...

随机推荐

  1. DropDownList SelectedIndexChanged使用

    在asp.net中使用dropdownlist,默认是不会送的,我们想要选中一项然后更改相关的数据,应该吧属性AutoPostback改为true. http://msdn.microsoft.com ...

  2. 顺序队列之C++实现

    下面介绍下用C++实现的顺序队列,在VC6下调试通过. 1.文件组织形式 2.sq.h顺序队列类的说明 #ifndef _SQ_H_ #define _SQ_H_ typedef int dataTy ...

  3. poj 3295 Tautology(栈)

    题目链接:http://poj.org/problem?id=3295 思路分析:判断逻辑表达式是否为永真式问题.根据该表达式的特点,逻辑词在逻辑变量前,类似于后缀表达式求值问题. 算法中使用两个栈, ...

  4. 国际名品SYSTEM入驻北京金融街购物中心__购物败家_YOKA时尚网

    国际名品SYSTEM入驻北京金融街购物中心__购物败家_YOKA时尚网 国际名品SYSTEM入驻北京金融街购物中心

  5. Linux多线程编程(一)---多线程基本编程

    线程概念 线程是指运行中的程序的调度单位.一个线程指的是进程中一个单一顺序的控制流,也被称为轻量级线程.它是系统独立调度和分配的基本单位.同一进程中的多个线程将共享该系统中的全部系统资源,比如文件描述 ...

  6. Android -- BroadCastReceiver的简单使用

    //首先新建一个继承自BroadcastReceiver的广播监听类 class StartActiviryReceiver extends BroadcastReceiver { public fi ...

  7. 如何安装系统认证签名过的APK

    如果你的App因为权限原因需要设置 android:sharedUserId="android.uid.system" 那么IDE编译出的包通常是无法直接安装的,查看控制台会发现报 ...

  8. 配置SecureCRT连接Linux CentOS

    链接地址:http://f.dataguru.cn/thread-144513-1-1.html 环境:Linux:centos5.8虚拟机:VirtualBox本机:windows至于怎么安装Cen ...

  9. VS 2013上Python的配置

    最近有点不务正业,去看了下Python (主要是学校OJ有这个语言,然后可以轻松解决大数据问题,不要说我太坑~~~) 目前感觉python和matlab有些类似,缺少了变量类型声明,总感觉自己写出来的 ...

  10. POJ 3384 Feng Shui 凸包直径 + 半平面交

    G++一直没有过了 换成 C++果断A掉了...It's time to bet RP. 题意:给一个多边形,然后放进去两个圆,让两个圆的覆盖面积尽量最大,输出两个圆心的坐标. 思路:将多边形的边向里 ...