ios 关于手机通讯录

本文深入探讨了苹果SDK中用于管理通讯录的AddressBook和AddressBookUI框架,包括如何通过这些框架获取联系人信息、权限请求流程及与调用相机相似的实现方式。详细介绍了关键API的使用、内存管理与数据获取流程,以及如何通过AddressBookUI框架展示、选择或创建联系人。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在SDK中,apple提供了两个框架AddressBook和AddressBookUI两个框架,不同的框架也做不同的处理,
1,AddressBook框架
在我们的App中需要使用获取手机通讯录的了联系人信息时,就需要使用这个框架,这个框架基于C语言开发的,因此里面的许多变量类型都是C中的。文档中也定义了很多方法,在这里我只说一下获取联系人
与绘图类似,首先创建一个类似上下文的实例,

ABAddressBookCreateWithOptions是6.0以后的方法,ABAddressBookCreate是6.0之前的方法,所以这里需要单独判断一下,

 

-(NSArray *)getAddressBook

{

    @autoreleasepool {

    //获得本地通讯录句柄--上下文

    ABAddressBookRef ref=nil;

    int systemVersion=[[[UIDevice currentDevice] systemVersion] intValue];

    if (systemVersion>=6.0) {//6.0以上的

        ref=ABAddressBookCreateWithOptions(NULL, NULL);

        //请求用户是否可以使用通讯录

        dispatch_semaphore_t sem=dispatch_semaphore_create(0);

        ABAddressBookRequestAccessWithCompletion(ref, ^(bool granted, CFErrorRef error) {

            dispatch_semaphore_signal(sem);

        });

        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

        dispatch_release(sem);

    }

    else{

        ref=ABAddressBookCreate();

    }

    //获取本地所有联系人记录

    if (ref==nil) return nil;

    

    NSArray *arry=(__bridge  NSArray *)ABAddressBookCopyArrayOfAllPeople(ref);

    NSMutableArray *persons=[[NSMutableArray alloc]init];

    for (id tmpPerson in arry) {

        //__bridge关键词表示在ARC模式下不需要管理c中的内存释放

        ABRecordRef record=(__bridge ABRecordRef)tmpPerson;

        NSMutableDictionary *dict=[[NSMutableDictionary alloc]init];

        NSString *name=(__bridge NSString *)(ABRecordCopyCompositeName(record));

        [dict setObject:name forKey:@"name"];

        ABMultiValueRef phonevalues=ABRecordCopyValue(record, kABPersonPhoneProperty);

        CFIndex count=ABMultiValueGetCount(phonevalues);

        for (int i=0;i

            NSString *phonenumber=(__bridge NSString *)(ABMultiValueCopyValueAtIndex(phonevalues, i));

            [dict setObject:phonenumber forKey:[NSString stringWithFormat:@"phone%i",i]];

        }

        [persons addObject:dict];

    }

        return [persons copy];

    }

}

关于dispatch_semaphore_t变量GCD中用于控制线程并发的,这里不再详细介绍了,

 

ABRecordCopyCompositeName是直接可以获取联系人姓名的方法,返回值为String,

 

CFTypeRef ABRecordCopyValue(ABRecordRef record, ABPropertyID property)这个方法这里解释一下,第二个参数为属性ID,在ABPerson.h文件中可以获取到所有的联系人属性值,包含email,电话,qq等详细信息,返回值为通用指针类型(Void *),这里转化为我们需要的就OK了。

(2)AddressBookUI框架

这个框架是Apple为我们提供的调用通讯录页面和联系人页面的框架,与调用本机照相机类似的实现,

 

ABPeoplePickerNavigationController:显示整个通讯录并可以选择一个联系人的信息

ABPersonViewController:显示一个具体联系人的信息

ABNewPersonViewController:增加一个新的联系人

ABUnknownPersonViewController:完善一个联系人的信息

大概已经清楚这个框架的作用了,每个页面都可以调用相应的委托实现回调,这个就不说了

打开通讯录页面代码:

 

 ABNewPersonViewController *VC=[[ABNewPersonViewController alloc]init];

            VC.newPersonViewDelegate=self;

            [self presentModalViewController:VC animated:YES];



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值