Как получить номер телефона из контакта адресной книги (iphone sdk)
Я показываю пользователю адресную книгу и позволяю ему щелкнуть контакт и выбрать номер телефона. Если они выбирают номер телефона, я хочу получить номер телефона в виде целого числа и имя контакта в виде NSString.
Я попытался сделать это с помощью следующего кода:
//printf("%s\n",[[(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier] UTF8String]);
//CFArrayRef *arrayString = [[(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier] UTF8String];
NSArray *arrayString = [(NSArray *)ABMultiValueCopyArrayOfAllValues(theProperty) objectAtIndex:identifier];
printf("%s\n", arrayString);
Этот код внутри этого метода:
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
И я проверяю, выбрал ли пользователь номер телефона с этим кодом:
if (propertyType == kABStringPropertyType)
{
[self wrongSelection];
}
else if (propertyType == kABIntegerPropertyType)
{
[self wrongSelection];
}
else if (propertyType == kABRealPropertyType)
{
[self wrongSelection];
}
else if (propertyType == kABMultiStringPropertyType)
{
//This is the phone number...
Я могу получить номер телефона для отображения в консоли с помощью printf, однако я не могу понять, как преобразовать его в целое число и как также получить имя контакта, даже если выбранное свойство не является именем человека.
Кроме того, то, что я делаю, кажется очень неэффективным. Есть ли лучшие способы сделать это?
Редактировать: Если я не могу сохранить их как int, строка будет в порядке. Я просто не могу понять, как перейти от этого массива к реальной строке. Если я приведу его или сохраню как UTF8String, я всегда получаю сообщение об ошибке.
5 ответов
Чтобы получить свойство эффективно (насколько возможно чтение), вы можете сделать что-то подобное в вашем методе обратного вызова:
switch( propertyType ) {
case kABMultiStringPropertyType:
// this is the phone number, do something
break;
default:
[self wrongSelection];
break;
}
Я не уверен, что вам на самом деле даже нужно разобрать это, хотя. Чтобы получить номер телефона из записи, которую вы можете сделать (опять же, внутри вашего метода обратного вызова):
ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSArray* phoneNumbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty);
CFRelease(phoneNUmberProperty);
// Do whatever you want with the phone numbers
NSLog(@"Phone numbers = %@", phoneNumbers);
[phoneNumbers release];
Вы не можете преобразовать номер телефона в целое число. Номера телефонов являются строками. Запись по умолчанию, которую Apple включает для себя, имеет номер "1-800-MYAPPLE".
Кроме того, даже если все компоненты телефонного номера являются цифрами, нет никакой гарантии, что телефонные номера во всех частях света на самом деле достаточно малы, чтобы вписаться в 64-битное значение, если учесть коды городов, коды стран, внутренние расширения. и т. д. Пользователи могут свободно размещать там сколько угодно.
Другая причина не использовать целые числа - некоторые страны используют начальные нули в телефонных номерах, например, все номера в Великобритании начинаются с нуля (обычно пишется 01234 567890 или 0123 4567890)!
CFStringRef cfName = ABRecordCopyCompositeName(person);
NSString *personName = [NSString stringWithString:(NSString *)cfName];
CFRelease(cfName);
ABMultiValueRef container = ABRecordCopyValue(person, property);
CFStringRef contactData = ABMultiValueCopyValueAtIndex(container, identifier);
CFRelease(container);
NSString *contactString = [NSString stringWithString:(NSString *)contactData];
CFRelease(contactData);
contactString
содержит выбранный номер телефона, и personName
содержит имя человека Как указано выше, вы не можете преобразовать строку в число в общем, так как она может содержать буквенные символы. Однако вы можете написать свой собственный обработчик для преобразования буквенных символов в числа и вырезать все остальное, чтобы получить только числовую строку, которую затем можно преобразовать в длинную (телефонные номера становятся довольно длинными) .
Я подвергаю сомнению необходимость преобразования номера телефона в числовое значение, поскольку он также может содержать другие необходимые символы, такие как "Пауза". Кроме того, номер телефона представляет строку цифр больше, чем один длинный номер, так что концептуальный формат данных в любом случае больше String, чем Int.
Имейте в виду, что этот код вылетает в "stringWithString", если запись Adressbook не содержит имени или контактных данных. cfName может быть ноль!
CFStringRef cfName = ABRecordCopyCompositeName(person);
NSString *personName = [NSString stringWithString:(NSString *)cfName];
CFRelease(cfName);
исправить:
NSString *personName = nil;
if ((cfName = ABRecordCopyCompositeName(person)) != nil) {
personName = [NSString stringWithString:(NSString *)cfName];
CFRelease(cfName);
}