Спасибо, что нашли время, чтобы прочитать этот пост. Я довольно новичок в кодировании, поэтому, возможно, мои проблемы с попыткой реализовать CKShare с SwiftUI связаны с базовым пониманием концепции c, но я работал над этим несколько дней, и я не могу понять это самостоятельно.
Я проверил это: "SwiftUI и UICloudSharingController ненавидят друг друга" , но я не смог реализовать предложенное решение, возможно потому что я начал непосредственно с SwiftUI и не понимаю, как достаточно хорошо работает Swift.
Я хотел бы поделиться CKRecord в пользовательской зоне пользователя личная база данных . Я бы не стал использовать стандартные экраны Apple для добавления и удаления людей ( UICloudSharingController ), поскольку я обнаружил, что это не соответствует естественному путешествию моих пользователей.
Я кодировал строки ниже, чтобы User1 для создания CKShare и включения в качестве участников CKUserIdentit из User2 . Затем я захватил url для User2 , чтобы они могли принять общий ресурс.
На панели инструментов Cloudkit я вижу " cloudkit.share"запись типа в личной базе данных User1 . Пользователь2 действительно отображается в поле Обмен участниками Поле как Тип: Пользователь и Принятие: Приглашено .
Однако один раз Пользователь2 открывает URL-адрес в браузере как зарегистрированный пользователь iCloud, отображается следующая ошибка :
iCloud перестал отвечать
ОТЧЕТНАЯ ОШИБКА ОШИБКИ Требуется непустая строка.
ОТЧЕТНЫЙ ОШИБКА ТИПА UNHANDLED_EXCEPTION
ОШИБКА КОНТЕКСТА undefined
Кто-нибудь имел дело с чем-то подобным ранее? Есть ли другой способ включить известного пользователя приложения в CKShare ?
Заранее благодарен за помощь.
Вот мой код:
let share = CKShare(rootRecord: recordEquipo)
share[CKShare.SystemFieldKey.title] = "Equipo" as CKRecordValue?
share[CKShare.SystemFieldKey.shareType] = "Some type" as CKRecordValue?
let fetchParticipantsOperation: CKFetchShareParticipantsOperation = CKFetchShareParticipantsOperation(userIdentityLookupInfos: [CKUserIdentity.LookupInfo(emailAddress: DTMemail)] )
fetchParticipantsOperation.fetchShareParticipantsCompletionBlock = {error in
if let error = error {
print("error for completion" + error.localizedDescription)
DispatchQueue.main.async {
completion(.failure(error))
}
}
}
fetchParticipantsOperation.shareParticipantFetchedBlock = {participant in
participant.permission = .readWrite
share.addParticipant(participant)
let modifyOperation: CKModifyRecordsOperation = CKModifyRecordsOperation(recordsToSave: [recordEquipo, share], recordIDsToDelete: nil)
modifyOperation.savePolicy = .ifServerRecordUnchanged
modifyOperation.perRecordCompletionBlock = {record, error in
if let error = error {
print("error for completion" + error.localizedDescription)
completion(.failure(error))
}
}
modifyOperation.modifyRecordsCompletionBlock = {records, recordIDs, error in
guard let ckrecords: [CKRecord] = records, let _: CKRecord = ckrecords.first, error == nil else {
print("error in modifying the records " + error!.localizedDescription)
completion(.failure(error!))
return
}
if (share.url != nil) {
completion(.success(share.url!))}
}
baseDatosPrivada.add(modifyOperation)
}
contenedor.add(fetchParticipantsOperation)