iOS9 联系人框架缺少 phone 号码标签?

iOS9 Contacts Framework missing phone number labels?

我正在实施一个仅支持 iOS9+ 的新 iOS 应用程序。因此,我们正在使用新的联系人框架来访问存储在设备上的联系人的 phone 号码。

CNPhoneNumber 定义了不同类型 phone 号码的标签,但它包含的类型列表比实际的 iOS 联系人屏幕小得多。例如,在我的 iPhone 上,我可以将 "Work" 类型的号码添加到联系人,但 SDK 中没有相应的 CNLabelPhoneNumberWork 标签。我是在看错地方还是就是这样?联系人可能有一堆我无法识别的数字,除非我将 Apple 的“$!!$”字符串硬编码到我的应用程序?

据我所知,CNPhoneNumber 只提供这些标签:

@available(iOS 9.0, *)
public let CNLabelPhoneNumberiPhone: String
@available(iOS 9.0, *)
public let CNLabelPhoneNumberMobile: String
@available(iOS 9.0, *)
public let CNLabelPhoneNumberMain: String
@available(iOS 9.0, *)
public let CNLabelPhoneNumberHomeFax: String
@available(iOS 9.0, *)
public let CNLabelPhoneNumberWorkFax: String
@available(iOS 9.0, *)
public let CNLabelPhoneNumberOtherFax: String
@available(iOS 9.0, *)
public let CNLabelPhoneNumberPager: String

当我将号码添加到我的联系人时,可用类型列表要长得多。

你是正确的,因为这些应该是 phone 数字标签的唯一预定义标签。

但是,如 Apple 文档中所述:Phone 数字标签

These constants are predefined labels that can be used in a CNLabeledValue object having a CNPhoneNumber value.

你仍然会从 CNLabeledValue label 属性 得到一个 NSString*(注意 而不是 enum) ,它将包含联系人中显示的任何内容。因此,请做好准备,您可能还会获得由 "Custom Labels" 选项创建的奇数输入用户。


关于 "Contacts may have a bunch of numbers that I am unable to identify unless I hardcode Apple's "$!!$" 字符串到我的应用程序的问题?"

答案是

phoneNumbers 一个 CNContact:

This property is an array of CNLabeledValue objects, each of which has a label and a CNPhoneNumber value.

当你遍历它时,.label 会给你类似 'Work' 的东西,而 .value 会给出你想要的实际数字。

编辑:

有趣的是,在Contacts Framework Reference中出现了CNLabelHomeCNLabelWork,在CNLabeledValueClass中出现了"Generic Labels"个常量。