2014-12-19 191 views
1

我试图利用CloudKit在我的iPhone应用程序,但是当我试图创建一个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

这似乎是一个权限问题。你可以直接用同一个用户访问数据库吗?如果是这样,你可以创建你的记录直接访问?我相信第一个答案是肯定的,第二个答案是否定的。您需要为数据库用户创建权限。 – 2014-12-19 06:22:37

+0

@LajosArpad第一个答案是肯定的,但第二个答案IS也不是,我怎样才能给数据库用户创建权限?我觉得我会试图,如果我知道如何 – Jojodmo 2014-12-19 06:36:30

回答

1

用户是已经存在CloudKit一个特殊的记录类型。你不应该自己创建记录。记录将自动为正在使用您的应用的新用户创建。 您也无法创建订阅并查询用户记录类型。您只能通过ID直接查询用户记录。您可以将额外的数据存储在用户recordType中,但我认为在您的情况下,如果您为其他类型的记录类型命名,则会更好。

+0

谢谢,有没有办法获得currnet用户的id,所以我可以查询他们的密码和用户名? – Jojodmo 2014-12-19 15:44:29

+0

当前的iCloud用户只有一个ID,名字和姓氏。您可以添加您自己的密码字段,但为什么您的用户需要登录两次?它已经陷入了iCloud。你可以使用容器上的fetchUserRecordIDWithCompletionHandler来获得你的id。 – 2014-12-19 17:34:11

0

除了埃德温的回答,这是完全可行的自定义字段保存到公共Users RECORDTYPE,但你需要(通过CKContainerfetchUserRecordID()discoverUserIdentity())来检索CKRecordID用户,然后再建立CKRecordUsers使用该ID。

此外,如果您使用的是CKModifyRecordsOperation,请确保savePolicy设置为.changedKeys以允许更新通过。