2014-12-19 6 views
1

Я пытаюсь использовать CloudKit в моем приложении IOS, но когда я пытаюсь создать новую запись для User типа записи (типа записи называется Users), я получаю эту ошибку:СОЗДАТЬ операция не разрешена

<CKError 0x7fb80947ffb0: "Permission Failure" (10/2007); 
server message = "CREATE operation not permitted"; 
uuid = 8C4C7B60-E3F4-42FC-9551-D3A76A6FF9D6; 
container ID = "iCloud.com.jojodmo.Blix"> 

Чтобы создать новую запись, я использую этот код в viewDidLoad():

UserCKManager.create(
    CloudKitUser(
     email: "[email protected]", password: "password", salt: "1AF4E759B20FEC32", 
     username: "jojodmo", posts: [], biography: "This is my bio", 
     firstName: "John", lastName: "Doe", flags: [], 
     profilePicture: UIImage(), downVotesGiven: 1, downVotesRecieved: 2, 
     upVotesGiven: 3, upVotesRecieved: 4, pictureProvided: false), callback: nil) 

Что создает новый CloudKitUser:

init(email: String, password: String, salt: String, username: String, posts: [String], biography: String, firstName: String, lastName: String, flags: [String], profilePicture: UIImage, downVotesGiven: Int, downVotesRecieved: Int, upVotesGiven: Int, upVotesRecieved: Int, pictureProvided: Bool){ 
    self.ready = false 
    record = CKRecord(recordType: "Users") 
    self.email = email 
    self.password = password 
    self.salt = salt 
    self.username = username 
    self.posts = posts 
    self.biography = biography 
    self.firstName = firstName 
    self.lastName = lastName 
    self.flags = flags 
    self.profilePicture = profilePicture 
    self.downVotesGiven = downVotesGiven 
    self.downVotesRecieved = downVotesRecieved 
    self.upVotesGiven = upVotesGiven 
    self.upVotesRecieved = upVotesRecieved 
    self.pictureProvided = pictureProvided 
    self.ready = true 
} 

А затем пытается создать запись с ним:

class func create(user: User, callback: ((success: Bool, user: User?) ->())?){ 
    let ckUser = CloudKitUser(user: user) 
    //I've also tried using CKContainer.defaultContainer().privateCloudDatabase, and I get the same error 
    CKContainer.defaultContainer().publicCloudDatabase.saveRecord(ckUser.record){(record, error) in 
     if(error != nil){ 
      println("An error occurred: \(error)") 
      callback?(success: false, user: nil) 
     } 
     else{ 
      println("Record saved successfully") 
      callback?(success: true, user: ckUser) 
     } 
    } 
} 

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

Я пытаюсь запустить это на iOS имитатора (я подписал ICloud на него)

+0

Это похоже на проблему с разрешением. Вы можете напрямую обращаться к базе данных с одним и тем же пользователем? Если да, можете ли вы создать свою запись с прямым доступом? Я считаю, что ответ для первого - это да, а второй - нет. Вы должны предоставить пользователю базы данных разрешение на создание. –

+0

@LajosArpad Первый ответ - да, но второй ответ тоже нет, как я могу дать пользователю создать разрешение на создание базы данных? Я чувствую, что я бы попробовал это, если бы знал, как – Jojodmo

ответ

1

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

+0

Спасибо, есть ли способ получить идентификатор пользователя currnet, поэтому я могу запросить их пароль и имя пользователя? – Jojodmo

+0

Текущий пользователь iCloud будет иметь только идентификатор, имя и фамилию. Вы можете добавить свое собственное поле пароля, но почему ваш пользователь должен войти в систему дважды? его уже вошли в iCloud. Вы можете получить свой идентификатор, используя fetchUserRecordIDWithCompletionHandler на контейнере. –

0

В дополнение к ответу Эдвина, это вполне возможно, чтобы сохранить пользовательские поля в общественногоUsers RECORDTYPE, но вам нужно, чтобы получить CKRecordID для пользователя первого (через CKContainerfetchUserRecordID() или discoverUserIdentity()), а затем построить CKRecord на Users используя этот идентификатор.

Кроме того, если вы используете CKModifyRecordsOperation, убедитесь, что значение savePolicy установлено равным .changedKeys, чтобы разрешить обновление.

Смежные вопросы