如何从iOS联系人中只检索select属性?

我们遇到了在某些设备上从联系人数据库返回错误select的问题。 有没有办法修改下面的代码,只返回从联系人信息中select的项目? 在这种情况下,我们希望从个人联系人中精确select的电子邮件地址被退回。

先谢谢您的帮助! 下面是代码

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property: (ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{ NSMutableDictionary *contactInfoDict = [[NSMutableDictionary alloc] initWithObjects:@[@"", @"", @""] forKeys:@[@"first_name", @"last_name", @"email"]]; // Use a general Core Foundation object. CFTypeRef generalCFObject = ABRecordCopyValue(person, kABPersonFirstNameProperty); // Get the first name. if (generalCFObject) { [contactInfoDict setObject:(__bridge NSString *)generalCFObject forKey:@"first_name"]; CFRelease(generalCFObject); } // Get the last name. generalCFObject = ABRecordCopyValue(person, kABPersonLastNameProperty); if (generalCFObject) { [contactInfoDict setObject:(__bridge NSString *)generalCFObject forKey:@"last_name"]; CFRelease(generalCFObject); } // Load selected email addre' if (property == kABPersonEmailProperty) { ABMultiValueRef emails = ABRecordCopyValue(person, property); CFIndex ix = ABMultiValueGetIndexForIdentifier(emails, identifier); CFStringRef email = ABMultiValueCopyValueAtIndex(emails, ix); emailAccount = (__bridge NSString *)(email); [contactInfoDict setObject:emailAccount forKey:@"email"]; if (email) CFRelease(email); if (emails) CFRelease(emails); } // init array if (_arrContactsData == nil) { _arrContactsData = [[NSMutableArray alloc] init]; } // Send contact to server [self sendContact:contactInfoDict]; // Set data for contacts [_arrContactsData addObject:contactInfoDict]; // Reload the table view data. [self.myTable reloadData]; // Dismiss the address book view controller. [_addressBookController dismissViewControllerAnimated:YES completion:nil]; return NO; } 

你的代码是正确的。

用户是否遇到了使用iOS 8的问题? 我在iOS 8 beta 6中发现了一个bug。如果你:

  1. 使用电子邮件地址创build联系人:

    创建联系人

  2. 编辑联系人,添加电子邮件地址并删除其他电子邮件地址之一:

    更改联系资料

    (请注意,不要只编辑其中一个电子邮件地址,而要添加一个新的电子邮件地址并删除旧的电子邮件地址。)

  3. 在iOS 7中,如果您遍历电子邮件地址,您将看到:

     { identifier = 1; index = 0; label = "_$!<Work>!$_"; value = "work@gmail.com"; }, { identifier = 2; index = 1; label = "_$!<Other>!$_"; value = "other@gmail.com"; } 

    这是对的。 (当联系人第一次创build时,标识符为01 ,当我添加“其他”电子邮件地址时,标识符为2 ;当我删除“家庭”电子邮件地址时,标识符为0的电子邮件地址),因此,如果您点击“工作”电子邮件地址, shouldContinueAfterSelectingPerson将返回1CFIndex ,这将转换为CFIndex0 ,这将正确地返回“工作”电子邮件地址。

    但是,在iOS 8 Beta 6中, ABMultiValueRef被错误地表示为:

     { identifier = 0; index = 0; label = "_$!<Work>!$_"; value = "work@gmail.com"; }, { identifier = 1; index = 1; label = "_$!<Other>!$_"; value = "other@gmail.com"; } 

    这些标识符不正确。 更糟糕的是,如果您点击“工作”电子邮件地址, didSelectPerson (将取代已弃用的shouldContinueAfterSelectingPerson )将返回一个1ABMultiValueIdentifier (这应该是…它看起来像这个委托方法返回适当的identifier ,但这个编辑logging的ABRecordRef有错误的标识符…不知道他们是怎么做的!),这转换为CFIndex1 ,这将正确地返回“其他”电子邮件地址(!)。

    更糟糕的是,如果您点击“其他”电子邮件地址, didSelectPerson将返回2ABMultiValueIdentifier (这应该是),但是如果您尝试检索CFIndex ,则会得到-1 (因为没有这样的ABMultiValueIdentifier存在),因为应用程序不检查这一点,任何尝试使用ABMultiValueCopyValueAtIndex与此无效索引将导致崩溃!

这个bug似乎在iOS8 GM种子中得到修复,所以它似乎只是一个testing版问题。