在iOS9 CloudKit / ABPerson(ABAddressBook)

时间:2015-06-09 08:24:28

标签: abaddressbook cloudkit ios9 abperson

iOS9弃用了用户信息功能for CloudKitABPerson

e.g。在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。

2 个答案:

答案 0 :(得分:4)

对于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) ")   }

答案 1 :(得分:3)

documentation for CKDiscoverAllContactsOperation中,您可以看到:

  

搜索用户的地址簿不会返回任何个人信息   有关用户联系人的数据。搜索仅返回的ID   相应的用户记录,仅包含您的应用所放置的数据   那里。 CloudKit使用通讯簿信息来识别用户   当前用户知道的应用程序。因为系统访问了   地址簿而不是您的应用程序,系统不显示提示   发生访问时的用户。

查看CloudKit仪表板时,您可以看到User表中也没有名称。所以你也不能拿它。

我认为Apple正在匿名提供服务。你必须自己实现一些东西,以便为id附加一个名字。如您所述,您可以使用设备名称,也可以让用户自己输入他的名字。

我的第一个想法是首先使用ABAddressBookCopyArrayOfAllPeople查询所有联系人,然后使用CKDiscoverUserInfosOperation为每封电子邮件查找所有电子邮件,以实现此目的。但显然在iOS 9中也停止了一个。

Apple似乎停止访问所有个人数据。当你转到prerelease library并过滤地址时,你仍会看到很多引用。但是,只要您转到详细信息页面,您就会看到所有内容都被弃用。