【问题标题】:cloudkit error no authToken received for assetcloudkit 错误未收到资产的 authToken
【发布时间】:2017-12-12 11:55:02
【问题描述】:

为什么我在运行以下代码时会收到此错误? :

“内部错误”(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")

【问题讨论】:

    标签: ios swift cloudkit


    【解决方案1】:

    我也遇到过。这似乎是 cloudkit 中的一个错误,而且——据我所知——当您尝试重用“资产创建链”的任何部分时,就会发生这种情况。

    换句话说,您有一些初始数据,您从该数据创建图像,将其写入文件,将该文件加载到CKAsset,然后将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; 
    

    只需将第三行更改为:

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

    彻底解决错误。

    此外,此错误发生 即使我尝试在一个 不同 CKAsset **中使用一个值,该值已在之前的@987654328 中使用过@ 例如,在第一个资产中使用int tempVal = 0xf,然后在另一个CKAsset 中使用int secondTempVal = 0xf 也会产生“无身份验证令牌”错误。

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

    1. 检查您的资产是否使用相同的图像。如果是,请尝试稍微修改每个新 CKAsset 的图像。
    2. 如果您必须重复使用相同的图像,请在设置每个资产后尝试保存记录。我不知道这是否能解决问题,而且它肯定会增加您的网络流量。但值得一试,看看是否有帮助。
    3. 在这个问题Saving CKAsset to CKRecord in CloudKit produces error: "No authToken received for asset" 中,OP 能够创建最终解决问题的图像文件的单独副本。
    4. 打开 Apple 的错误。我没有费心去做这件事,因为我已经厌倦了看到类似的错误报告多年来没有引起注意。但谁知道呢,你可能会有更好的运气。

    【讨论】:

    • 问题是我使用了相同的图像...谢谢!
    • 在不同的情况下我得到了同样的错误:我的测试模式没有使用CKAsset,它工作正常。然后我简单地将String 类型的属性添加到实体,并尝试使用try container.initializeCloudKitSchema() 重新初始化架构。这产生了错误“没有收到资产的 authToken”,它仍然是我所做的任何事情。我什至在仪表板中重置了开发环境,并删除了该应用程序。还是一样的错误。
    【解决方案2】:

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

    我有一个使用 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 个)几乎没有得到答复或处理,因此不值得努力。

    【讨论】:

    • 我相信我遇到了和你一样的问题。尝试创建公共数据库时看到此错误。但是,我不明白你的解决方案。当您说“将数据库设置为 .public”时在哪里?如果我更改 publicOptions.databaseScope = .public 我会收到以下错误:“用于打开商店的模型配置与用于创建商店的模型配置不兼容。”
    • 您看到的错误可能在这里得到了解答stackoverflow.com/q/8881453/1987726>。有两种方法可以继续:如果您的应用程序已经分发(通过应用商店或 TextFlight),您必须迁移旧的 coreData 模型。如果您仍处于早期开发阶段,您可以简单地从模拟器或设备中删除您的应用程序。那么它应该可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2022-07-26
    • 2017-02-13
    • 1970-01-01
    • 2014-08-06
    • 2017-05-28
    • 2019-01-14
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多