iOS开发技巧

iOS添加和修改联系人到通讯录

2018-10-12  本文已影响693人  Brave1991

iOS9.0新增了通讯录类,按照一般教程使用即可完成通常的开发任务。在实际工作中,遇到了一个问题,如果通讯录中存在某一个指定的姓名的联系人,需要修改其联系方式为XXXX-XXXXXX,不存在则创建这样的一个联系人。API中提供了updateContact方法,但直接调用会出现崩溃,原因是CNMutableContact的phoneNumbers的属性为只读,只有为空时才可以赋值。
所以解决这个问题的思路改为:如果存在该指定姓名的联系人时,先删除此联系人,然后创建一个新的。

一、添加头文件

#import <ContactsUI/ContactsUI.h>

二、常用API函数

2.1 获取是否授权

//获取是否授权
- (BOOL)getContactAuthorize:(CNContactStore *)contactStore {
    __block BOOL grandted = YES;
    [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted == YES) {
            grandted = YES;
        }else {
            grandted = NO;
        }
    }];
    return grandted;
}

2.2 创建联系人

/**
 创建客服信息
 */
- (CNMutableContact *)crateServiceContact {
    CNMutableContact *contact = [[CNMutableContact alloc] init];
    contact.organizationName = KContactOrganizationName;
    CNPhoneNumber *mobileNumber = [[CNPhoneNumber alloc] initWithStringValue:ServerPhoneNumber];
    CNLabeledValue *mobilePhone = [[CNLabeledValue alloc] initWithLabel:CNLabelPhoneNumberMobile value:mobileNumber];
    contact.phoneNumbers = @[mobilePhone];
    return contact;
}

2.3 添加联系人

/**
 添加联系人
 */
- (void)addContact:(CNMutableContact *)contact {
    // 创建联系人请求
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest addContact:contact toContainerWithIdentifier:nil];
    // 写入联系人
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}

2.4 删除联系人

/**
 删除客服信息
 */
- (void)deleteContact:(CNMutableContact *)contact{
    // 创建联系人请求
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest deleteContact:contact];
    // 写入操作
    CNContactStore *store = [[CNContactStore alloc] init];
    [store executeSaveRequest:saveRequest error:nil];
}

2.5判断指定姓名联系人是否存在

/**
 判断是否存在指定联系人
 */
- (CNContact *)isExitContact:(NSString *)organizationName {
    CNContactStore *store = [[CNContactStore alloc] init];
    //检索条件
    NSPredicate *predicate = [CNContact predicateForContactsMatchingName:organizationName];
    //过滤的条件
    NSArray *keysToFetch = @[CNContactEmailAddressesKey, [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]];
    NSArray *contact = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keysToFetch error:nil];
    return [contact firstObject];
}

2.6 更新联系人

/**
 更新联系人
 */
- (void)updateContact:(CNMutableContact *)contact{
    // 创建联系人请求
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest updateContact:contact];
    // 重新写入
    CNContactStore *store = [[CNContactStore alloc] init];
    NSError *error = nil;
     BOOL saveStatus = [store executeSaveRequest:saveRequest error:&error];
    if (saveStatus == NO) {
        NSLog(@"%@", error);
    }
    
}

三、使用

使用上,需要先获取授权信息,然后走不同的路径。

/**
 授权并新建联系人到通讯录
 */
+ (BOOL)createContact {
    ZTEventKitManager *manager = [ZTEventKitManager sharedManager];
    CNContactStore *contactStore = [[CNContactStore alloc] init];
    
    switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]) {
        case CNAuthorizationStatusNotDetermined:{
            BOOL granted = [manager getContactAuthorize:contactStore];
            if (granted) {
                [manager updateContact];
                return YES;
            } else {
                return NO;
            }
        }
        case CNAuthorizationStatusAuthorized:{
            [manager updateContact];
            return YES;
        }
        default:
            return NO;
            break;
    }
}

其中updateContact函数,作用是先判断是否存在指定的联系人如果存在,先删除然后创建新的。

//更新联系人信息
- (void)updateContact {
    ZTEventKitManager *manager = [ZTEventKitManager sharedManager];
    CNContact *contact = [manager isExitContact:KContactOrganizationName];
    if (contact) {
        CNMutableContact *contactOld= [contact mutableCopy];
        [manager deleteContact:contactOld];
        
        CNMutableContact *contactNew = [manager crateServiceContact];
        [manager addContact:contactNew];
        
    }else {
        CNMutableContact *contact = [manager crateServiceContact];
        [manager addContact:contact];
    }
}
上一篇下一篇

猜你喜欢

热点阅读