Найдите имя пользователя или имя/фамилию в 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];

Оба печатают, например. Джон'Айфон.


person Kevin    schedule 09.06.2015    source источник
comment
Хороший вопрос. Предлагаю дождаться сессии по CloudKit на этой неделе на WWDC, чтобы узнать об изменениях и их значении.   -  person harryhorn    schedule 09.06.2015


Ответы (2)


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

Платформа контактов предоставляет API-интерфейсы Objective-C и Swift для доступа к контактной информации пользователя.

Замена ABAdressBook

Эта структура доступна на всех платформах Apple и заменяет структуру адресной книги в iOS и OS X.

В частности, CNСвязаться

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) ")   }
person Kevin    schedule 13.06.2015

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

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

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

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

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

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

person Edwin Vermeer    schedule 12.06.2015
comment
Спасибо. Это вдохновляет мой ответ. Мне нравится ваша работа с EV CloudKit на Github и общение с вами там. - person Kevin; 13.06.2015