当前位置:编程学习 > wap >>

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

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

 

1

本案例是从iOS设备上读取通讯录中的联系人,并将其显示在一个表视图中,可以进行查询,点击联系人进入详细信息画面。访问通讯录的应用必须要做的两件事情:

1、添加AddressBook和AddressBookUI框架

为工程添加AddressBook.framework和AddressBookUI.framework

 

2

2、引入头文件

在需要访问通讯录类的头文件中引入下面头文件:

#import <AddressBook/AddressBook.h>

#import <AddressBookUI/AddressBookUI.h>

查询联系人记录
在从通信录数据库查询联系人数据是无法使用SQL语句,只能通过ABAddressBookCopyArrayOfAllPeople和ABAddressBookCopyPeopleWithName函数获得,它们的定义如下:

[cpp]  FArrayRef ABAddressBookCopyArrayOfAllPeople ( 
 
ABAddressBookRef addressBook 
 
); 
 
CFArrayRef ABAddressBookCopyPeopleWithName ( 
 
ABAddressBookRef addressBook, 
 
CFStringRef name 
 
); 

CFArrayRef ABAddressBookCopyArrayOfAllPeople (

ABAddressBookRef addressBook

);

CFArrayRef ABAddressBookCopyPeopleWithName (

ABAddressBookRef addressBook,

CFStringRef name

);


ABAddressBookCopyArrayOfAllPeople函数是查询所有的联系人数据。ABAddressBookCopyPeopleWithName函数是通过人名查询通讯录中的联系人,其中的name参数就是查询的前缀关键字。两个函数中都有addressBook参数,它是我们要查询的通讯录对象,其创建使用ABAddressBookCreateWithOptions函数(在iOS6之前是ABAddressBookCreate函数),它的定义:

[cpp]  ABAddressBookRef ABAddressBookCreateWithOptions ( 
 
CFDictionaryRef options, 
 
CFErrorRef* error 
 
); 

ABAddressBookRef ABAddressBookCreateWithOptions (

CFDictionaryRef options,

CFErrorRef* error

);


options参数是保留参数,目前没有采用,使用时候可以传递NULL值。error是错误对象,包含错误信息。

下面是我们代码中有关系查询的部分,先看一下ViewController.h:

[cpp]
#import <UIKit/UIKit.h>  
 
#import <AddressBook/AddressBook.h>  
 
#import ”DetailViewController.h”  
 
@interface ViewController : UITableViewController 
 
<UISearchBarDelegate, UISearchDisplayDelegate> 
 
@property (nonatomic, strong) NSArray *listContacts; 
 
- (void)filterContentForSearchText:(NSString*)searchText; 
 
@end 

#import <UIKit/UIKit.h>

#import <AddressBook/AddressBook.h>

#import ”DetailViewController.h”

@interface ViewController : UITableViewController

<UISearchBarDelegate, UISearchDisplayDelegate>

@property (nonatomic, strong) NSArray *listContacts;

- (void)filterContentForSearchText:(NSString*)searchText;

@end


属性listContacts是装载联系人记录数组集合,filterContentForSearchText:方法是用来过滤联系人信息的方法,也就是查询方法。

ViewController.m中的viewDidLoad方法:

[cpp]
- (void)viewDidLoad 
 

 
[super viewDidLoad]; 
 
CFErrorRef error = NULL; 
 
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); ① 
 
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { ② 
 
if (granted) { 
 
//查询所有  
 
[self filterContentForSearchText:@""];  ③ 
 

 
}); 
 
CFRelease(addressBook);  ④ 
 

- (void)viewDidLoad

{

[super viewDidLoad];

CFErrorRef error = NULL;

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); ①

ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { ②

if (granted) {

//查询所有

[self filterContentForSearchText:@""];  ③

}

});

CFRelease(addressBook);  ④

}


在viewDidLoad方法中首先在第①行代码处使用ABAddressBookCreateWithOptions函数创建addressBook对象,然后在第②行又调用了函数ABAddressBookRequestAccessWithCompletion,这个函数用于向用户请求访问通讯录数据库,如果是第一次访问,则会弹出一个用户授权对话框,如果用户授权可以访问则会调用下面的代码块。

[cpp]
^(bool granted, CFErrorRef error) { 
 
if (granted) { 
 

 
}); 

^(bool granted, CFErrorRef error) {

if (granted) {

}

});


由于请求和代码块的回调都是异步的,你会发现表视图画面先出现,然后过一会儿才有查询出来的结果。在iOS6之后这个请求过程必须有的,否则无法访问通讯录数据库。

ViewController.m中的filterContentForSearchText:查询方法:

[cpp]
- (void)filterContentForSearchText:(NSString*)searchText 
 

 
//如果没有授权则退出  
 
if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) { 
 
return ; 
 

 
CFErrorRef error = NULL; 
 
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); 
 
if([searchText length]==0) 
 

 
//查询所有  
 
self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); 
 
} else { 
 
//条件查询  
 
CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText); 
 
self.listContacts = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText)); 
 
CFRelease(cfSearchText); 
 

 
[self.tableView reloadData]; 
 
CFRelease(addressBook); 
 

- (void)filterContentForSearchText:(NSString*)searchText

{

//如果没有授权则退出

if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {

return ;

}

CFErrorRef error = NULL;

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);

if([searchText length]==0)

{

//查询所有

self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));

} else {

//条件查询

CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText);

self.listContacts = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText));

CFRelease(cfSearchText);

}

[self.tableView reloadData];

CFRelease(addressBook);

}


在该方法中实现查询,ABAddressBookGetAuthorizationStatus()函数返回应用的授权状态,其中kABAuthorizationStatusAuthorized常量代表用户已经授权,在没有授权情况下该方法不进行任何处理。ABAddressBookCopyArrayOfAllPeople函数是查询所有数据,ABAddressBookCopyPeopleWithName函数是根据条件查询,返回

补充:移动开发 , IOS ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,