在 iOS9 CloudKit / ABPerson (ABAAddressBook) 中查找用户名或名字/姓氏
Posted
技术标签:
【中文标题】在 iOS9 CloudKit / ABPerson (ABAAddressBook) 中查找用户名或名字/姓氏【英文标题】:Find User Name or First/Last Name in iOS9 CloudKit / ABPerson (ABAddressBook) 【发布时间】:2015-06-09 08:24:28 【问题描述】:ios9 弃用用户信息功能 for CloudKit 和 ABPerson。
例如在 CKDiscoveredUserInfo 的属性中
firstName" 在 iOS 9.0 中已弃用
lastName" 在 iOS 9.0 中已弃用
我想要之前在 iOS8 CloudKit 中提供的姓氏和名字。
如何在 iOS9 CloudKit、ABPerson 或其他东西中检索类似信息?
Short of grace method is this
[[UIDevice currentDevice] name];
NSArray *nameArray = [[NSHost currentHost] names];
NSString *user = [nameArray objectAtIndex:0];
两者都打印,例如约翰的 iPhone。
【问题讨论】:
好问题。我建议等待本周 WWDC 的 CloudKit 会议,了解这些变化及其含义。 【参考方案1】:对于iOS9,通过Contact Framework获取用户个人联系方式
Contacts 框架提供了一个 Objective-C 和 Swift API 来访问 用户的联系信息。
替换 ABAdressBook
此框架可在所有 Apple 平台上使用,并取代 iOS 和 OS X 中的地址簿框架。
具体来说,CNContact
CNContact 是一个线程安全的类,代表一个不可变的 联系人属性的值对象,例如名字和电话 联系人号码。
获取联系人
您可以使用联系人存储 (CNContactStore) 获取联系人,该存储 表示用户的联系人数据库
搜索用户的联系人数据库(iOS 9.0 中的新功能)
例如,名字、姓氏、生日、电话号码等。
let store = CNContactStore()
let contacts = try store.unifiedContactsMatchingPredicate(CNContact.predicateForContactsMatchingName("Appleseed"), keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey])
let contact = contacts!.first //assuming contain at least one contact
// Checking if phone number is available for the given contact.
if (contact.isKeyAvailable(CNContactPhoneNumbersKey))
print("\(contact.givenName) \(contact.familyName)")
else
//Refetch the keys
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey]
let refetchedContact = try store.unifiedContactWithIdentifier(contact.identifier, keysToFetch: keysToFetch)
print("\(refetchedContact.givenName) \(refetchedContact.familyName)")
搜索当前用户信息
if let personInfo:CNContact = CKDiscoveredUserInfo.displayContact
println("first name: \(personInfo.givenName) last name: \(personInfo.familyName) ")
【讨论】:
【参考方案2】:在documentation for CKDiscoverAllContactsOperation你可以看到这个:
搜索用户通讯录不返回任何个人信息 有关用户联系人的数据。搜索只返回 相应的用户记录,其中仅包含您的应用放置的数据 那里。 CloudKit 使用通讯录信息来识别用户 当前用户知道的应用程序。因为系统访问 通讯录代替你的app,系统不显示提示 当访问发生时向用户发送。
查看 CloudKit 仪表板时,您可以看到 User 表中也没有名称。所以你也无法获取它。
我假设 Apple 正在使服务匿名。您必须自己实现一些东西才能将名称附加到 id。如您所述,您可以使用设备名称,也可以让用户自己输入其名称。
我的第一个想法是通过首先使用ABAddressBookCopyArrayOfAllPeople 查询所有联系人,然后使用CKDiscoverUserInfosOperation 查找每封电子邮件的所有电子邮件来实现这一点。但显然,iOS 9 中也停止了这一功能。
Apple 似乎正在停止访问所有个人数据。当您转到prerelease library 并过滤地址时,您仍然会看到很多参考。但是,一旦您转到详细信息页面,您只会看到所有内容都已弃用。
【讨论】:
谢谢。它启发了我的回答。喜欢你在 Github 上使用 EV CloudKit 所做的工作以及在那里与你的对话。以上是关于在 iOS9 CloudKit / ABPerson (ABAAddressBook) 中查找用户名或名字/姓氏的主要内容,如果未能解决你的问题,请参考以下文章
Cloudkit:CKDatabaseOperation 不适用于蜂窝网络
无法访问 CloudKit 出现奇怪错误:内部错误 (1/2005)