与 Mac 地址簿 API 不同,iOS 地址簿 API 不包含 ABGetMe 函数。ABGetMe 通过尝试从联系人设置中读取 我的信息 来绕过这种限制。
如果找不到 我的信息,那么 ABGetMe 会尝试将配置的电子邮件账户地址与地址簿中的记录匹配,从而找到 我 的记录。
如果仍然找不到 我 的记录,那么 ABGetMe 最后会尝试从设备名称中提取设备所有者的全名,以便找到 我 的记录。这种技术由 John Feminella 在 Quora 上对他关于 Square 如何知道我在他们的应用程序注册过程中输入的名字 的答案中进行了说明。
ABGetMe.h
和 ABGetMe.m
拷贝到您的 Xcode 项目中使用 ABGetMe()
函数,并且别忘了检查结果是否不是 NULL
。
ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef me = ABGetMe(addressBook);
if (me) {
// do something with "me"
}
CFRelease(addressBook);
ABGetMe 由于使用了未经文档化的 API,违反了 iPhone 开发者许可协议第 3.3.1 条,所以不符合 App Store 的法规要求。但从技术上讲,它是符合 App Store 的法规要求的,因为它将能够通过 App Store 的验证。此外,即使未来未经文档化的 API 发生变化,它也不会崩溃。
您可以通过将文件的顶部 ABGETME_ENABLE_PRIVATE_APIS
设置为 0
而不是 1
来禁用私人 API。请注意,禁用私人 API 将显著降低找到 我 的记录的可能性。禁用私人 API 后,找到 我 的记录的唯一方法(即匹配设备名称)仅在设备所有者从未更改默认设备名称时才有效。