cloudkit错误没有为资产收到authToken

为什么运行下面的代码时会出现这个错误? :

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

我也遇到过这个 这似乎是cloudkit中的一个bug,从我所知道的情况来看,当你试图重新使用“资产创build链”的任何部分时,都会发生这种错误。

换句话说,你有一些初始数据,你从这些数据创build一个图像,你把它写到一个文件,你加载该文件到一个CKAsset ,然后你加载CKAssetCKRecrod 。 在我的实验中,如果您重新使用这些组件中的任何一个,或者它们碰巧是相同的(也就是说,您创build了一个图像,那么您稍后会创build一个新的但相同的图像)会看到这个错误。

例如,以下代码在保存logging时可靠地重新创build“无身份validation令牌”错误。 它所做的只是创build一组资产并将其放入logging中:

 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 中使用 不同的 CKAsset ,也会发生此错误。例如,在第一个资产中使用int secondTempVal = 0xf ,然后在另一个CKAsset使用int secondTempVal = 0xf产生“无授权令牌”错误。

就我而言,我能够强制资产价值始终是一个独特的价值,并彻底解决了这个问题。 就你而言,我build议以下可能的解决方法:

  1. 检查你的资产是否使用相同的图像。 如果是,请尝试稍微修改每个新CKAsset的图像。
  2. 如果您必须重新使用相同的图像,请在设置每个资源后尝试保存logging。 我不知道这是否会解决这个问题,它肯定会增加您的networkingstream量。 但值得一试,看看是否有帮助。
  3. 在这个问题中, 将CKAsset保存到CloudKit中的CKRecord会产生错误:“没有收到资产的authToken” ,OP能够创build最终解决问题的映像文件的单独副本。
  4. 打开一个与苹果的错误。 我没有打扰,因为我已经厌倦了看类似的错误报告多年来没有关注。 但谁知道,你可能会有更好的运气。