使用联系人

Working with Contacts

联系人相对较新,在使用 urlAddresses: 和 emailAddresses: 时遇到了困难,希望有人能指出正确的方向。

目前有效的:

我能够读取我的地址簿并将组织名称、联系人 phone 号码等提取到我的变量中以供使用。但是,我似乎无法破译 urlAddresses: 和 emailAddresses: 并且 Apple API 参考让我循环。

这基本上是对我有用的。假设 myContact 是使用 Contacts API 从 AddressBook 中成功提取的联系人记录。以下所有工作:

someStringVariable = myContact.organizationName
someStringVariable = myContact.postalAddress[0].value.street
someStringVariable = myContact.phoneNumbers[0].value.value(forKey: "digits") as! String

现在,尝试将相同的逻辑应用于 urlAddresses: 和 emailAddresses: 会导致我的程序崩溃。我知道我错过了什么,但无法弄清楚我错过了什么。我试过:

someStringVariable = myContact.urlAddresses[0].value as String

一时兴起,我尝试了类似的方法:

someStringVariable = myContact.urlAddresses[0].value.url as String
someStringVariable = myContact.urlAddresses[0].value.value(forKey: "URL") as! String

我的第一个想法是值 属性 存储为 NSString,但 API 参考列表 urlAddresses: 作为 CNLabeledValue,进一步挖掘发现 Label 是一个 NSString,但值 属性 存储为 "value type".

通过 Apple 的 API 参考中的链接尝试查找值类型,我从 CNContact 开始,它引导我找到 urlAddresses:,然后转到 CNLabledValue。这让我找到了 Value: Value Type,点击它又回到了 CNContact...所以我陷入了无限循环:)

任何人都可以直接向我解释如何将 URL 提取为字符串吗?我想也许我可以用一个 value(forKey:) 来做到这一点,但我似乎无法找到如果它们存在的话 Keys 会是什么,而且我不太确定如何打印出 urlAddresses: 的内容而不会导致崩溃。

我在使用 emailAddresses 时遇到了完全相同的问题:所以我假设我在这两个问题上都犯了同样的错误。

感谢大家的帮助!

好的..所以我找到了解决方案,这是一个完全的菜鸟问题。

我没有加载 urlAddresses 或 emailAddresses 的密钥,所以它们不存在。

呸!

按如下方式添加了这些键,我的代码现在可以正常工作了。

let keysToFetch = [
                CNContactFormatter.descriptorForRequiredKeys(for: .fullName),
                CNContactPostalAddressesKey,
                CNContactEmailAddressesKey,
                CNContactPhoneNumbersKey,
                CNContactUrlAddressesKey] as [Any]

基本上,我追着尾巴找错地方了!