从 CNContactProperty 提取电子邮件 - iOS 9
Posted
技术标签:
【中文标题】从 CNContactProperty 提取电子邮件 - iOS 9【英文标题】:Extract email from CNContactProperty - iOS 9 【发布时间】:2016-01-08 23:30:26 【问题描述】:我有一个 ios 应用程序需要访问联系人选择器视图控制器,以允许用户选择联系人属性,例如电子邮件地址/imessage 电子邮件地址的电话号码。
我现在遇到的问题是我无法弄清楚如何解析返回的数据。我已经使用了contactPicker didSelectContactProperty
方法,但是我无法解析我需要的数据。
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty
CNLabeledValue *test = contactProperty.contact.emailAddresses.firstObject;
NSLog(@"%@", test);
NSLog(@"%@", contactProperty.contact.phoneNumbers);
如果你运行上面的代码,你会得到以下响应:
2015-10-11 13:30:07.059 Actions[516:212765] <CNLabeledValue: 0x13656d090: identifier=21F2B1B2-8158-466B-9224-E2036CA07D28, label=_$!<Other>!$_, value=News_Europe@iEUNS.com> 2015-10-11 13:30:07.061 App_Name[516:212765] (
"<CNLabeledValue: 0x13672a500: identifier=6697A0E9-3B91-4566-B26E-83B87979F816, label=_$!<Main>!$_, value=<CNPhoneNumber: 0x13672a660: countryCode=gb, digits=08000391010>>" )
这很好,但是如何从中提取我需要的数据?为什么 NSLog 语句以奇怪的格式返回数据?
感谢您抽出宝贵时间,丹。
【问题讨论】:
【参考方案1】:返回值属于CNLabeledValue 类。为了从他们那里获得价值,比如说,电子邮件,这样做
CNLabeledValue *emailValue = contactProperty.contact.emailAddresses.firstObject;
NSString *emailString = emailValue.value;
如果你想要一个电话号码的值,这就是你将如何检索它
CNLabeledValue *phoneNumberValue = contactProperty.contact.phoneNumbers.firstObject;
CNPhoneNumber *phoneNumber = phoneNumberValue.value;
NSString *phoneNumberString = phoneNumber.stringValue;
因为返回值是CNLabeledValue
,所以你也可以检索电话号码或电子邮件的标签
NSString *emailLabel = emailValue.label; //This may be 'Work', 'Home', etc.
NSString *phoneNumberLabel = phoneNumberValue.label;
【讨论】:
嗯,我明白了。非常感谢。我刚刚从使用旧的 AddressBook 框架升级,所以我一直在努力解决这个问题。再次感谢:) 只有一个问题,我希望用户选择电话号码的电子邮件地址。如何查看他们选择的内容? 我认为该信息将存储在contactProperty.value
、contactProperty.label
、contactProperty.key
等中。我会测试每一个并查看它的输出,因为我从未使用过它在亲自之前。
太棒了,contactProperty.key
完美运行。谢谢克里斯 :)
要获得正确本地化的标签而不是像 "$!对于 swift 3.0:
public func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact)
if let emailValue : CNLabeledValue = contact.emailAddresses.first
txtEmail.text = emailValue.value as String
if let phoneNumber : CNLabeledValue = contact.phoneNumbers.first
txtMobno.text = phoneNumber.value.stringValue
txtFname.text = contact.givenName + " " + contact.familyName
【讨论】:
【参考方案3】:不幸的是,Chris 的回答告诉您如何从返回的 CNLabeledValue 对象中获取值,但没有告诉您如何根据函数功能的 contactProperty 参数来识别选择了哪个 CNLabeledValue。
您需要做的是遍历每个联系人的电子邮件地址,并检查其标识符是否与所选的 contactProperty 标识符匹配。在 didSelectContactProperty 函数中使用以下代码:
NSString *selectedEmail;
for (CNLabeledValue<NSString*>* email in contactProperty.contact.emailAddresses)
if ([email.identifier isEqualToString:contactProperty.identifier])
selectedEmail = (NSString *)email.value;
请注意,我仅使用邮政地址测试了此代码,因此可能需要进一步调整才能使用电子邮件地址。
【讨论】:
【参考方案4】:Here is swift version of Chris answer :
func fatchContacts(store : CNContactStore)
do
let groups = try store.groups(matching: nil)
let predicate = CNContact.predicateForContactsInGroup(withIdentifier: groups[0].identifier)
//let predicate = CNContact.predicateForContactsMatchingName("John")
let keyToFatch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName ) ,CNContactEmailAddressesKey] as [Any]
let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keyToFatch as! [CNKeyDescriptor]) //------------------------------------------------------
//-------------Get Here-----------------------------------------
print(contacts)
print(contacts[0])
let formatter = CNContactFormatter ()
print(formatter.string(from: contacts[0]))
print(contacts[0].givenName)
print(contacts[0].emailAddresses)
let emailValue : CNLabeledValue = contacts[0].emailAddresses.first!;
let email = emailValue.value
print(email)
catch
Just pass the CNContactStore object
【讨论】:
以上是关于从 CNContactProperty 提取电子邮件 - iOS 9的主要内容,如果未能解决你的问题,请参考以下文章
Google Apps 脚本 - 将 gmail 中的数据提取到电子表格中