Найти имя пользователя или имя / фамилию в iOS9 CloudKit / ABPerson (ABAddressBook)

iOS9 не поддерживает функции информации о пользователях для CloudKit и ABPerson.

например, в свойствах CKDiscoveredUserInfo

firstName "Не рекомендуется в iOS 9.0

lastName "Не рекомендуется в iOS 9.0

Я хочу фамилию и имя, как было ранее указано в iOS8 CloudKit.

Как получить подобную информацию в iOS9 CloudKit, ABPerson или что-то еще?

Если не считать изящества метод это

[[UIDevice currentDevice] name]; 

 NSArray *nameArray = [[NSHost currentHost] names];
 NSString *user = [nameArray objectAtIndex:0];

Оба печатают, например, John'iPhone.

2 ответа

Для iOS9 получение личной контактной информации пользователя через Contact Framework

Структура контактов предоставляет 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) ")   }

В документации по CKDiscoverAllContactsOperation вы можете увидеть это:

Поиск в адресной книге пользователя не возвращает никаких личных данных о контактах пользователя. Поиск возвращает только идентификаторы соответствующих записей пользователя, которые содержат только данные, которые ваше приложение помещает туда. CloudKit использует информацию адресной книги для идентификации пользователей приложения, которые знает текущий пользователь. Поскольку система обращается к адресной книге, а не к вашему приложению, система не отображает подсказку пользователю, когда происходит такой доступ.

При просмотре панели мониторинга CloudKit вы можете увидеть, что в таблице User также нет имени. Таким образом, вы также не можете получить его.

Я предполагаю, что Apple делает сервис анонимным. Вы должны реализовать что-то самостоятельно, чтобы прикрепить имя к идентификатору. Как вы описали, вы можете использовать имя устройства или позволить самому пользователю ввести свое имя.

Моя первая идея состояла в том, чтобы реализовать это, сначала запросив все контакты с помощью ABAddressBookCopyArrayOfAllPeople, а затем просматривая все электронные письма, используя CKDiscoverUserInfosOperation для каждого электронного письма. но, видимо, это было также прекращено в iOS 9.

Похоже, Apple прекращает доступ ко всем личным данным. Когда вы зайдете в пререлизную библиотеку и отфильтруете адрес, вы все равно увидите много ссылок. Но как только вы перейдете на страницу с подробностями, вы увидите, что все устарело.

Другие вопросы по тегам