我有以下代码,我正在尝试设置我正在添加到地址簿的新联系人的AIM和Skype属性:
ABRecordRef record = ABPersonCreate();
CFErrorRef an_error = NULL;
ABMutableMultiValueRef multi_aim = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMultiValueAddValueAndLabel(multi_aim, @"ExampleNick", kABPersonInstantMessageServiceAIM, NULL);
ABRecordSetValue(record, kABPersonInstantMessageProperty, multi_aim, &an_error);
ABMutableMultiValueRef multi_skype = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMultiValueAddValueAndLabel(multi_skype, @"example.nick", kABPersonInstantMessageServiceSkype, NULL);
ABRecordSetValue(record, kABPersonInstantMessageProperty, multi_skype, &an_error);
if (an_error != NULL) {
NSLog(@"Error while creating person");
}
CFErrorRef error = NULL;
ABAddressBookRef address_book = ABAddressBookCreateWithOptions(NULL, &error);
ABAddressBookRequestAccessWithCompletion(address_book, ^(bool granted, CFErrorRef error) {
if (!granted) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Unable to access address book"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:nil];
[alert show];
} else {
BOOL is_added = ABAddressBookAddRecord(address_book, record, &error);
if (is_added) {
NSLog(@"Address book entry added");
} else {
NSLog(@"ERROR adding address book entry: %@", error);
}
error = NULL;
BOOL is_saved = ABAddressBookSave(address_book, &error);
if (is_saved) {
NSLog(@"Saved address book");
} else {
NSLog(@"ERROR saving address book: %@", error);
}
}
CFRelease(record);
CFRelease(multi_aim);
CFRelease(multi_skype);
CFRelease(address_book);
});
(我还要添加名字和姓氏,但为了简洁起见,将其留在了示例中)
当记录被添加时,除了AIM和Skype字段之外的所有内容都会被填充。我做错了什么?
答案 0 :(得分:3)
Instants是kABMultiDictionaryPropertyType类型的多值属性。将一个skype id插入ABRecordRef的片段如下所示。您可以将多个时刻插入一个ABRecordRef。
ABRecordRef record = ABPersonCreate();
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
(NSString*)kABPersonInstantMessageServiceSkype, (NSString*)kABPersonInstantMessageServiceKey,
@"YourSkypeIDGoesHere", (NSString*)kABPersonInstantMessageUsernameKey,
nil
];
CFStringRef label = NULL; // in this case 'IM' will be set. But you could use something like = CFSTR("Personal IM");
CFErrorRef error = NULL;
ABMutableMultiValueRef values = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
BOOL didAdd = ABMultiValueAddValueAndLabel(values, (__bridge CFTypeRef)(dictionary), label, NULL);
BOOL didSet = ABRecordSetValue(record, kABPersonInstantMessageProperty, values, &error);
if (!didAdd || !didSet) {
CFStringRef errorDescription = CFErrorCopyDescription(error);
NSLog(@"%s error %@ while inserting multi dictionary property %@ into ABRecordRef", __FUNCTION__, dictionary, errorDescription);
CFRelease(errorDescription);
}
CFRelease(values);