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

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];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • 生活中经常有这些现象:每天忙个不停却不知道忙了什么;为了高一点的工资跳槽;天天经常加班到深夜;应酬不断、肚子挺大,...
    Mypc阅读 303评论 0 0
  • 那天好像第一次见你 对你的眼睛,我凝视了三秒 我以为我看见日月,星辰,大海 是全世界 但一切我以为的都是我以为的 ...
    悲苦执念阅读 169评论 0 0
  • 话说,九月近在眼前 想想剩下不到十天的假期 我的同学们已经伤心欲绝 作为一名爱好学习的女大学生 我怎么可以贪恋红尘...
    lovelylily444阅读 1,025评论 0 6
  • 每到晚上感慨总是特别多,其实也不知道想些什么。 总觉得人生特别悲凉,总觉得只有自己一个人孤苦伶仃的存在着,...
    胡酴阅读 269评论 0 0