首先导入两个文件 :#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
导入两个包。
由于在ios6以后对用户信息提供了安全的保护,在获取前必须要通过用户的同意才行。。。
所以需要下面的一段代码提示用户:
addressBook = nil;
if ([[UIDevicecurrentDevice].systemVersionfloatValue] >= 6.0)
{
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意后向下执行
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_semaphore_signal(sema);
NSLog(@"这里是用户选择是否允许后的执行代码");
// [self showTongXunLu:addressBook];
});
//dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
}
else
{
addressBook = ABAddressBookCreate();
[self showTongXunLu:addressBook];
}
有两个关键的问题:1,必须把//dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);注释了。。。因为不注释的话,点击home键才显示提示,显然不符合我们的目的。
2.在NSLog(@"这里是用户选择是否允许后的执行代码");
// [self showTongXunLu:addressBook];里面的这句话,是用户点击确定后执行的方法。在这个方法里面不能写只能运行在主线程里面的控件。
因为UITextView 这个控件只能在主线程里面才能运行,,所以我又在页面上加了一个按钮。目的是避免在分支线程里面运行。。。。
下面就整个文件了。。。。
#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
@interface ViewController : UIViewController
{
ABAddressBookRef addressBook;
}
@property (retain, nonatomic) IBOutletUITextView *myTextView;
@property (retain, nonatomic) NSString *nameTel;
-(void)showTongXunLu:(ABAddressBookRef)addressBook;
@end
#import "ViewController.h"
@interfaceViewController ()
@end
@implementation ViewController
@synthesize nameTel;
- (void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.nameTel = [[NSString alloc]init];
[selfReadAllPeoples];
}
- (IBAction)showAction:(id)sender {
[selfshowTongXunLu:addressBook];
}
//读取所有联系人
-(void)ReadAllPeoples
{
addressBook = nil;
if ([[UIDevicecurrentDevice].systemVersionfloatValue] >= 6.0)
{
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意后向下执行
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_semaphore_signal(sema);
NSLog(@"这里是用户选择是否允许后的执行代码");
// [self showTongXunLu:addressBook];
});
//dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
}
else
{
addressBook = ABAddressBookCreate();
[self showTongXunLu:addressBook];
}
}
-(void)showTongXunLu:(ABAddressBookRef)addressBook{
NSArray *tmpPeoples = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
for(id tmpPerson in tmpPeoples)
{
//获取的联系人单一属性:First name
NSString* tmpFirstName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonFirstNameProperty);
NSLog(@"First name:%@", tmpFirstName);
self.nameTel = [self.nameTel stringByAppendingFormat:@"\n\n%@ ",tmpFirstName];
NSLog(@"\n==========----%@-----=============",self.nameTel);
[tmpFirstName release];
//获取的联系人单一属性:Last name
NSString* tmpLastName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonLastNameProperty);
NSLog(@"Last name:%@", tmpLastName);
self.nameTel = [self.nameTel stringByAppendingFormat:@"%@ :",tmpLastName];
[tmpLastName release];
//获取的联系人单一属性:Nickname
NSString* tmpNickname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNicknameProperty);
NSLog(@"Nickname:%@", tmpNickname);
[tmpNickname release];
//获取的联系人单一属性:Company name
NSString* tmpCompanyname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonOrganizationProperty);
NSLog(@"Company name:%@", tmpCompanyname);
[tmpCompanyname release];
//获取的联系人单一属性:Job Title
NSString* tmpJobTitle= (NSString*)ABRecordCopyValue(tmpPerson, kABPersonJobTitleProperty);
NSLog(@"Job Title:%@", tmpJobTitle);
[tmpJobTitle release];
//获取的联系人单一属性:Department name
NSString* tmpDepartmentName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonDepartmentProperty);
NSLog(@"Department name:%@", tmpDepartmentName);
[tmpDepartmentName release];
//获取的联系人单一属性:Email(s)
// ABMultiValueRef tmpEmails = ABRecordCopyValue(tmpPerson, kABPersonEmailProperty);
//
// for(NSInteger j = 0; ABMultiValueGetCount(tmpEmails); j++)
//
// {
//
// NSString* tmpEmailIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpEmails, j);
//
// NSLog(@"Emails%d:%@", j, tmpEmailIndex);
//
// [tmpEmailIndex release];
//
// }
//
// CFRelease(tmpEmails);
//获取的联系人单一属性:Birthday
NSDate* tmpBirthday = (NSDate*)ABRecordCopyValue(tmpPerson, kABPersonBirthdayProperty);
NSLog(@"Birthday:%@", tmpBirthday);
[tmpBirthday release];
//获取的联系人单一属性:Note
NSString* tmpNote = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNoteProperty);
NSLog(@"Note:%@", tmpNote);
[tmpNote release];
//获取的联系人单一属性:Generic phone number
ABMultiValueRef tmpPhones = ABRecordCopyValue(tmpPerson, kABPersonPhoneProperty);
for(NSInteger j = 0; j < ABMultiValueGetCount(tmpPhones); j++)
{
NSString* tmpPhoneIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpPhones, j);
NSLog(@"tmpPhoneIndex%d:%@", j, tmpPhoneIndex);
self.nameTel = [self.nameTel stringByAppendingFormat:@"%@",tmpPhoneIndex];
[tmpPhoneIndex release];
}
CFRelease(tmpPhones);
}
//释放内存
[tmpPeoples release];
// CFRelease(tmpPeoples);
self.myTextView.text = self.nameTel;
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)dealloc {
[_myTextViewrelease];
[super dealloc];
}
- (void)viewDidUnload {
[selfsetMyTextView:nil];
[superviewDidUnload];
}
@end