1,通讯录访问介绍

通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息。要实现访问通讯录有如下两种方式:
(1)AddressBook.framework框架 : 没有界面,通过代码来获取所有联系人信息
(2)AddressBookUI.framework框架 : 通过系统提供的通讯录交互界面来访问(本文样例使用此方式)
2,联系人记录的属性
在一条联系人记录中,有很多属性,而这些属性又分为单值属性和多值属性。
单值属性是只有一个值的属性:如姓氏、名字、部门、备注等。
多值属性是包含多个值的集合类型,如:电话号码、Email、地址等。
3,多值属性标签的本地名称
在多值属性中包含了label(标签)、value(值)和ID等部分,其中标签和值都是可以重复的,而ID是不能重复的。
对于标签,我们可以使用ABAddressBookCopyLocalizedLabel()方法转为本地标签名(即能看得懂的标签名,比如
work、home)。要不然打印出来的是_$!<Home>!$_,_$!<Work>!$_这样的数据。
4,使用通讯录交互界面样例
本文通过使用通讯录交互界面来访问联系人,并打印出选中联系人的姓名和所有电话。
(想使用代码获取联系人,或者想知道更多联系人属性如何读取可参考我另一篇文章“ Swift - 访问通讯录联系人(使用纯代码实现) ”)
5,效果图如下:
 
6,代码如下
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
import UIKit
import AddressBookUI
 
class ViewController: UIViewController ,ABPeoplePickerNavigationControllerDelegate{
     
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
         
        //弹出通讯录联系人选择界面
        var picker = ABPeoplePickerNavigationController()
        picker.peoplePickerDelegate = self
        self.presentViewController(picker, animated: true) { () -> Void in
             
        }
    }
     
    func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,
        didSelectPerson person: ABRecord!) {
        //获取姓
        var lastName = ABRecordCopyValue(person, kABPersonLastNameProperty).takeRetainedValue()
            as! String
        println("选中人的姓:\(lastName)")
         
        //获取名
        var firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue()
            as! String
        println("选中人的名:\(firstName)")
         
        //获取电话
        var phoneValues:ABMutableMultiValueRef? =
            ABRecordCopyValue(person, 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)")
            }
        }
    }
     
    func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,
        didSelectPerson person: ABRecord!, property: ABPropertyID,
        identifier: ABMultiValueIdentifier) {
         
    }
     
    //取消按钮点击
    func peoplePickerNavigationControllerDidCancel(peoplePicker: ABPeoplePickerNavigationController!) {
        //去除地址选择界面
        peoplePicker.dismissViewControllerAnimated(true, completion: { () -> Void in
             
        })
    }
     
    func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,
        shouldContinueAfterSelectingPerson person: ABRecord!) -> Bool {
        return true
    }
     
    func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,
        shouldContinueAfterSelectingPerson person: ABRecord!, property: ABPropertyID,
        identifier: ABMultiValueIdentifier) -> Bool {
        return true
    }
}

Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)的更多相关文章

  1. Swift - 访问通讯录联系人(使用纯代码实现)

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

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

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

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

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

  4. 向Android模拟器中批量导入通讯录联系人

    使用adb命令向Android模拟器中批量导入通讯录联系人的方法: 使用adb提供的命令, 可以非常方便地从PC中将通讯录批量导入android模拟器中. 首先要先准备好固定格式的vcf文件, 该文件 ...

  5. spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中 配置的Bean,充分利用了Spring ...

  6. 如何在Windows Server 2008 R2没有磁盘清理工具的情况下使用系统提供的磁盘清理工具

    今天,刚好碰到服务器C盘空间满的情况,首先处理了临时文件和有关的日志文件后空间还是不够用,我知道清理C盘的方法有很多,但今天只分享一下如何在Windows Server 2008 R2没有磁盘清理工具 ...

  7. iOS 动态下载系统提供的中文字体

    使用系统提供的中文字体,既可避免版权问题,又可以减小应用体积 #pragma mark - 判断字体是否已经被下载 - (BOOL)isFontDownLoaded:(NSString *)fontN ...

  8. iOS系统提供开发环境下命令行编译工具:xcodebuild

    iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单 ...

  9. Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 1.跳转到拨号界面,代码如下: 1)直接拨打 Intent intentPhone = new Intent ...

随机推荐

  1. cocos2dx进阶学习之CCTMXTiledMap

    继承关系 CCTMXTiledMap -> CCNode 它由CCNode派生,我们已经知道CCNode是cocos2dx的舞台对象的公共父类,所以CCTMXTiledMap也是个舞台对象 成员 ...

  2. VS2010/MFC对话框三:创建对话框类和添加控件变量

    创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是 ...

  3. C# 基础知识 (三).主子对话框数值传递

    在C# winform编程中,我们经常会遇到不同窗口间需要传递数值的问题.比如数据库的应用,主窗口填写内容num1,点击按钮,在弹出的子窗口显示对应num1值;或者在子窗口填写新注册用户名信息,在主窗 ...

  4. z-index要同级比较,absolute包含块外有overflow-hidden

    z-index只能在position属性值为relative或absolute或fixed的元素上有效. z-index只决定同一父元素中的同级子元素的堆叠顺序. position:absolute ...

  5. 字符设备驱动4: ioremap

    #define GPIO_OFT(x) ((x) - 0x56000000)#define GPFCON (*(volatile unsigned long *)(gpio_va + GPIO_OFT ...

  6. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )

    先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...

  7. BZOJ 1833: [ZJOI2010]count 数字计数( dp )

    dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 -------------------------------- ...

  8. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  9. 用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)

    Use Case: 两个程序共享同一个Configuration文件,当一个程序作出改变的时候,需要另外一个程序能够及时响应. 之前其实猜的八九不离十,估计是有一个Timer,然后定时查询Config ...

  10. yii_wiki_145_yii-cjuidialog-for-create-new-model (通过CJuiDialog来创建新的Model)

    /**** CJuiDialog for create new model http://www.yiiframework.com/wiki/145/cjuidialog-for-create-new ...