iOS -- 访问通讯录

在iOS中 通讯录访问使用的是相对底层的C代码。

  首先需要导入系统框架:AddressBook.framework


注意:

  在程序第一次需要访问通讯录的时候,必须先询问系统是否允许当前程序访问通讯录,等待作答。iOS7以后,如果不写询问,可能崩溃。。

询问方法:参数   granted==YES,表示允许使用, granted==NO,表示不允许使用

 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {  }


在第二次访问通讯录(只要不是第一次访问)时,就可以使用下列方法,判断是否同意访问通讯录

  if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {

     NSLog(@"不允许访问通讯录");

return;

     }



读取联系人:

//读取信息
- (void)readInfo
{
    
    
    /**
                访问系统的通讯录,需要导入系统框架:AddressBook.framework
        */
    
    //报错
    CFErrorRef error = NULL;
    
    //创建一个地址簿“对象”
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
    
    //第一个参数是预留参数,目前没用,未来官方会需要参数,就不用改原型了。

    /**
     
           注意:
     
     
     第一次访问通讯录时,必须从先询问系统是否允许当前程序访问通讯录,等待作答。iOS7以后,如果不写询问,可能崩溃。。在这里,读取通讯录事第一次访问,所以加在这里,然后再添加联系人的时候(非第一次访问通讯录都可以这样):使用
     
     
     if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
     NSLog(@"不允许访问通讯录");
     }
     
     但是,如果添加联系人是第一次访问通讯录,那么则必须先询问。
     
     ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
    
     }

         */
    
    
    
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
        //当用户选择了是否允许,回调这个方法
        if (granted == YES) {
            //允许
            //访问通讯录
            
            //获取通讯录中的名片
            //获取所有人
            CFArrayRef arrayRef =  ABAddressBookCopyArrayOfAllPeople(addressBook);
            
            //导入OC数组
            NSArray * array = CFBridgingRelease(arrayRef);
            
            //找出一个人
            ABRecordRef person = CFBridgingRetain(array[0]);
            //凡是bridgingRetain创建的Ref,用完需要释放
            
            //从人中取出相应的信息
           
            /*取出单一值的信息*/
            //这里取出联系人的名字
            NSString * name = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));
            
            NSLog(@"%@", name);
            //获取这些信息
            //            kABPersonFirstNameProperty
            //名
            //            kABPersonLastNameProperty
            //姓
            //            kABPersonMiddleNameProperty
            //中间名
            //            kABPersonPrefixProperty
            //前缀
            //            kABPersonSuffixProperty
            //后缀
            //            kABPersonNicknameProperty
            //昵称
            //            kABPersonFirstNamePhoneticProperty
            //名的汉语拼音或者音标
            //            kABPersonLastNamePhoneticProperty
            //姓的汉语拼音或者音标
            //            kABPersonMiddleNamePhoneticProperty
            //中间名的汉语拼音或者音标
            //            kABPersonOrganizationProperty
            //组织名
            //            kABPersonJobTitleProperty
            //头衔
            //            kABPersonDepartmentProperty
            //部门
            

            
            /*获取多值属性,如email,phoneNumber*/
            //获取Email
            ABMultiValueRef mutiValueRef = ABRecordCopyValue(person, kABPersonEmailProperty);
            
            NSArray * emails = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(mutiValueRef));
            //通过这个方法转成数组,数中就是想要的字符串了
            
            NSLog(@"%@", emails);
            
            
            //获取电话号码
            ABMultiValueRef mutiValueRef2 = ABRecordCopyValue(person, kABPersonPhoneProperty);
            
            NSArray * phoneNumbers = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(mutiValueRef2));
            //通过这个方法转成数组,数中就是想要的字符串了
            
            NSLog(@"%@", phoneNumbers);
            
            //这里可以区分电话的种类
            for(int index = 0; index< phoneNumbers.count; index++){
                
                NSString * phoneNumber = [phoneNumbers objectAtIndex:index];
                
                NSString * phoneNumberLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(mutiValueRef2, index));
                
                if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) {
                    NSLog(@"手机电话%@", phoneNumber);
                    
                } else if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) {
                    NSLog(@"iPhone电话%@", phoneNumber);
                    
                } else {
                    
                    NSLog(@"其他电话%@",  phoneNumber);
                    
                }
                
            }

            
          
            
            CFRelease(person);
            CFRelease(mutiValueRef);
            CFRelease(mutiValueRef2);
            
        } else {
            //不许
            
            //释放addressbook
            CFRelease(addressBook);
            return;
        }
    });
    
    //千万不可在这里释放。为啥?因为这里的代码比block中的代码先调用。
}



