从 iphone 中检索联系人

Posted

技术标签:

【中文标题】从 iphone 中检索联系人【英文标题】:Retrieve contacts from iphone 【发布时间】:2014-01-18 10:53:01 【问题描述】:

我需要在 UITableView 中显示用户手机中可用的所有联系人列表。我可以成功检索到联系人姓名、电话号码。但是当我将数据添加到 NSMutableArray 时,它会添加一些不寻常的字符。不明白问题出在哪里是

-(void)viewDidLoad

  Names=[[NSMutableArray alloc]init];
    ABAddressBookRef allPeople = ABAddressBookCreate();
    CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(allPeople);
    CFIndex numberOfContacts  = ABAddressBookGetPersonCount(allPeople);

    NSLog(@"numberOfContacts---%ld",numberOfContacts);


    for(int i = 0; i < numberOfContacts; i++)
        NSString* name = @"";
        NSString* phone = @"";
        NSString* email = @"";

        ABRecordRef aPerson = CFArrayGetValueAtIndex(allContacts, i);
        ABMultiValueRef fnameProperty = ABRecordCopyValue(aPerson, kABPersonFirstNameProperty);
        ABMultiValueRef lnameProperty = ABRecordCopyValue(aPerson, kABPersonLastNameProperty);

        ABMultiValueRef phoneProperty = ABRecordCopyValue(aPerson, kABPersonPhoneProperty);\
        ABMultiValueRef emailProperty = ABRecordCopyValue(aPerson, kABPersonEmailProperty);

        NSArray *emailArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emailProperty);
        NSArray *phoneArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneProperty);


        if (fnameProperty != nil) 
            name = [NSString stringWithFormat:@"%@", fnameProperty];
        
        if (lnameProperty != nil) 
            name = [name stringByAppendingString:[NSString stringWithFormat:@" %@", lnameProperty]];
        

        if ([phoneArray count] > 0) 
            if ([phoneArray count] > 1) 
                for (int i = 0; i < [phoneArray count]; i++) 
                    phone = [phone stringByAppendingString:[NSString stringWithFormat:@"%@\n", [phoneArray objectAtIndex:i]]];
                
            else 
                phone = [NSString stringWithFormat:@"%@", [phoneArray objectAtIndex:0]];
            
        

        if ([emailArray count] > 0) 
            if ([emailArray count] > 1) 
                for (int i = 0; i < [emailArray count]; i++) 
                    email = [email stringByAppendingString:[NSString stringWithFormat:@"%@\n", [emailArray objectAtIndex:i]]];
                
            else 
                email = [NSString stringWithFormat:@"%@", [emailArray objectAtIndex:0]];
            
        

        NSLog(@"NAME : %@",name);
        NSLog(@"PHONE: %@",phone);
        NSLog(@"EMAIL: %@",email);
        NSLog(@"\n");

        NSMutableDictionary *d=[[NSMutableDictionary alloc]init];
        [d setObject:name forKey:@"Name"];
        [d setObject:phone forKey:@"Phone"];
        [d setObject:email forKey:@"Email"];


        [Names addObject:d];



    
    NSLog(@"%@",Names);

这是名称的 NSLog:


    Email = "";
    Name = Hk;
    Phone = "(975)\U00a0050-1890";    //Actual Number (975)050-1890
,
    
    Email = "";
    Name = Nik;
    Phone = "1\U00a0(234)\U00a0567-890";  //Actual Number :(932)324-1343

为什么要为电话号码添加不寻常的字符... 任何帮助将不胜感激..

【问题讨论】:

phone = [phone stringByAppendingString:... 声明看起来很狡猾! 事实上,您对NSString 的所有使用都是次优的。 【参考方案1】:

这是一个“无间断空间”(参见http://unicode-table.com/en/00A0/)。

这些符号似乎可以通过一些外部同步出现在您的通讯录中。 但我在视觉上没有区别。

如果您在 iPhone 通讯录中输入号码,它将自动格式化为括号和数字之间的真实不可移动空格。您的情况并非如此。你在视觉上根本没有空间。所以在代码中你有不间断的空格。

【讨论】:

好的。你能告诉我我该怎么做才能删除它们吗? phone = [phone stringByReplacingOccurrencesOfString:@"\U00a0" withString:@""]; 我宁愿用 /\D// 之类的正则表达式清除电话号码 - 删除所有非数字。 否,当我用字符串替换时出现错误“不完整的通用字符名称”错误。 尝试@"\u00a0" 与常规 u 或在失败的情况下应用正则表达式替换 @"\D" -> @""。使用与选项 NSRegularExpression 相同的方法。

以上是关于从 iphone 中检索联系人的主要内容,如果未能解决你的问题,请参考以下文章

从手机的电话簿中检索联系人

如何从整个联系人中检索唯一的电子邮件 ID?

从android中的电话簿中检索whatsapp联系人

我们如何从 API 中检索对讲信使用户/联系人?

在使用 SimpleCursorAdapter 时从联系人 ID 中检索和显示联系人姓名

从 Android 中的 URI 检索联系人电话号码