【问题标题】:How to get a Phone Number from an Address Book Contact (iphone sdk)如何从通讯录联系人中获取电话号码(iphone sdk)
【发布时间】:2008-11-13 03:46:51
【问题描述】:

我正在向用户显示地址簿视图,并让他们单击联系人并选择电话号码。如果他们选择电话号码,我想将电话号码作为整数获取,将联系人姓名作为 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,我总是会遇到一些错误。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    为了有效地获取属性(就阅读而言),您可以在回调方法中执行以下操作:

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

    【讨论】:

    • 嗨,杰森,感谢您的回复。我相信“phoneNUMerProperty”有一个错字(应该是“phoneNumberProperty”)。快速提问:您如何获得与电话号码关联的类型(即手机、iPhone、家庭)?
    • 我知道我在这里玩游戏迟到了,但我只是偶然发现了这个问题。我正在执行以下操作:ABMutableMultiValueRef multi; int multiCount=0; multi = ABRecordCopyValue(person, kABPersonPhoneProperty); multiCount=ABMultiValueGetCount(multi); for( int i=0; i < multiCount; i++) { NSString *descriptionString = (__bridge NSString *)ABMultiValueCopyLabelAtIndex(multi, i); NSString *theNumber = (__bridge NSString*)ABMultiValueCopyValueAtIndex(multi, i); } descriptionString 看起来像 $!!$
    • 这泄漏了。你应该使用NSArray *phoneNumbers = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(phoneNumberProperty));
    【解决方案2】:

    您无法将电话号码转换为整数。电话号码是字符串。 Apple 为自己包含的默认条目具有编号“1-800-MYAPPLE”。

    此外,即使电话号码的所有组成部分都是数字,也不能保证世界各地的电话号码实际上都小到足以容纳 64 位值,一旦您考虑到区号、国家/地区代码, 内部扩展等。用户可以随意放在那里。

    【讨论】:

      【解决方案3】:

      不使用整数的另一个原因 - 一些国家/地区在电话号码上使用前导零,例如所有英国号码都以零开头(通常写成 01234 567890 或 0123 4567890)!

      【讨论】:

        【解决方案4】:
        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 包含人名。如上所述,您不一定要将字符串转换为一般数字,因为它可能包含字母字符。但是,您可以编写自己的处理程序将字母字符转换为数字,并去掉其他所有内容以仅获取数字字符串,然后您可以将其转换为长字符串(电话号码会变得很长)。

        不过,我质疑将电话号码转换为数值的必要性,因为它还可能包含其他必要的字符,例如暂停。此外,无论如何,电话号码代表一串数字而不是代表一个长数字,因此概念数据格式在任何情况下都比 Int 更多。

        【讨论】:

        • 刚刚遇到了这段代码的问题。 ABMultiValueCopyValueAtIndex(container, identifier) 需要一个索引而不是标识符。这将间歇性地崩溃。代码应该是 ABMultiValueCopyValueAtIndex(container, ABMultiValueGetIndexForIdentifier(container, identifier))。请参阅此论坛帖子:forums.macrumors.com/showthread.php?t=705504
        【解决方案5】:

        请注意,如果地址簿条目不包含名称或联系人数据,则此代码在“stringWithString”中崩溃。 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); 
        }
        

        【讨论】:

        • 或者现在,只需NSString *personName = CFBridgingRelease(ABRecordCopyCompositeName(person));
        猜你喜欢
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2012-12-10
        • 2023-03-22
        • 2016-12-26
        • 2011-07-19
        相关资源
        最近更新 更多