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. asp.net判断用户是否登录

    最简单的代码: if(Session["LoginUser"] == null)  //注意:Session["LoginUser"]后面,没有ToString ...

  2. ThinkPHP 3.1.2 模板中的基本语法<2>

    本节课大纲: 一.导入CSS和JS文件 1.css link js scr <link rel='stylesheet' type='text/css' href='__PUBLIC__/Css ...

  3. 51cto培训课程

    课程: 云计算: OpenStack | 虚拟化 | 云平台 | Office 365 | 云服务 | Docker | 其他 大数据: Spark | Hadoop | Storm | Hive | ...

  4. MFC内部结构剖析

    //////////////////////////////////////////////////////////////////////////////////////////MFC程序的执行顺序 ...

  5. BZOJ 1603: [Usaco2008 Oct]打谷机

    题目 1603: [Usaco2008 Oct]打谷机 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John有一个过时的打谷机( ...

  6. unity学习中经常要碰到的几种数据结构

    常碰到的几种数据结构:1.Array,2.ArrayList,3.List<T>,4.LinkedList<T>,5.Queue<T>,6.Stack<T&g ...

  7. D - 二叉树遍历(推荐)

    二叉树遍历问题 Description   Tree Recovery Little Valentine liked playing with binary trees very much. Her ...

  8. 开源网络库的分析libev libevent nginx ....

    最经看关于网络编程的一些书,对于网络编程中的一些基本东西,开源库已经封装的很好了,但是库归根结底还是使用的基本API,所以就想着分析一下,尤其是在看了各个库的介绍以后,所以这段时间想在这个方向投入一点 ...

  9. java:转换时间格式为String

    SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date curDate = new ...

  10. postgresql 忘记 postgres 密码

    参考博文: 如何重置postgresql用户密码 解决方法: 1.关闭数据库服务 2.进入数据库的工作空间目录 (如果是建库是没有另外指定,应该就是postgresql安装目录下的 data 目录) ...