iOS:访问地址薄
地址簿的访问
- 介绍:
地址簿(Address Book)是一个共享的联系人信息数据库。任何iOS应用程序都可以使用。通过提供常用联系人信息,而不是让每一个应用程序管理独立的联系人列表,可改善用户体验。在拥有共享的地址簿后,无需在不同的应用程序中添加联系人多次,在一个应用程序中更新联系人信息后,其他所有应用程序就立刻能够使用它们。iOS通过两个框架提供了全面的地址簿数据库访问功能,分别是Address Book和Address Book UI。
Address Book UI框架是一组用户界面类,封装了Address Book框架,并向用户提供了使用联系人信息的标准方式。使用该界面可以让用户在地址簿中浏览、搜索和选择联系人,显示并编辑选定联系人的信息,以及创建新的联系人。
- 步骤:
<1>为使用框架Address Book做准备
要想显示地址簿UI和地址簿数据,必须导入框架Address Book和Address Book UI的头文件,并指出将实现协议ABPersonPickerNavigationControllerDelegate。
打开文件ViewController.h,在现有编译指令#import后面添加如下代码行:
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
接下来,修改代码@interface,在其中添加<ABPersonPickerNavigationControllerDelegate>,功能是指出我们要遵守协议ABPersonPickerNavigationControllerDelegate:
@interface ViewController:UIViewController<ABPersonPickerNavigationControllerDelegate>
<2>显示地址薄联系人选择器
当用户单击"选择一个"按钮时,应用程序需显示联系人选择器这一模态视图,它向用户提供与应用程序“通讯录”类似的界面。在文件ViewController.m的方法newBFF中,分配并初始化一个联系人选择器,将其委托设置为视图控制器(self)然后在显示。这个方法的代码如下:
//打开地址薄
- (IBAction)newBFF:(id)sender{
ABPersonPickerNavigationController *picker;
picker = [[ABPersonPickerNavigationController alloc]init];
picker.peoplePickerDelegate = self;
[self presentViewController:picker animate:YES];
}
<3>处理取消和挖掘
联系人的界面弹出后,既可以选取联系人就取消,也可以继续深究联系人的信息。这里我就只让用户选择朋友后就取消,而不希望用户继续选择或者编辑联系人属性。因此需要将委托方法peoplePickerNavigationController:peoplePicker:shouldContinueAfterSelectingPerson实现为返回NO,这是这个应用程序的核心方法。还需要让委托方法关闭联系人选择器模态视图,并将控制器交给ViewController。
但是还必须实现联系人选择器委托协议定义如下方法:
1.处理用户取消选择的情形(peoplePickerNavigationControllerDidCancel)
2.处理用户深入挖掘联系人属性的情形(peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:idnetifier)。
在文件ViewController.m中,实现方法peoplePickerNavigationControllerDidCancel,此方法用于处理用户在联系人选择器中取消选择,具体代码如下所示:
//关闭地址薄
- (void) peoplePickerNavigationControllerDidCancel:(ABPersonPickerNavigationController *)peoplePicker{
[self dissmissViewControllerAnimate:YES];
}
将方法peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:idnetifier实现返回NO,此方法用于处理用户在联系人选择器中取消选择,具体代码如下所示:
//设置不继续深挖联系人信息
-(BOOL)peoplePickerNavigationController:(ABPersonPickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef) person
property:(ABPropertyID)property idntifier:(ABMultiValueIdntifier)idntifier{
//We won't get to this delegate method
Return NO;
}
<4>选择、访问和显示联系人信息
如果用户没有取消选择,将调用委托方法peoplePickerNavigationController:peoplePicker:shouldCotinueAfterSelectingPerson,并通过一个ABRecordRef将选定联系人传递给该方法。ABRecordRef是在AddressBook框架中定义的。这里,将分别读取联系人的名字、照片、电子邮件、邮政编码这四项信息,在读取照片前需要检查联系人是否有照片。在此需要注意,返回的联系人名字和照片并非Cocoa对象(即NSString和UIImage),而是Core Foundation中的C语言数据,因此需要使用AddressBook框架中的函数ABRecordCopyValue和UIImage的方法ImageWithData进行转换。
对于电子邮件地址和邮政编码,必须处理可能返回的多个值的请情形。就这些数据而言,也将使用ABRecordCopyValue获取指向数据集的引用,再使用函数ABMultiValueGetCount来核实联系人至少有一个电子邮件地址(或邮政编码),然后使用ABMultiValueAtIndex复制第一个电子邮件地址或者邮政编码。
在文件ViewController.m中添加一个委托方法peoplePickerNavigationController:shouldContinueAfterSelectingPerson,此方法能够在用户选择联系人时做出响应,具体代码如下:
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNaivgationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
//Retrieve the friend's name from the address book person record
NSString *friendName;
NSString *friendEmail;
NSString *friendZip;
//获取联系人的姓名
friendName = (__bridge NSString *)ABRecordCopyValue(person,kABPersonFristNameProperty);
NSLog("联系人的姓名:%@",friendName);
//获取联系人邮政编码
ABMultiValueRef friendAddressSet;
NSDictionary *friendFirstAddress;
friendAddressSet = ABRecordCopyValue(person,kABPersonAddressProperty);
if(ABMultiValueGetCount(friendAddressSet)>){
friendFirstAddress = (__bridge NSDictionary *)ABRecordCopyValueAtIndex(friendAddressSet,);
friendZip = [friendFirstAddress objectForKey:"ZIP"];
NSLog("联系人邮政编码:%@",friendZip);
}
//获取联系人邮件地址
ABMultiValueRef friendEmailAddress;
friendEmailAddress = ABRecordCopyValue(person,kABPersonEmailProperty);
if(ABMultiValueGetCount(friendEmailAddress)>){
friendEmail = (__bridge NSString *)ABRecordCopyValueAtIndex(friendEmailAddress,);
NSLog("联系人邮件地址:%@",friendEmail);
}
//获取联系人的图像
if(ABPersonHasImageData(person)){
UIImage *personImage = [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageData(person)];
NSLog("联系人的图像:%@",personImage);
}
//关闭地址薄
[self dissmissViewControllerAnimate:YES];
return NO;
}
iOS:访问地址薄的更多相关文章
- ios开发——实用技术篇Swift篇&地址薄、短信、邮件
//返回按钮事件 @IBAction func backButtonClick() { self.navigationController?.popViewControllerAnimated(tru ...
- wex5 实战 省市县三级联动与地址薄同步
无论是商城,还是快递,都要用到省市县三级联动,和地址薄,今天就以实战来制作,难点有3个: 1:三级联动,有wex5组件实现,相对简单,实战里对行数据进行了拼接 2: 地址薄选项,利用inputSel ...
- springmvc__SimpleUrlHandlerMapping(对访问地址进行加工,以键值对的形式)
1.配置web.xml(这里配置url-pattern为/) <!-- 编码过滤器 --> <filter> <filter-name>characterEncod ...
- finder的隐藏文件&IOS虚拟机地址
在终端里输入下面命令即可让它们显示出来. defaults write com.apple.finder AppleShowAllFiles -bool true 如果想恢复隐藏,可以用这个命令: ...
- Qt 地址薄 (一) 界面设计
实现一个简单的地址薄,功能包括:地址的添加.浏览.编辑.查找.输出文件等. 1 界面和元素 整个地址薄界面,可视为一个 AddressBook 类.其中的 Name.Address 以及两个编辑栏, ...
- Qt 地址薄 (二) 添加地址
在上一篇 Qt 地址薄 (一) 界面设计 中,主要是实现了地址簿的界面,使用布局管理器进行元素的布局,并解释了"子类化" 和"所有权"的概念. 本篇将在上面的基 ...
- ios访问web页面<div>点击事件不起效果,以及alert()显示url的解决办法
ios访问web页面<div>点击不起效果,在其div上添加style=”cursor:pointer:“ jquery web页面动态append()事件调用方法:$(document) ...
- 阿里云使用js 实现OSS图片上传、获取OSS图片列表、获取图片外网访问地址(读写权限私有、读写权限公共);
详情请参考:https://help.aliyun.com/document_detail/32069.html?spm=a2c4g.11186623.6.763.ZgC59a 或者https://h ...
- net core体系-web应用程序-4net core2.0大白话带你入门-4asp.net core配置项目访问地址
asp.net core配置访问地址 .net core web程序,默认使用kestrel作为web服务器. 配置Kestrel Urls有四种方式,我这里只介绍一种.其它方式可自行百度. 在Pr ...
随机推荐
- HDU 1007 Quoit Design(二分+浮点数精度控制)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- 移动WEB 性能优化方案
最近一项 研究表明,80%的网民对移动端的浏览体验感到失望,同时,当体验提升时,他们会在智能手机上花费更多的时间. 这不奇怪,因为64%的智能手机用户希望网站可以在4秒内加载完毕,但一半的网站花费了二 ...
- discuz二次开发之后导航无法高亮 $mnid == $nav[navid]解决办法(转)
在 <body>前面加入如下代码:body原来就有一个class,直接在增加一个进行测试 <!--{eval $mnid = getcurrentnav()}--> <! ...
- Memcached 笔记与总结(1)Linux(CentOS 6.6) 和 Windows(7)下安装与配置 Memcached (1.4.24)与 Memcached 基础命令
Memcached 官方网站:http://memcached.org/ 官网对其的描述是: What is Memcached? Free & open source, high-perfo ...
- 提高Vector容器的删除效率
vector容器是类似与一个线性数组,索引效率高,插入,删除的效率很低,需要遍历数据列表,一般情况下vector的删除操作由一下函数完成: iterator erase(iterator positi ...
- RT-Thread信号量的基本操作
抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为 0 时,所有试图通过它的线程都将处于等待状态.在 ...
- MVC @functions
asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...
- 02/07/2106 @ 6:28am (UTC)
<?php echo pow(2,32); 4294967296 http://www.unixtimestamp.com/index.php 4294967296 Is equivalent ...
- java面试问道的
1.java可重入锁 2.Hashmap原理.说说hashMap是怎样实现的(这个之前看过,顺利回答上.还回答了多线程的问题出现的原因,面试官表示很惊讶的样.用hashmap实现hashset 3.
- http响应状态码301和302
HTTP返回码中301与302的区别 (2012-10-15 22:06:09) 一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redir ...