之前做了获取通讯录联系人的功能,但是没有适配iOS9.0以前的,刚好看到科大讯飞 SDK sample demo 里面很全,摘取下来
//
// IFlyContact.h
// msc
//
// Created by ypzhao on 13-3-1.
// Copyright (c) 2013年 IFLYTEK. All rights reserved.
//
#import <Foundation/Foundation.h>
/*!
* 此接口为获取通信录中的联系人。<br>
* 获取联系人是为了在进行语音识别时(sms)能更好的识别出您说的人名,联系人上传是属于个性化的一部分。
*/
@interface IFlyContact : NSObject
/*!
* 获取联系人。<br>
* 调用此方法需要添加 AddressBook.framework 和 Contacts.framework到工程中,调用此方法后可以直接将通信录中的联系人转化为语音云识别的数据结构。您可以将获取的数据通过IFlyDataUploader类,上传到语音云,我们只获取通信录中的人名。
*
* @return 返回联系人信息
*/
- (NSString *) contact;
@end
//
// IFlyContact.m
// msc
//
// Created by ypzhao on 13-3-1.
// Copyright (c) 2013年 IFLYTEK. All rights reserved.
//
#import "IFlyContact.h"
#import <AddressBook/AddressBook.h> /*AddressBook.framework*/
#import <Contacts/Contacts.h>
#import <UIKit/UIKit.h>
@interface IFlyContact(private)
- (NSString *) toString:(NSMutableArray *) array;
@end
@implementation IFlyContact
-(NSString *) contact{
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000
if ([[[UIDevice currentDevice] systemVersion] compare:@"9.0" options:NSNumericSearch] != NSOrderedAscending){
CNContactStore *contactStore = [[CNContactStore alloc] init];
if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusNotDetermined) {
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
NSMutableArray *addreBookArray = [self fetchContactWithContactStore:contactStore];
if (addreBookArray == nil || [addreBookArray count] == 0) {
return nil;
}
else {
return [self toString: addreBookArray];
}
}else
#endif
{
ABAddressBookRef addressBook = nil;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000
if ([[[UIDevice currentDevice] systemVersion] compare:@"6.0" options:NSNumericSearch] != NSOrderedAscending) {
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意后向下执行
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else
#endif
{
addressBook = ABAddressBookCreate();
}
NSArray *allPeople = (NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
if(allPeople == nil){
NSLog(@"contact count :0");
if(addressBook){
CFRelease(addressBook);
}
return nil;
}
else{
NSLog(@"contact count :%d",[allPeople count]);
}
NSMutableArray *addreBookArray = [NSMutableArray arrayWithCapacity:[allPeople count]];
for (id person in (NSArray *)allPeople) {
NSString *personName = (NSString*)CFBridgingRelease(ABRecordCopyValue(CFBridgingRetain(person), kABPersonFirstNameProperty));
NSString *lastName = (NSString *) CFBridgingRelease(ABRecordCopyValue(CFBridgingRetain(person), kABPersonLastNameProperty));
if ([personName length] ==0 && [lastName length] == 0) {
}
else if ([personName length] == 0) {
NSString *name = [NSString stringWithFormat:@"%@", lastName];
[addreBookArray addObject:name];
}
else if ([lastName length] == 0) {
NSString *name = [NSString stringWithFormat:@"%@",personName];
[addreBookArray addObject:name];
}
else {
NSString *name = [NSString stringWithFormat:@"%@%@",lastName,personName];
[addreBookArray addObject:name];
}
}
if (addressBook) {
CFRelease(addressBook);
}
return [self toString: addreBookArray];
}
}
#pragma mark owner
- (NSString *) toString:(NSMutableArray *) array
{
NSArray *addressArray = [[NSArray alloc] initWithArray: array];
if (!addressArray) {
return nil;
}
NSMutableString *address = [NSMutableString stringWithCapacity: [addressArray count]];
for (int i = 0; i < [addressArray count]; i++) {
[address appendFormat:@"%@\n",[addressArray objectAtIndex: i]];
}
return address;
}
- (NSMutableArray *)fetchContactWithContactStore:(CNContactStore *)contactStore{
if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusAuthorized) {
CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactFamilyNameKey, CNContactGivenNameKey]];
NSError *error = nil;
NSMutableArray *addreBookArray = [NSMutableArray array];
[contactStore enumerateContactsWithFetchRequest:fetchRequest error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
if (!error){
if ([contact.familyName length] != 0 && [contact.givenName length] !=0) {
NSString *name = [NSString stringWithFormat:@"%@%@",contact.familyName,contact.givenName];
[addreBookArray addObject:name];
}else if ([contact.familyName length] != 0) {
NSString *name = [NSString stringWithFormat:@"%@",contact.familyName];
[addreBookArray addObject:name];
}else {
NSString *name = [NSString stringWithFormat:@"%@",contact.givenName];
[addreBookArray addObject:name];
}
}
}];
return addreBookArray;
}
return nil;
}
@end
网友评论