CloudKit - exception on CKRecord setObject: forKey:



我试图将iCloud同步添加到我的游戏中,通过将保存数据文件名存储为密钥,并将文件保存在CKAsset中。然而,程序总是崩溃,当它试图setObject: forKey:上的CKRecord,即使我使用一个简单的虚拟字符串代替文件资产。

如果我没有将任何对象分配给CKRecord,则记录成功保存到iCloud,因为我可以在iCloud Dashboard中看到具有正确名称的记录。

抛出异常时,调试器输出中不会记录任何内容。是什么导致了这次崩溃?

bool        iCloudSync::UploadToCloud( SaveDataManager::CloudOperationComplete Callback, void *UserData, std::vector< const char * > *PathsToUpload )
{
    m_UploadCallback = Callback;
    m_UploadCallbackUserData = UserData;
    if (PathsToUpload == NULL) return false;
    // TODO: [[CKContainer defaultContainer] accountStatusWithCompletionHandler] to check if there is a signed-in icloud user
    CKDatabase *db = [[CKContainer defaultContainer] privateCloudDatabase];
    CKRecord *record = [[CKRecord alloc] initWithRecordType:@"SaveDataFiles"];
    for (int i = 0; i < PathsToUpload->size(); i++) {
        NSString *filenameString = [NSString stringWithCString:(*PathsToUpload)[i] encoding:NSASCIIStringEncoding];
        NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
        NSURL *fullPathURL = [documentsURL URLByAppendingPathComponent:filenameString];
        NSError *error = nil;
        bool reachable = [fullPathURL checkResourceIsReachableAndReturnError:&error];
        if (reachable) {
            CKAsset *fileAsset = [[CKAsset alloc] initWithFileURL:fullPathURL];
            // CRASH HERE Trying to assign any value to a key
//          record[filenameString] = fileAsset;
            [record setObject:@"Dummy test string" forKey:filenameString];
        }
    }
    // TODO: completion handler
    // TODO: always overwrite remote
    [db saveRecord:record completionHandler:nil];
//  CKModifyRecordsOperation *modify = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:[NSArray arrayWithObject:record] recordIDsToDelete:nil];
    // Success!
    return true;
}

记录的错误是:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'recordKey (gamestate1.dat) contains invalid characters'

没有记录任何内容的原因是因为在日志记录实际发生之前,我的异常断点被连续触发了几次。我只需要在它记录异常输出之前一直按continue。

所以,我只需要找到一些我可以使用的其他键,不包括点,这是一个令人沮丧的无效字符。

作为参考,有效的字符是第一个字符必须是字母,后面的字符必须是字母数字或下划线。以下是苹果公司的措辞:

键名由一个或多个字母数字字符组成,并以字母开头。如果不使用下划线作为名称中的第一个字符,也可以包含下划线字符。键名中不允许有空格。您的键的名称不能与该类的任何属性的名称相匹配。

最新更新