添加联系人:

//向通讯录添加一个人
- (void)addContract
{
    //在该程序任何处均可通过下面代码判断通讯录是否允许访问
    if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
        NSLog(@"不允许访问通讯录");
        return;
    }
    
    //打开通讯录
    ABAddressBookRef iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);
    //新建一个联系人
    ABRecordRef newPerson = ABPersonCreate();
    
    //设置联系人的信息
    /*设置单一值得信息*/
    CFErrorRef error = NULL;
    //设置联系人的姓
    ABRecordSetValue(newPerson, kABPersonFirstNameProperty, @"野原", &error);
    //设置联系人的名
    ABRecordSetValue(newPerson, kABPersonLastNameProperty, @"新之助", &error);
    //设置昵称
    ABRecordSetValue(newPerson, kABPersonNicknameProperty, @"蜡笔小新", &error);
    
    /*设置多值得信息*/
    //设置电话号码
    //初始化电话引用
    ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
    
    //设置了连续三个电话号码,分别对应三个电话类型
    ABMultiValueAddValueAndLabel(multiPhone, @"1-555-555-5555", kABPersonPhoneIPhoneLabel, NULL);
    ABMultiValueAddValueAndLabel(multiPhone, @"1-123-456-7890", kABPersonPhoneMobileLabel, NULL);
    ABMultiValueAddValueAndLabel(multiPhone, @"1-987-654-3210", kABOtherLabel, NULL);
    
    //添加到联系人
    ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone, &error);
    
    //联系人添加到通讯录
    ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error);
    
    //同步通讯录
    ABAddressBookSave(iPhoneAddressBook, &error);
    if (error != NULL)
    {
        NSLog(@"添加失败");
    } else {
        NSLog(@"添加成功");
    }

    

    CFRelease(iPhoneAddressBook);
    CFRelease(newPerson);
    CFRelease(multiPhone);
}

删除联系人:
//从通讯录中,删除一个联系人
- (void)removeAContract
{
    //在该程序任何处均可通过下面代码判断通讯录是否允许访问
    if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
        NSLog(@"不允许访问通讯录");
        return;
    }

    //打开通讯录
    ABAddressBookRef iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);
    
    //返回所有联系人到一个数组中
    CFArrayRef personArray = ABAddressBookCopyArrayOfAllPeople(iPhoneAddressBook);

    //找出数组的一个元素
    ABRecordRef deletePerson = CFArrayGetValueAtIndex(personArray, 7);
    
    //遍历数组,找到匹配的姓名,或匹配的电话,来确定被删除的人,这里就直接删除第7个。
    
    CFErrorRef error = NULL;
    
    //删除联系人
    ABAddressBookRemoveRecord(iPhoneAddressBook, deletePerson, &error);
    if (error) {
        NSLog(@"%@", error);
    }
    
    
    //同步通讯录
    ABAddressBookSave(iPhoneAddressBook, &error);
    if (error != NULL)
    {
        NSLog(@"删除失败");
    } else {
        NSLog(@"删除成功");
    }

    
    
    CFRelease(personArray);
//    CFRelease(deletePerson);
    
}




你可能感兴趣的:(iOS -- 访问通讯录)