更新地址簿中的标签电话号码

时间:2014-05-29 06:00:58

标签: ios xcode addressbook

帮助。我想做一个简单的应用程序来将所有电话标签更新为另一个特定的。我需要将所有(工作,家庭,iphone)更改为"同步"。

我试图这样做,但没有奏效。有人可以帮帮我吗?

ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
//ABRecordRef record = ABAddressBookGetPersonWithRecordID(addressBookRef, ABRecordGetRecordID(record));

//NSString *addressBookNum;
NSString *phoneNumber;
NSString *tagLabel;


if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {

    });
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {

    CFErrorRef *error = NULL;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);

    for(int i = 0; i < numberOfPeople; i++) {

        ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i );

        ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);

        [[UIDevice currentDevice] name];

        for (CFIndex k = 0; i < ABMultiValueGetCount(phoneNumbers); k++) {

            phoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, k);
            tagLabel = (__bridge NSString*) ABMultiValueCopyLabelAtIndex(phoneNumbers, k);

            CFStringRef newTagLabel = (CFStringRef)@"Sync";

            ABMultiValueReplaceLabelAtIndex(phoneNumbers, newTagLabel, k);

            ABAddressBookSave(person, (CFErrorRef *) error);

            }

        }



}
else {
    // Send an alert telling user to change privacy setting in settings app
}

1 个答案:

答案 0 :(得分:0)

问题是你的陈述

ABAddressBookSave(person, (CFErrorRef *) error);  

函数ABAddressBookSave定义为

bool ABAddressBookSave (
   ABAddressBookRef addressBook,
   CFErrorRef *error
);  

因此,第一个参数是对地址簿的引用,而不是对个人记录的引用 完成所有更改后,必须保存通讯簿。

编辑(由于您的评论如下):

错误消息表示您正尝试将函数ABMultiValueReplaceLabelAtIndex(...)应用于不可变记录,因为phoneNumbers是。ABMutableMultiValueRef。即使您将其分配给ABMutableMultiValueRef mutablePhoneNumbers = ABMultiValueCreateMutableCopy(phoneNumbers); 类型的引用,它也是不可变的!您必须首先使用

之类的东西创建可变副本
{{1}}

只能更改标签 独立于此,我的第一个论点仍然适用,您必须在最后保存地址簿的更改。