Как получить номер телефона из контакта адресной книги (iphone sdk) - PullRequest
2 голосов
/ 13 ноября 2008

Я показываю пользователю адресную книгу и позволяю ему щелкнуть контакт и выбрать номер телефона. Если они выбирают номер телефона, я хочу получить номер телефона в виде целого числа и имя контакта в виде строки NSS.

Я пытался сделать это с помощью следующего кода:

    //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 ]

14 голосов
/ 13 ноября 2008

Чтобы получить свойство эффективно (насколько возможно чтение), вы можете сделать что-то подобное в вашем методе обратного вызова:

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];
5 голосов
/ 13 ноября 2008

Нельзя преобразовать номер телефона в целое число. Номера телефонов являются строками. Запись по умолчанию, которую Apple включает для себя, имеет номер «1-800-MYAPPLE».

Кроме того, даже если все компоненты телефонного номера являются цифрами, нет никакой гарантии, что телефонные номера во всех частях света на самом деле достаточно малы, чтобы вписаться в 64-битное значение, если учесть код города, код страны , внутренние расширения и т. д. Пользователи могут свободно помещать туда сколько угодно.

3 голосов
/ 26 мая 2009

Еще одна причина не использовать целые числа - некоторые страны используют начальные нули в телефонных номерах, например, все номера в Великобритании начинаются с нуля (обычно пишется 01234 567890 или 0123 4567890)!

2 голосов
/ 13 ноября 2008
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.

0 голосов
/ 15 ноября 2011

Обратите внимание, что этот код падает в "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); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...