如何以编程方式从地址簿ios编辑电话号码值

我试图在iOS中以编程方式replace特定联系人的特定电话号码,并将联系人形成地址簿。

我不知道为什么我不能保存新的电话号码,并刷新通讯录以显示更改。

我正在这样做:

+(BOOL) changeContactPhoneNumber:(NSString *) phoneSought forThis:(NSString *) newPhoneNumber{ ABAddressBookRef addressBook = ABAddressBookCreate(); ABRecordRef contactSelected; CFStringRef mobileLabelNumber; CFErrorRef error = nil; // Do whatever you want here. CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); for (int i = 0; i < nPeople; i++) { ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i); ABMultiValueRef phones = (ABMultiValueRef)ABRecordCopyValue(ref, kABPersonPhoneProperty); NSString* mobilePhoneNumber=@""; if (ABMultiValueGetCount(phones) > 0) { for (int i=0; i < ABMultiValueGetCount(phones); i++) { [mobilePhoneNumber release]; mobilePhoneNumber = (NSString*)ABMultiValueCopyValueAtIndex(phones, i); if([mobilePhoneNumber isEqualToString:phoneSought]){ contactSelected = ref; mobileLabelNumber = ABMultiValueCopyLabelAtIndex(phones, i); } } } } ABMutableMultiValueRef phoneNumberMultiValue = ABMultiValueCreateMutable(kABPersonPhoneProperty); bool didAddPhone = ABMultiValueAddValueAndLabel(phoneNumberMultiValue ,(__bridge CFTypeRef)newPhoneNumber,mobileLabelNumber, NULL); if(didAddPhone){ ABRecordSetValue(ABAddressBookGetPersonWithRecordID(addressBook, contactSelected), kABPersonPhoneProperty, phoneNumberMultiValue, nil); bool bSuccess = ABAddressBookSave(addressBook, &error); if (!bSuccess) { NSLog(@"Could not save to address book: %@", error); } else { return YES; } } else { NSLog(@"Error editing phone number: %@", error); error = nil; } return NO; } 

您应该debugging您的代码,并试图找出您提供给该方法的电话号码的格式是否匹配。

例如,当我login我的联系人列表电话号码这些都是结果

 Number...555-478-7672 Number...(408) 439-5270 Number...(408) 555-3514 Number...888-555-5512 Number...888-555-1212 Number...555-522-8243 Number...(555) 766-4823 Number...(707) 555-1854 Number...555-610-6679 

而我正在比较这些数字与未格式化的数字string。

其次

 ABRecordSetValue(ABAddressBookGetPersonWithRecordID(addressBook, contactSelected), kABPersonPhoneProperty, phoneNumberMultiValue, nil); 

谁的实际声明是

 ABRecordSetValue(ABRecordRef record, ABPropertyID property, CFTypeRef value, CFErrorRef* error); 

虽然ABAddressBookGetPersonWithRecordID返回一个ABRecordRef但是你已经有了ABRecordRef contactSelected; 所以在我看来你应该使用

 ABRecordSetValue(contactSelected,kABPersonPhoneProperty,phoneNumberMultiValue,nil); 

请纠正我,如果我错了或误解了你的代码!