IOS-通信录

IOS-通信录

 

1.概述:

* 对于每一个移动设备而言,都有一个内置的数据库-----通讯录。

* 在IOS上,通讯录放在SQLite3数据库中。

* 由于不同应用之间不能直接访问,我们想要实现对数据库的访问,必须使用苹果开放的API.

* 苹果公司对数据访问开放的API是AddressBook(低级API)和AddressBookUI(高级API).

* 为了安全考虑,访问通讯录需要经过用户授权,仅需一次授权即可。

2.AddressBook 和 AddressBookUI的区别:

* AddressBook属于低级API,可以获取通讯录中的数据,但是需要自构UI界面

* AddressBookUI属于高级API,为我们提供了UI界面,使用起来比较方便。

3.AddressBook详述

* 在AddressBook中,比较常用的类是ABAddressBook, ABPerson, ABGroup, ABRecord

* ABAddressBook :封装了通讯录的接口。(对应ABAddressBookRef)

* ABPerson           :封装通信录个人的信息数据。(对应ABPersonRef)

* ABGroup             :封装了通讯录组信息数据。(对应ABGroupRef)

* ABRecord            :封装了数据库的一条记录。(对应ABRecordRef)

 想要获取通信录的信息,第一步是要导入AddressBook的框架,并在头文件中写入头文件<AddressBook/AddressBook.h>

 用户想要访问通讯录,第一步要创建通讯录对象,用于用户请求访问通讯录,代码如下:

1 ABAddressBookRef addressbook = ABAddressBookCreateWithOptions(NULL, NULL);

 * 如果是第一次访问通信录,需要获取用户的授权,不是第一次,直接访问。系统给我们提供的函数是:

 *  ABAddressBookRequestAccessWithCompletion(<#ABAddressBookRef addressBook#>, <#^(bool granted, CFErrorRef error)completion#>)

 * 如果第一次访问,点击允许访问,granted的值为一。

 * 只要granted的值为真的情况下,才允许访问通讯录。

 * 获取通讯录的所有记录的代码如下:

1 NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressbook);

 * 接下来我们要获取通讯录的联系人的姓名:代码如下:

1 ABRecordRef record = array[i];
2 NSString *name = (NSString *)ABRecordCopyCompositeName(record);

 * 获取联系人的手机号的时候,是属于一个多值属性,跟后去联系人姓名的时候有点不同,联系人姓名属于单值属性,代码如下:

1 ABMultiValueRef ref = ABRecordCopyValue(record, kABPersonPhoneProperty);
2 NSString *phone = ABMultiValueCopyValueAtIndex(ref, 0);

 * 整体代码为:(第二个函数的功能是去掉电话号码中的特殊字符,因为我们获取到得号码是苹果给我们分隔好的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-( void )getAddressbookContent
{
     ABAddressBookRef addressbook = ABAddressBookCreateWithOptions( NULL NULL );
     ABAddressBookRequestAccessWithCompletion(addressbook, ^( bool  granted, CFErrorRef error) {
         if  (granted ==  YES )
         {
             NSArray  *array = ( NSArray  *)ABAddressBookCopyArrayOfAllPeople(addressbook);
             for  ( int  i = 0; i < array.count; i ++)
             {
                 ABRecordRef record = array[i];
                 NSString  *name = ( NSString  *)ABRecordCopyCompositeName(record);
                 ABMultiValueRef ref = ABRecordCopyValue(record, kABPersonPhoneProperty);
                 NSString  *phone = ABMultiValueCopyValueAtIndex(ref, 0);
                 NSString  *phone1 = phone;
                 phone1 = [ self  deleteSpecialString:phone1];
                 contact *c = [[contact alloc]initWithName:name withPhone:phone1];
                 [_arrayContact addObject:c];
                 [c release];
                 CFRelease(name);
                 CFRelease(phone);
                 CFRelease(ref);
             }
         }
     });
}
-( NSString  *)deleteSpecialString:( NSString  *)string
{
     string = [string stringByReplacingOccurrencesOfString:@ "("  withString:@ "" ];
     string = [string stringByReplacingOccurrencesOfString:@ ")"  withString:@ "" ];
     string = [string stringByReplacingOccurrencesOfString:@ "-"  withString:@ "" ];
     string = [string stringByReplacingOccurrencesOfString:@ " "  withString:@ "" ];
     return  string;
}

 4.ABAddressBookUI简述

  * 使用这个类我们可以直接调出通讯录的界面,代码如下:

1
2
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
[ self  presentViewController:picker animated: YES  completion: nil ];

 效果图如下:

这个类有几个比较常用的代理方法,分别是:

点击取消按钮,相应该方法

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker

点击联系人信息,是否跳转到详情界面

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person

在联系人详情界面中点击了其它信息,是否跳转到其它界面(例如,点击时间,可以打开日历)

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

 

5.上面的介绍,只是通讯录的基本使用,当然通讯录的方法不止这些,例如可以修改,添加,删除联系人的信息,在此主要介绍了如何获取通讯录的信息。

转载于:https://www.cnblogs.com/xhc1263478959/p/4809342.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值