iOS保存联系人到系统通讯录

1、首先判断当前通讯录是否存在这个联系人

// 判断通讯录是否存在某个联系人
+ (BOOL)isExistContactNameByName:(NSString *)contactName{
    ABAddressBookRef addBook = nil;
    
    __block BOOL isExist = NO;
    CFErrorRef error = nil;
    addBook = ABAddressBookCreateWithOptions(NULL, &error);
    
    dispatch_semaphore_t sema=dispatch_semaphore_create(0);
    // 申请权限
    ABAddressBookRequestAccessWithCompletion(addBook, ^(bool granted, CFErrorRef error) {
        if (granted) {
            CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addBook);
            CFIndex number = ABAddressBookGetPersonCount(addBook);
            for (NSInteger index = 0; index < number; index++) {
                //获取联系人对象的引用
                ABRecordRef  people = CFArrayGetValueAtIndex(allPeople, index);
                //获取当前联系人名字
                NSString*firstName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonFirstNameProperty));
                
                if ([firstName isEqualToString:contactName]) {
                    isExist = YES;
                }
            }
        }
        dispatch_semaphore_signal(sema);
    });
    //等待信号触发
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    
    return isExist;
}

2、判断是否存在这个联系人且有通讯录权限

- (void)saveYdCallAnswerPhoneToAdrBook{
    NSString *ydContactName = @"亿点连接呼转测试";
    NSString *ydContactNote = @"这是亿点连接的电话测试号码";
    if (![SSAdrBookHelper isExistContactNameByName:ydContactName] &&
        ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
        
        [SSAdrBookHelper createAddBookRecordByPhoneArr:self.ydPhoneArray
                                              andTitle:ydContactName
                                               andNote:ydContactNote];
    }
}

3、存入联系人

// 往通讯录添加一条新联系人
+ (void)createAddBookRecordByPhoneArr:(NSArray *)phoneArr andTitle:(NSString *)title andNote:(NSString *)note{
    CFErrorRef error = NULL;
    if (!phoneArr || !title) {return;}
    
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
    ABRecordRef newRecord = ABPersonCreate();

    ABRecordSetValue(newRecord, kABPersonFirstNameProperty, (__bridge CFTypeRef)title, &error);
    
    //创建一个多值属性(电话)
    ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);
//    ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)obj, (__bridge CFStringRef)@"亿点连接呼转测试", NULL);
    
    [phoneArr enumerateObjectsUsingBlock:^(NSString *phone, NSUInteger idx, BOOL * _Nonnull stop) {
    // 添加手机号码
        ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)phone, kABPersonPhoneMobileLabel, NULL);
    }];
    
    ABRecordSetValue(newRecord, kABPersonPhoneProperty, multi, &error);
    
    //添加email
//    ABMutableMultiValueRef multiEmail = ABMultiValueCreateMutable(kABMultiStringPropertyType);
//    ABMultiValueAddValueAndLabel(multiEmail, (__bridge CFTypeRef)([self.infoDic objectForKey:@"email"]), kABWorkLabel, NULL);
//    ABRecordSetValue(newRecord, kABPersonEmailProperty, multiEmail, &error);
    
    // 添加备注
    ABRecordSetValue(newRecord, kABPersonNoteProperty, (__bridge CFTypeRef)note, &error);
    
    //添加记录到通讯录操作对象
    ABAddressBookAddRecord(addressBook, newRecord, &error);
    
    //保存通讯录操作对象
    ABAddressBookSave(addressBook, &error);

    CFRelease(multi);
    CFRelease(newRecord);
    CFRelease(addressBook);
}

效果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

《T-SQL查询》读书笔记Part 2.执行计划

  在SSMS(SQL Server Management Studio)中,有两种图形化的执行计划可供选择。一种是估计执行计划(Ctrl+L键),另一种是实际...

703
来自专栏乐沙弥的世界

PL/SQL 包编译时hang住的处理

       最近PL/SQL包在编译时被hang住,起初以为是所依赖的对象被锁住。结果出乎意料之外。下面直接看代码演示。

946
来自专栏数据库新发现

字符集问题的初步探讨(二)

原文发表于itpub技术丛书《Oracle数据库DBA专题技术精粹》,未经许可,严禁转载本文.

1372
来自专栏乐沙弥的世界

PL/SQL -->隐式游标(SQL%FOUND)

在PL/SQL中,游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括

983
来自专栏乐沙弥的世界

dbms_xplan之display函数的使用

DBMS_XPLAN包包括一系列函数,主要是用于显示SQL语句的执行计划,且不同的情形下使用不同的函数来显示,如预估的执行计划则使用 displ...

1902
来自专栏乐沙弥的世界

SQL*Plus copy 命令处理大批量数据复制

    对于数据库表级上的数据复制,我们最常用的是CREATE TABLE AS(CTAS)..方式。其实在SQL*Plus下面copy命令可以完成同样的工作,...

1041
来自专栏杨建荣的学习笔记

merge语句导致的CPU使用率过高的优化(r7笔记第4天)

今天有一个数据库有点反常,早上的时候报出了CPU使用率的警告。 警告内容如下: ZABBIX-监控系统: -----------------------...

3335
来自专栏ShaoYL

iOS---iOS中SQLite的使用

3368
来自专栏恰童鞋骚年

《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少

  T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL。

944
来自专栏杨建荣的学习笔记

使用awk来解析dump文件 (73天)

dump文件是平时工作中经常碰见的,有时候得到一个dump,但是没有提供一些更多的信息,导入的时候就很可能会有问题。 如果某个用户默认表空间是user,但是du...

4368

扫码关注云+社区

领取腾讯云代金券