在 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)

xcode 7 和 cloudkit 的非常奇怪的问题

CKQueryOperation iOS 9 只能在插入时工作

在 CloudKit 中获取私有用户记录

CloudKit - 通过 URL 在用户之间共享文件