ios封装一个获取通讯录工具类
iOS提供了AddressBook.framework和Contacts.framework两个框架来获取通讯录数据。我们可以利用这两个框架来封装一个获取通讯录的工具类。
首先,我们需要在项目中导入AddressBook.framework和Contacts.framework两个框架。通过以下步骤进行导入:
1. 在Xcode中选择你的项目。
2. 点击项目的Targets,在General选项卡下找到Linked Frameworks and Libraries。
3. 点击"+"按钮,选择AddressBook.framework和Contacts.framework,然后点击Add。
接下来,我们可以创建一个名为ContactsManager的类来封装获取通讯录的逻辑。我们可以在该类中定义一些方法,如获取所有联系人、获取指定联系人等。
首先,我们在ContactsManager.h文件中定义一个类,并引入AddressBook和Contacts的头文件。代码如下:
```objective-c
#import
#import
#import
@interface ContactsManager : NSObject
/**
获取所有联系人
@return 联系人列表
*/
+ (NSArray *)getAllContacts;
/**
根据名字搜索联系人
@param name 联系人姓名
@return 搜索结果列表
*/
+ (NSArray *)searchContactsWithName:(NSString *)name;
@end
```
接下来,在ContactsManager.m文件中实现这两个方法。首先是获取所有联系人的方法,代码如下:
```objective-c
+ (NSArray *)getAllContacts {
if (@available(iOS 9.0, *)) {
// 使用Contacts.framework获取联系人
CNContactStore *contactStore = [[CNContactStore alloc] init];
NSArray *keysToFetch = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];
CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch];
NSMutableArray *contacts = [NSMutableArray array];
NSError *error;
[contactStore enumerateContactsWithFetchRequest:fetchRequest error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
[contacts addObject:contact];
}];
return contacts;
} else {
// 使用AddressBook.framework获取联系人
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex count = ABAddressBookGetPersonCount(addressBook);
NSMutableArray *contacts = [NSMutableArray array];
for (int i = 0; i < count; i++) {
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
for (int j = 0; j < ABMultiValueGetCount(phoneNumbers); j++) {
NSString *phoneNumber = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phoneNumbers, j));
NSDictionary *contact = @{@"firstName": firstName ?: @"",
@"lastName": lastName ?: @"",
@"phoneNumber": phoneNumber};
[contacts addObject:contact];
}
}
CFRelease(addressBook);
CFRelease(allPeople);
return contacts;
}
}
```
该方法中,我们首先判断设备系统版本。在iOS 9及以上版本,我们使用Contacts.framework获取联系人,否则使用AddressBook.framework获取。在获取联系人的过程中,我们需要使用ABRecordCopyValue方法来获取联系人的属性,然后将联系人信息添加到contacts数组中。
接下来,我们实现根据名字搜索联系人的方法,代码如下:
```objective-c
+ (NSArray *)searchContactsWithName:(NSString *)name {
NSArray *allContacts = [self getAllContacts];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstName CONTAINS[cd] %@ OR lastName CONTAINS[cd] %@", name, name];
NSArray *results = [allContacts filteredArrayUsingPredicate:predicate];
return results;
}
```
该方法中,我们首先调用getAllContacts方法获取所有联系人,然后使用NSPredicate来过滤出名字中包含搜索关键字的联系人。
至此,我们已经完成了获取通讯录的工具类的封装。
使用ContactsManager类,我们可以在其他地方调用这些方法来获取通讯录数据,如下所示:
```objective-c
NSArray *allContacts = [ContactsManager getAllContacts];
NSArray *searchResults = [ContactsManager searchContactsWithName:@"John"];
```
总结起来,我们封装的ContactsManager工具类通过使用AddressBook.framework和Contacts.framework来获取通讯录数据。我们可以通过调用getAllContacts方法获取所有联系人,或者调用searchContactsWithName方法来搜索指定姓名的联系人。该工具类可以帮助我们快速获取通讯录数据,提高开发效率。