cloudkit错误没有为资产收到authToken

时间:2017-07-08 06:50:14

标签: ios swift cloudkit

运行以下代码时,为什么会出现此错误? :

  

"内部错误" (1/1000); "没有收到authToken资产"

我认为它与最后一行中的setObject代码有关。

let documentsDirectoryPath:NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
var imageURL: URL!

let imageData = UIImageJPEGRepresentation(self.newImage, 1.0)
let path:String = documentsDirectoryPath.appendingPathComponent(self.newImage.description)
try? UIImageJPEGRepresentation(self.newImage, 1.0)!.write(to: URL(fileURLWithPath: path), options: [.atomicWrite])
imageURL = URL(fileURLWithPath: path)
try? imageData?.write(to: imageURL, options: [.atomicWrite])

let imageAsset:CKAsset? = CKAsset(fileURL: URL(fileURLWithPath: path))


curImages = record["Images"] as! [CKAsset]
curImages.append(imageAsset!)

print("saving image")
record.setObject(curImages as CKRecordValue?, forKey: "Images")

2 个答案:

答案 0 :(得分:4)

我也遇到过这种情况。它似乎是cloudkit中的一个错误,而且 - 从我所知道的 - 当你试图重新使用"资产创建链的任何部分时就会发生这种错误。"

换句话说,您有一些初始数据,您从该数据创建图像,将其写入文件,将该文件加载到CKAsset,然后将CKRecrod加载到for (int i = 0; i <= maxPlayers; i++) { int tempVal = 0xf; NSData *tempData = [[NSData alloc] initWithBytes:&tempVal length:sizeof(tempVal)]; NSString *tempDataFilepath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"temp%d.dat",i]]; [tempData writeToFile:tempDataFilepath atomically:YES]; NSURL *tempDataURL = [NSURL fileURLWithPath:tempDataFilepath]; someArray[i] = [[CKAsset alloc] initWithFileURL:tempDataURL ]; } someRecord[SOME_FIELD_NAME] = someArray; 。在我的实验中,如果你重新使用这些组件中的任何一个......或者它们恰好相同(也就是说,你创建了一个图像,那么你恰好在以后创建一个新的但相同的图像)你&# 39;我会看到这个错误。

例如,以下代码可靠地重新创建&#34; no auth token&#34;保存记录时出错。它所做的就是创建一个资产数组并将其放入记录中:

int tempVal = i; //force the temp value to be different every time

只需将第三行更改为:

CKAsset

完全解决错误。

此外,即使我尝试使用先前已使用的 CKAsset **中的值,也会出现此错误 int tempVal = 0xf 例如,在第一个资源中使用int secondTempVal = 0xf,然后在另一个CKAsset中使用CKAsset也会生成&#34;无身份验证令牌&#34;错误。

在我的情况下,我能够强制资产价值始终是一个独特的价值,并完全解决了问题。在您的情况下,我建议以下可能的解决方法:

  1. 检查您是否为资产使用相同的图片。如果是,请尝试稍微修改每个新<div id="container"> <div id="box"></div> </div> <select id="menu"> <option value="red">Red</option> <option value="blue">Blue</option> <option value="black">Black</option> <option value="green">Green</option> </select> 的图像。
  2. 如果必须重复使用相同的图像,请在设置每个资源后尝试保存记录。我不知道这是否能解决问题,而且肯定会增加您的网络流量。但值得一个实验,看看它是否有帮助。
  3. 在这个问题Saving CKAsset to CKRecord in CloudKit produces error: "No authToken received for asset"中,OP能够创建最终解决问题的图像文件的单独副本。
  4. 打开Apple的错误。我没有打扰这样做,因为我已经厌倦了看着类似的错误报告多年来一直没有引起注意。但谁知道,你可能会有更好的运气。

答案 1 :(得分:1)

这不是对特定问题的答案(已由公认的答案解决),但是它解决了另一个会产生相同错误消息的问题,因此它可能对其他人有用:

我有一个使用CoreData + Cloudkit和.public数据库的应用程序,即我对NSPersistentCloudKitContainer使用的描述

description.cloudKitContainerOptions!.databaseScope = .public  

每当我更改CloudKit架构时,都必须使用来重新初始化

do {
    try self.initializeCloudKitSchema()
} catch {
    print("Could not initialize schema, error \(error)")
}

这会产生错误

"Internal Error" (1/1000); "No authToken received for asset"  

尽管我没有在模型中使用任何资产。

我现在意识到,它与.public数据库有关:
一旦我注释掉将数据库范围设置为.public的指令后,重新初始化就可以正常工作了。
现在,CloudKit模式独立于数据库类型(.private.public)。因此,架构的重新初始化需要以下条件:

  • 将数据库设置为.private(默认值)
  • 执行初始化代码
  • 将数据库设置为.public
  • 禁用初始化代码

PS:我知道我现在应该写一个错误报告,但是我停止这样做:我的错误报告(大约15个)几乎都没有得到答复或处理,因此这是不值得的。