·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> iOS-通信录

iOS-通信录

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

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);

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

-(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简述

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

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