首先导入两个文件 :#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
相关推荐
总结来说,iOS获取通讯录有两种方式:带有UI的ABPeoplePickerNavigationController/CNContactPickerViewController,适合快速集成但限制较多;无UI的CNContactStore方法则能提供更高的灵活性,适合需要自定义界面和...
总的来说,iOS获取通讯录的过程包括请求权限、获取联系人信息以及展示这些信息。开发者需要注意尊重用户的隐私权,合理地请求和使用权限,同时提供清晰的提示和反馈。通过熟练掌握这些知识,你就能在iOS应用中实现...
本篇文章将详细介绍一种最新的、经过真机测试可用的iOS获取通讯录的方法。 首先,我们需要了解iOS系统对访问用户数据的严格控制。自iOS 6开始,苹果引入了权限管理系统,应用需要获取用户的明确授权才能访问通讯录...
本文将深入探讨如何在iOS中实现“iOS获取通讯录按字母排序索引列表”的功能,主要涉及`AddressBook`框架的使用。 首先,我们需要了解`AddressBook`框架。这是Apple提供的一个核心库,用于访问和管理设备上的联系人...
总之,iOS获取通讯录涉及到AddressBook框架、权限管理以及对联系人属性的访问。通过这些技术,开发者可以为用户提供如查看、管理通讯录等服务,但必须始终尊重并保护用户的隐私。在实际开发中,应遵守Apple的App ...
在iOS平台上,获取通讯录是开发过程中常见的需求,主要用于实现如联系人同步、备份或特定功能的个性化。本文将详细讲解如何使用Objective-C或Swift语言来获取iOS设备上的通讯录,并将单个联系人信息存储到数组中。 ...
综上所述,"ios-获取通讯录信息.zip"项目提供了一个学习和实践iOS获取通讯录信息的平台。通过分析和运行该项目,开发者能够了解并掌握iOS系统功能中关于访问通讯录的核心知识点,进一步提升自己的iOS开发技能。
例如,在Android中,通过调用`uni.getContact`方法并监听返回的联系人列表来获取通讯录;在iOS中,需使用`uni.authorize`获取权限,然后调用`uni.chooseAddress`获取联系人信息。需要注意的是,由于隐私保护政策,...
在iOS开发中,获取用户设备上的通讯录信息是一项常见的需求,比如为了推荐好友或同步联系人数据。本文将详细介绍四种不同的方法来实现这一功能,针对不同的iOS版本和使用场景。 ### 方案一:AddressBookUI....
这个Demo项目“iOS9 通讯录新框架Demo”旨在演示如何利用这个新框架进行实际开发操作。让我们深入探讨一下这个框架的关键知识点。 首先,我们要了解Contacts框架的基础结构。Contacts框架主要包括以下几个核心类: ...
在iOS平台上,获取通讯录是开发过程中常见的需求,主要用于实现联系人管理、社交应用等功能。本文将详细探讨两种主流的获取iOS设备通讯录的方式,并强调它们的兼容性。 第一种方式是使用`Contacts Framework`。从...
2024最新获取通讯录和短信系统源码 开发仅供测试研究使用,请勿非法使用!!!! 拥有自由操作度最好的后台,APP前端样式一键修改。 去除过多授权提醒,提高用户信息获取率。 优化业务系统后台管理员与代理的...
ios 操作通讯录联系人demo大全
本教程将基于提供的"ios-获取通讯录列表.zip"压缩包,深入讲解如何在iOS应用中请求用户权限并获取其通讯录列表。该示例项目"LXAddressBookDemo"是一个GitHub上的开源代码库,它演示了这一过程。 首先,我们需要了解...
二、iOS 获取通讯录 1. **权限请求**:在iOS中,访问通讯录需要用户授权。使用`CNContactStore`类的`requestAccess(for:)`方法请求权限。 ```swift let store = CNContactStore() store.requestAccess(for: ....
// 用户已授权,可以开始获取通讯录 } else { // 用户未授权,展示错误或提示信息 } } ``` 当获取到权限后,你可以创建一个`CNContactStore`实例,用于执行查询和操作。通过这个实例,你可以使用`...
最近学习了iOS获取手机通讯录方式方法,现在分享给大家。希望此文章对各位有所帮助。 一、iOS 9 以前的通讯录框架 AddressBookUI框架:提供了联系人列表界面、联系人详情界面、添加联系人界面等,一般用于选择联系...
【标题】:“双端完美获取通讯录系统源码”指的是一个设计用于在不同终端上(如iOS和Android)高效、完整地获取并管理用户通讯录的软件系统。这个系统的核心功能在于提供跨平台的支持,使得用户能够在手机或电脑等...
在iOS开发中,通讯录是应用常常需要交互的重要部分,特别是在个人信息管理或者社交类应用中。这个名为"ios-通讯录.zip"的压缩包显然包含了关于如何在iOS应用中自定义头像并修改通讯录内容的示例代码或资源。让我们...