美文网首页iOS开发技巧
iOS添加和修改联系人到通讯录

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

作者: Brave1991 | 来源:发表于2018-10-12 13:50 被阅读693次

    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];
        }
    }
    

    相关文章

      网友评论

        本文标题:iOS添加和修改联系人到通讯录

        本文链接:https://www.haomeiwen.com/subject/fftgaftx.html