2013-04-18 1 views
0

У меня есть следующий код, который я пытаюсь использовать для установки AIM и свойства Skype нового контакта, я добавляю в адресную книгу:Как установить свойство Instant Message на контакт Адресной книги?

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, заполняются. Что я делаю не так?

ответ

3

Претенденты являются многозначными свойствами типа kABMultiDictionaryPropertyType. Фрагмент, вставляющий один идентификатор skype в 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); 
+0

Вы можете просто объяснить мне содержание словаря NSDictionary *. Я немного смущен этим и как использовать тот же словарь для нескольких IM. Пожалуйста, укажите этот код также – milanpanchal

+1

@milanpanchal, словарь содержит информацию, которую вы хотите добавить. (kABPersonInstantMessageServiceSkype, kABPersonInstantMessageServiceKey) означает, что это будет идентификатор Skype. (@ "YourSkypeIDGoesHere", kABPersonInstantMessageUsernameKey) - сам идентификатор Skype. Вы не можете повторно использовать этот словарь для нескольких записей AB, пока все эти контакты не будут иметь тот же идентификатор Skype. Все три константы из файла заголовка ABPerson.h. Укажите код для вас? Простите, нет. Приведенный выше код сам объясняется. Обратитесь к документации Apple. –

+0

Спасибо за предоставленную информацию. Я пытался повторно использовать тот же словарь, который вызывает ошибку. Теперь все установлено – milanpanchal