如何从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。如果你:
-
使用电子邮件地址创build联系人:
-
编辑联系人,添加电子邮件地址并删除其他电子邮件地址之一:
(请注意,不要只编辑其中一个电子邮件地址,而要添加一个新的电子邮件地址并删除旧的电子邮件地址。)
-
在iOS 7中,如果您遍历电子邮件地址,您将看到:
{ identifier = 1; index = 0; label = "_$!<Work>!$_"; value = "work@gmail.com"; }, { identifier = 2; index = 1; label = "_$!<Other>!$_"; value = "other@gmail.com"; }
这是对的。 (当联系人第一次创build时,标识符为
0
和1
,当我添加“其他”电子邮件地址时,标识符为2
;当我删除“家庭”电子邮件地址时,标识符为0
的电子邮件地址),因此,如果您点击“工作”电子邮件地址,shouldContinueAfterSelectingPerson
将返回1
的CFIndex
,这将转换为CFIndex
为0
,这将正确地返回“工作”电子邮件地址。但是,在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
)将返回一个1
的ABMultiValueIdentifier
(这应该是…它看起来像这个委托方法返回适当的identifier
,但这个编辑logging的ABRecordRef
有错误的标识符…不知道他们是怎么做的!),这转换为CFIndex
为1
,这将正确地返回“其他”电子邮件地址(!)。更糟糕的是,如果您点击“其他”电子邮件地址,
didSelectPerson
将返回2
的ABMultiValueIdentifier
(这应该是),但是如果您尝试检索CFIndex
,则会得到-1
(因为没有这样的ABMultiValueIdentifier
存在),因为应用程序不检查这一点,任何尝试使用ABMultiValueCopyValueAtIndex
与此无效索引将导致崩溃!
这个bug似乎在iOS8 GM种子中得到修复,所以它似乎只是一个testing版问题。