2017-07-08 51 views
1

當我運行以下代碼時,爲什麼會出現此錯誤? :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") 

回答

3

我也遇到過這個問題。它似乎是cloudkit中的一個bug,並且 - 從我所知道的情況來看 - 當您嘗試重新使用「資產創建鏈」的任何部分時,都會發生這種情況。

換句話說,你有一些初步的數據,從數據創建一個圖像,你把它寫入一個文件,那個文件加載到CKAsset,那麼你加載CKAssetCKRecrod。在我的實驗中,如果您重新使用這些組件中的任何一個......或者它們碰巧是相同的(也就是說,您創建了一個圖像,那麼您稍後會創建一個新的但相同的圖像)會看到這個錯誤。

例如,以下代碼在保存記錄時可靠地重新創建「無驗證令牌」錯誤。它所做的就是創建資產,並把它的陣列到記錄:

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 tempVal = 0xf,然後使用int secondTempVal = 0xf在另一個CKAsset也會產生「無驗證令牌」錯誤。

就我而言,我能夠強制資產價值永遠是一個獨特的價值,並徹底解決了問題。在你的情況下,我建議以下可能的解決方法:

  1. 檢查您的資產是否使用相同的圖像。如果是,請嘗試稍微修改每個新的圖像CKAsset
  2. 如果您必須重新使用相同的圖像,請嘗試在設置每項資產後保存該記錄。我不知道這是否能解決問題,並且肯定會增加您的網絡流量。但值得一試,看看它是否有幫助。
  3. 在這個問題Saving CKAsset to CKRecord in CloudKit produces error: "No authToken received for asset" OP能夠創建最終解決問題的圖像文件的單獨副本。
  4. 與Apple打開一個錯誤。我沒有這麼做,因爲我已經厭倦了看類似的錯誤報告多年來沒有關注。但誰知道,你可能會有更好的運氣。
+0

問題是我使用的是相同的圖像......謝謝! – Shekar