DiscoverAllIdentities и DiscoverUserIdentity возвращают nil для CKUserIdentity.lookupInfo с iOS 10.3

CKContainer.discoverAllIdentities(completionHandler:), DiscoverUserIdentity(recordID: - обработчик завершения возвращает CKUserIdentity, но .lookupInfo всегда равен нулю, даже если контакты содержат адрес электронной почты, телефон и т. д. Другие свойства, такие как hasiCloudAccount, userRecordID, nameComponents, в порядке. Эта проблема только началась. с последним выпуском Swift 3.1 Кто-нибудь знает, является ли это предполагаемым поведением, поскольку я не смог найти никаких ссылок на изменения CloudKit в примечаниях к выпуску, но это похоже на конфиденциальность.

После дальнейшего расследования выяснилось, что эта проблема может быть связана с недавним обновлением iOS 10.3. При запуске приложения на iPhone 5 с версией 10.2.1 проблема не возникает, и lookupInfo правильно содержит адрес электронной почты.

Представленная ошибка Apple: 31377433

НОВОЕ: Кроме того, если я попытаюсь получить доступ к информации через CKDiscoverAllUserIdentitiesOperation, в частности, userIdentityDiscoveredBlock -> user.nameComponents, результатом будет «пустая строка» для идентификатора Apple, связанного с пользователями младше 12 лет (и, возможно, в «Семейном доступе» план). Я не нашел никакой информации об этом, и поддержка разработчиков Apple также не предложила никакой помощи.


person Wizkid    schedule 31.03.2017    source источник


Ответы (2)


Поскольку я не могу оставить комментарий из-за отсутствия репутации, я должен сделать это так...

Я также отправил ту же ошибку (31397767) и надеюсь, что они ее исправят.

Для CKFetchShareParticipantsOperation необходимо иметь CKUserIdentityLookupInfo. Поскольку нет обходного пути, нам нужно подождать, пока они его исправят.

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

Обновить

Обновление iOS 10.3.1 не решило проблему.

Обновление: решение

Я получил ответ от Apple по поводу этой «проблемы». Вот ответ c&p:

Это ожидаемое поведение, поскольку CKDiscoverAllUserIdentitiesOperation не требует запроса пользователя на доступ к контактам. Если вы хотите превратить эти результаты в участников, вам необходимо запросить доступ к контактам и получить информацию о поиске из контактов самостоятельно с помощью свойства contactIdentifiers.

// Личные данные, обнаруженные с помощью CKDiscoverAllUserIdentitiesOperation, соответствуют записям в локальной базе данных контактов. Эти удостоверения будут иметь заполненные контактные идентификаторы, которые ваше приложение может использовать для получения дополнительной информации об обнаруженных контактах. Для одного обнаруженного пользователя может существовать несколько идентификаторов contactIdentifier, поскольку несколько контактов могут содержать одни и те же адреса электронной почты или номера телефонов.

Обратите внимание, что обнаружение пользователей и поиск участников — это две логически разные вещи: вы можете обнаружить только пользователей, которые сделали себя доступными для обнаружения с помощью -[CKContainer requestApplicationPermission:CKApplicationPermissionUserDiscoverability ...], но вы можете получить участника для любого адреса электронной почты или номера телефона даже если он не соответствует учетной записи iCloud. Вам не нужно обнаруживать пользователей, а затем превращать их в участников — вы можете просто попросить пользователя вашего приложения ввести адреса для добавления участников в общий ресурс.

person Luca    schedule 03.04.2017
comment
Правильно, это то, что я делаю в своем оригинальном выпуске. В моем приложении я запрашиваю доступ следующим образом. Обратите внимание, все это работало до версии 10.3, теперь это не так, и я не могу получить основную информацию из lookupInfo. Подумайте об этом, что хорошего в lookupInfo, если нет никакой информации, кроме имени и фамилии. Вот рабочий процесс, который больше не возвращает детали lookupInfo: fetchUserRecordID ->checkDiscoverability-›requestPermission-›discoverUserIdentity - person Wizkid; 07.04.2017

Я обнаружил, что команда ckContainer.discoverUserIdentity(withEmailAddress... не заполняет результирующее поле CKIdentity.LookupInfo.RecordID, но заполняет поле CKIdentity.RecordID. Мне потребовалось некоторое время, чтобы понять это... (Xcode 12.5. 1, iOS 14.6)

person Tom Wilson    schedule 16.07.2021